淺談利用SQLite存儲離散瓦片的思路和實現方法


文章版權由作者李曉暉和博客園共有,若轉載請於明顯處標明出處: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/

                                                                           如果您覺得本文確實幫助了您,可以微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^

                                      

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM