陳俊明
(1.福建省基礎地理信息中心,福建 福州 350003)
Spatialite在移動端離線數據解決方案中的應用研究
陳俊明1
(1.福建省基礎地理信息中心,福建 福州 350003)

簡要分析了移動終端數據調用的主要方式,尤其是離線數據的調用格式,重點介紹了Spatialite空間數據庫原理,探討了其應用于離線空間數據查詢分析的可行性,最后根據實際業務需求,實現了基于Spatialite空間數據庫的離線數據查詢分析與管理。
Spatialite;移動GIS;離線數據
目前,移動客戶端加載空間數據有在線和離線2種調用方式。在線的數據調用方式實質是訪問已發布的各種地圖服務,不僅可以實現基本的地圖瀏覽操作與屬性查詢功能,還能滿足用戶對空間分析與幾何運算的功能需求,但也存在一定的局限性:第一,用戶并不一定始終處于有網絡的環境中;第二,復雜的空間分析與幾何運算需要頻繁地與服務器進行交互,數據吞吐量大,對網絡帶寬要求高。因此,在無法保證網絡環境與網絡帶寬的情況下,離線數據調用方式在實際應用中的需求是較為普遍的。
離線地圖數據存儲格式主要有4種:json文本、Shapefile、Spatialite以及地圖緩存(*.bundle/*.tpk)[1],均可較好地支持對離線數據的加載與瀏覽。但是,json文本需要預先加載在線服務下載獲取;Shapefile數據獲取方便,但其本身并不提供對離線數據的查詢分析接口,且文件類型太多,不利于數據的統一管理;地圖緩存(*.Bundle/*.tpk)則因數據量太大,拷貝或攜帶都相對不方便,同樣不支持對數據的查詢與分析。作為開源的輕量級空間數據庫,Spatialite支持SQL語句對幾何類型字段的操作,因此,本研究結合實際項目需求,在了解和掌握Spatialite空間數據庫原理的基礎上,探索研究在移動客戶端實現離線數據查詢分析的技術可行性。
2.1 Spatialite數據庫簡介
Spatialite空間數據庫是一個簡單、實用的輕量級空間數據庫,支持跨平臺空間數據操作[2]。按照OGC標準存取空間數據,支持以ESRI Shapefile、dbf、txt/ csv文本以及*.xls表格等作為數據源,不僅支持對一般屬性表的查詢操作,而且提供了豐富的SQL擴展函數,用以支持SQL語句操作幾何類型字段,包括各種空間查詢與分析操作。李玲等將Spatialite空間數據庫嵌入GPS/PDA的GIS外業土地調查系統中,實現了空間數據與屬性數據的集中管理[3]。同時,作為一個開源類庫,它也提供了豐富的跨平臺二次開發接口,用戶可在此基礎上進行深層次的GIS應用開發。其主要依賴于GNU iconv、Geos、PROJ.4以及FreeXL等開源類庫,其中,Geos與PROJ.4提供了操作幾何對象以及坐標重投影的函數接口。唐群等利用開源數據庫Spatialite的空間分析功能和AutoCAD的二次開發語言ObjectARX.Net對dwg格式的宗地數據進行處理,并實現入庫管理[4]。
2.2 Spatialite空間數據庫管理
為了高效地管理、查詢與分析矢量空間數據,Spatialite采用了元數據與空間索引機制。Spatialite空間數據庫以*.sqlite/*.db格式的單文件形式存在,易于攜帶或拷貝,適用于不同的操作系統或平臺環境。入庫后的矢量數據表現為一般的屬性表,通過Geometry字段來統一管理空間數據,而數據的基本描述信息則存儲于Spatialite空間元數據表中(geometry_columns表、spatial_ref_sys表[3]),包括空間數據的表名、空間字段名、空間實體的幾何類型、坐標維數以及坐標參考信息等。
Spatialite空間數據庫提供了豐富的SQL擴展函數,以支持SQL語句操作幾何類型字段,實現對離線空間數據的查詢與分析操作,包括Buffer、Intersect、Union等。為了加快數據庫的訪問速度,Spatialite通過R-tree索引機制來提高空間查詢與空間分析的速度[3]。R-tree是一種空間索引數據結構,是B-tree向多維空間發展的另一種形式,它將空間對象按范圍劃分,每個節點都對應一個區域和一個磁盤頁,葉節點的磁盤頁中存儲其區域范圍內所有空間對象的外接矩形[5]。Spatialite矢量數據的R-tree索引實質上就是該圖層內所有幾何對象的分層MBR索引,建立R-tree索引時,每個節點包含一個矩形區域的索引碼,該矩形區域由對應節點所有子節點的最小外接矩形(MBR)嵌套組成[3]。Spatialite提供了2種方式:①采用SQL語句建立索引;②采用擴展SQL函數Create SpatialIndex創建索引。為了保證空間索引與數據庫的一致性,在完成對空間數據庫Insert/Update/Delete等操作后,需要及時同步更新R-tree索引。
本研究在了解掌握Spatialite空間數據庫原理的基礎上,根據實際應用中調用離線數據的具體業務需求,尤其是離線數據的查詢與分析,基于Spatialite空間數據庫,統一管理移動客戶端的離線矢量數據,以XCode4.6.1為開發平臺,采用Objective-c開發語言重構Spatialite API,并搭建業務邏輯層框架,實現對離線數據瀏覽、查詢分析等,具體技術流程如圖1。
3.1 Spatialite空間數據庫建庫管理

圖 1 技術流程圖
Spatialite空間數據庫支持*.shp、*.xls、*.txt、*.dbf、*.csv等格式的表格文件作為數據源,創建或導入后的數據以table形式存在。Spatialite提供2種方式用以操作數據庫,包括可視化界面操作(Spatialite GUI)與命令行方式。
1)Spatialite GUI是一款具有可視化界面的Spatialite數據庫管理工具,主要是通過SQLite DBMS引擎,能夠支持幾何字段操作的擴展SQL函數、虛擬shape、虛擬文本、虛擬網絡以及R-tree和Mbrcache來組織和管理空間數據[6]。通過Spatialite GUI可以創建一個后綴名為sqlite或db的Spatialite數據庫文件,并通過“Load Shapefile”或“Virual Shapefile”導入shape矢量數據。操作過程中需要注意編碼類型的選擇,錯誤的編碼類型易導致中文字段亂碼,同時還要保證SRID對應的空間參考系統與矢量圖層一致,其空間數據存儲在Geometry字段中,最后需要對入庫后的空間數據建立R-tree索引。
2)命令行的操作流程主要包括3個步驟:①利用spatialite_init(0)初始化數據庫;②sqlite3_open()函數可以打開或創建數據庫,對于指定的數據庫路徑,若存在,則直接打開,否則創建并打開數據庫;③利用sqlite3_exec()執行SQL語句,完成對表的各種操作[7]。
Spatialite空間數據庫不僅支持對非空間數據表的創建、查詢、刪除、更新等操作,同時,還提供了豐富的SQL擴展函數,用以支持對空間數據表的空間查詢與空間分析。幾何對象的空間查詢主要有2種方式:①查詢2個幾何對象的真實空間位置關系;②查詢2個幾何對象的最小外接矩形的空間位置關系,即近似空間位置關系。
由于第2種方式的查詢結果無法代表幾何對象之間的真實空間關系,因此,本研究采用第1種方式。可構造SQL語句:“select * from table name where intersects(geom1 Geometry,geom2 Geometry)”,完成對空間數據的空間查詢與分析,其中intersects為擴展的SQL函數,可利用sqlite3_prepare()執行上述語句,并將查詢到的結果保存到sqlite3_stmt對象中。最后,利用sqlite3_step(stmt)命令可依次取出結果集中的每條記錄,以供進一步的顯示分析操作。
3.2 Spatialite API重構與應用開發
本研究以XCode4.6.1為開發平臺,采用Objective-c開發語言,集成GNU iconv、Geos、PROJ.4以及FreeXL等開源類庫,對Spatialite API進行重構、重編譯,并在此基礎上,根據實際業務功能需求,進行二次API設計與封裝,包括查詢分析、圖層管理與配置(包括字段)以及系統管理等API接口與數據對象(圖2)。最后利用二次封裝的API接口,設計并實現了綜合查詢、POI查詢、圖層管理(包括書簽、字段以及Shapefile的管理與配置)、地圖標繪以及系統管理等,并重點解決了離線矢量數據的查詢與分析,實現了在IPAD端對離線矢量數據的點擊查詢(Identify)與緩沖區分析以及結果展示,如圖3、圖4。

圖2 業務邏輯框架接口

圖3 綜合查詢
本文簡要介紹了當前移動客戶端調用空間數據的2種主要方式,并在了解掌握Spatialite空間數據庫原理的基礎上,提出了基于Spatialite解決移動客戶端無法對離線地圖數據進行查詢分析操作的局限性。主要介紹了Spatialite GUI與命令行2種方式統一管理離線矢量數據,并基于原生的Spatialite API,進行重構、重編譯,生成靜態庫,根據實際項目中的功能需求,基于該靜態庫進行二次API接口設計與封裝,搭建數據業務邏輯層框架,實現了地圖瀏覽、書簽管理、地圖標繪、快速定位、地圖管理、綜合查詢以及空間查詢等功能,解決了在移動客戶端無法對離線矢量數據進行空間查詢與空間分析操作的局限性。下一步的研究重點是進一步優化離線矢量數據的繪制與查詢分析效率。

圖4 空間查詢分析
[1] 百度文庫.ArcGIS移動客戶端離線底圖的幾種解決方案[EB/ OL].http:// wenku.baidu.com /view/b265102eed630b1c59 eeb594.html,2014-05-16
[2] Wikipedia. SpatiaLite [EB/OL].http://en.wikipedia.org/wiki/ SpatiaLite,2014-05-18
[3] 李玲,王慶,王慧青.基于Spatialite輕量級空間數據庫的GIS數據管理[J].地理信息世界, 2010,8(4):71-75
[4] 唐群,韋源生,勞景寮.利用Spatialite數據庫處理宗地數據及GIS入庫實現[J].桂林理工大學學報,2013,33(1):90-94
[5] 百度文庫.R-tree [EB/OL].http://baike.baidu.com/view/5086047.htm?fr=aladdin, 2014-05-18
[6] OSGeo-Live.SpatiaLite快速入門 [EB/OL].http://live.osgeo.org/zh/quickstart/spatialite_ quickstart.html,2014-05-20
[7] GDAL.SQLite/Spatialite RDBMS [EB/OL].http://www.gdal.org/drv_sqlite.html,2014-05-20
P208
B
1672-4623(2015)02-0068-03
10.3969/j.issn.1672-4623.2015.02.025
陳俊明,碩士,研究方向為空間數據庫管理。
2014-09-18。
項目來源:福建省科技廳產學研資助項目(2012Y4001);福建省測繪地理信息局局校合作資助項目(2013S17);福建省測繪地理信息局2013~2014年科技基金資助項目。