文章版權由作者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/
1.背景
在多個項目中涉及到互聯網地圖的內網顯示,通過自制工具完成了互聯網地圖的瓦片下載。但是此種方法存在如下幾個問題:
a.瓦片均是離散型圖片,遠程部署非常耗時。
b.瓦片下載中,涉及到將互聯網瓦片下載至內存,然后建立對應文件夾,然后保存至本地的過程,效率不高。
除了以上兩個問題外,還有存儲占用比較多等等缺點。是否有類似於ArcGIS的Bundle型瓦片組織格式來解決存儲占用、遠程部署等已有問題的解決方案?
2.自定義Bundle格式
2.1利用Sqlite進行存儲
2.1.1Sqlite的優點
a. 輕量級
SQLite和C/S模式的數據庫軟件不同,它是進程內的數據庫引擎,因此不存在數據庫的客戶端和服務器。使用SQLite一般只需要帶上它的一個動態庫,就可以享受它的全部功能。
這樣非常便於我們將其作為一個文件來看待。
b. 單一文件
所謂的“單一文件”,就是數據庫中所有的信息(比如表、視圖、觸發器、等)都包含在一個文件內。並且這個文件可以copy到其它目錄或其它機器上,也同樣可以使用。
通過這個單一文件性,我們便可以將本身需要離散存儲的文件進行統一管理了。
c. 跨平台/可移植性
除了主流操作系統,SQLite還支持了很多冷門的操作系統,比如Android、Windows Mobile、Symbin、Palm、VxWorks等的支持。
一次存儲,多點使用。
d.內存數據庫(in-memory database)
目前內存越來越廉價, SQLite的內存數據庫特性就越發顯得好用。SQLite 的API不區分當前操作的數據庫是在內存還是在文件(對於存儲介質是透明的)。所以如果你覺得磁盤I/O有可能成為瓶頸的話,可以考慮切換 為內存方式。切換的時候,操作SQLite的代碼基本不用大改,只要在開始時把文件Load到內存,結束時把內存的數據庫Dump回文件就可以了。
在存儲瓦片時,如果瓦片數據不算多,內存足夠用,可以切換為內存方式,進一步提高瓦片讀取效率。
2.1.2缺點
a.並發訪問的鎖機制
SQLite在並發(包括多進程和多線程)讀寫方面的性能一直不太理想。數據庫可能會被寫操作獨占,從而導致其它讀寫操作阻塞或出錯。
b. SQL標准支持不全
在它的官方網站上,具體列舉了不支持哪些SQL92標准。
2.2 瓦片以MBTiles規范進行組織
MBTiles 是一種地圖瓦片存儲的數據規范,可大大提高海量地圖瓦片的讀取速度,比通過瓦片文件方式的讀取要快很多,適用於Android、IPhone等智能手機的離線地圖存儲。
MBTiles通過視圖,可以重復使用冗余瓦片數據,從而減少瓦片占用的空間,而不是一個單一的、文字表。比如:地圖覆蓋大面積的純藍色像海洋或空的土地,造成成千上萬的重復、冗余的瓦片數據,例如,4/2/8的瓦片在太平洋中間,可能看起來就是一張藍色圖片雖然它可能是一些處於第3級,但在16級可能存在數以百萬計的藍色圖片,他們都完全一樣。
MBTiles通用方法是將瓦片表分成兩張:一個用來存儲原始圖像和一個存儲瓷磚坐標對應那些圖片。具體設計如下:
a.設計map表
對瓦片行列號以及對應的瓦片ID進行存儲。
b.設計images表
對瓦片進行存儲。
c.設計視圖tiles
基於map和images生成。
3.開發瓦片下載和打包存儲工具
3.1瓦片下載工具
瓦片下載工具基於瓦片尋址算法開發,針對不同互聯網地圖,瓦片的行列號算法等稍有不同。尤其是針對百度地圖,其瓦片算法會按照百度的瓦片分級偏移規則進行換算。這里不做累述。
3.2基於MBTiles規范進行存儲
設計思路為:
a.多線程瓦片下載,內存中開辟容器池。
b.當內存容器池滿后,進行整體入庫至sqlite。入庫時進行上鎖,規避Sqlite對多事務支持不理想問題。
4.改造后端進行測試
4.1改造后端
后端按照連接池的思想,支持通過行列號在Sqlite中讀取到瓦片。
4.2前端測試
5.方案優點總結
a.提高瓦片下載存儲速度。經測試,比本地圖片存儲方式效率至少提高一倍。主要由於,一是二進制存儲,無轉換過程。二是減少各層級文件夾建立耗時。
b.減少存儲空間。MBTiles規范可以減少冗余瓦片。
c.便於數據轉移。所有瓦片存儲於一個文件夾中,便於數據轉移部署。
d.提高海量地圖瓦片的讀取速度,比通過瓦片文件方式的讀取要快很多。原因為單個文件不再涉及到目錄尋址,並且也不需要將瓦片讀取為二進制再傳出。
6.待測試
由於sqlite本身對多事務支持不是很良好,大並發訪問瓦片的情景還需測試。下一步准備使用Jmeter進行測試。
7.擴展使用
目前矢量切圖工具,存儲的也均是離散型的PBF。使用MBTiles進行存儲,也能實現便於部署的目的。並且,一個圖層使用一個視圖,這種概念與ArcGIS中的圖層入庫也更為相似。
-----歡迎轉載,但保留版權,請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/
如果您覺得本文確實幫助了您,可以微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^