地圖制作者面對一個數以百萬計的地圖瓦片殘酷的現實:大多數文件系統和傳輸協議對處理數以百萬計的圖像不是很有效,在磁盤為FAT32格式中,一個文件夾中最多含有65536個文件,HFS最多能列出32,767個文件,EXT3超過20000個文件時會變的很慢。不論是你通過USB還是網絡來復制數以百萬計的瓦片數據是低效并且緩慢的。MBTiles利用SQLite數據庫來存儲,并提供一種規范,使得數以百萬的瓦片數據存儲在一個文件中,而且SQLite數據庫支持多種平臺,所以使用MBTiles在移動設備上瀏覽瓦片數據是比較理想的方式。
簡單介紹下SQLITE
如果你之前使用過SQL數據庫,比如MySQL或PostgreSQL),那么使用SQLite數據庫會覺得很熟悉,您可以運行熟悉的SQL SELECT、INSERT、UPDATE語句,并創建表、索引、視圖。SQLite和其他數據庫之間的區別是:每個SQLite數據庫只包含在一個文件,沒有外部權限系統,數據庫后臺進程,或配置。每個.sqlite文件是一個獨立的數據庫,你可以從電腦復制一個.sqlite文件到移動設備中,它的行、表和索引都可完全使用。
SQLite是很小的并且是無處不在的:iTunes使用它來存儲元數據,firfox使用它來存儲緩存信息,還有一些其他產品(雖然過時了,但仍記憶猶新)
總之,SQLite非常適合作為一個便攜式,單個文件解決方案和用于存儲和網絡地圖服務。
在SQL中使用瓦片坐標
在WEB地圖介紹中我們看到,瓦片是參照了他們的z / x / y 形式坐標,在磁盤存儲上,他們通常存儲在以z、x為名字上的目錄中,這樣就有一個瓦片文件路徑是0/0/0.png,MBTiles提供了這樣一個功能:瓦片表
這張表很容易查詢并回答一個特定的瓦片或問題,例如“在這張地圖中級別為8時有多少張瓦片?”這張表很容易查詢并回答一個特定的瓦片或問題,例如“在這張地圖中級別為8時有多少張瓦片?”這張表很容易查詢并回答一個特定的瓦片或問題,例如“在這張地圖中級別為8時有多少張瓦片?”這張表很容易查詢并回答一個特定的瓦片或問題,例如“在這張地圖中級別為8時有多少張瓦片?”這張表很容易查詢并回答一個特定的瓦片或問題,例如“在這張地圖中級別為8時有多少張瓦片?”這張表很容易查詢并回答一個特定的瓦片或問題,例如“在這張地圖中級別為8時有多少張瓦片?”這張表很容易查詢并回答一個特定的瓦片或問題,例如“在這張地圖中級別為8時有多少張瓦片?”這張表很容易查詢并回答一個特定的瓦片或問題,例如“在這張地圖中級別為8時有多少張瓦片?”
使用視圖引用冗余的圖像
地圖覆蓋大面積的純藍色像海洋或空的土地,造成成千上萬的重復、冗余的瓦片數據,例如,4/2/8的瓦片在太平洋中間,可能看起來就是一張藍色圖片
雖然它可能是一些處于第3級,但在16級可能存在數以百萬計的藍色圖片,他們都完全一樣。
MBTiles通過視圖使用這些冗余瓦片數據可以減少占用的空間,而不是一個單一的、文字表,MBTiles實現者經常把瓦片表分成兩種:一個用來存儲原始圖像和一個存儲瓷磚坐標對應那些圖片:
瓦片的表是這兩個表的視圖,允許成千上萬的瓷磚坐標參考相同的圖像大字段:
使用這種技術,MBTiles可以比普通文件系統存儲更有效率 —有時提高60%或更多
MBTiles 在使用上
MBTiles是一種存儲格式,他常被TileMill來導出或上傳自定義地圖。你可以通過MapBox ios SDK 來使用移動設備上MBTiles離線文件。