首先最好下載spatialite_gui這個工具,不過外國人的網站也奇怪,要下載到exe工具還得在網站上好好找一番。
https://www.gaia-gis.it/fossil/spatialite_gui/index
進入正題
一、空間索引的概念
對於可以用於移動設備,當然也可以用於pc的sqlite擴展,spatialite。
有一個比較重要的概念就是空間索引了。
假設我們建好的表是testTable,主鍵爲testTableId,可以增加圖形列
SELECT AddGeometryColumn('testTable', 'GeometryColum',4326, 'POLYGON', 'XY')
然後我們可以執行
SELECT CreateSpatialIndex('testTable', 'GeometryColum')
就建立了空間索引。 關於這種索引的詳細說明,可以查看官網
http://www.gaia-gis.it/gaia-sins/index.html
以及
http://www.gaia-gis.it/gaia-sins/spatialite-cookbook/html/rtree.html
當然官網很多術語等。看完了專業術語。至於這個叫做Rtree的索引怎麼用。還得自己研究啊。
CreateSpatialIndex語句會創建空間索引表,如果我們用spatialite_gui.exe這個工具就可以打開查詢索引表。
索引表的命名規則是idx_Tablename_GeometryColumnName, 索引表一般放在Spatial Index類下。
打開查看可以看到如下結構。每個表建的索引都是一樣結構。 pkid就是對於數據表的主鍵值。
就是說這個RTree 索引的核心其實是把每個圖形的範圍記錄在了索引表中。 範圍就是後面的4個數字。
二、空間索引的使用
如何使用RTree是一個即簡單又複雜的問題。
1、例子
最簡單的使用如下:
select * from testTable where ST_Within( MakePoint(106.1,25.6,4326) ,GeometryColum) and testTableId
in (select pkid from idx_testTable_GeometryColum where xmin>106.1-0.003 and ymin>25.6-0.003 and xmax<106.1+0.003 and ymax <25.6+0.003)
2、解釋
使用以上sql語句查詢testTable就是一種最基本的對空間索引的使用。
其中:MakePoint是spatialite的函數就是按照x,y,srid(4326是wgs 經緯座標的id).
testTable是表名
GeometryColum是圖形列名
testTableId是測試表主鍵
pkid是索引表主鍵,和testTableId對應的
idx_testTable_GeometryColum是索引表名
xmin>106.1-0.003 and ymin>25.6-0.003 and xmax<106.1+0.003 and ymax <25.6+0.003, 這個條件構造了一個範圍條件,就是以查詢點爲中心長寬0.006的矩形範圍。
以上語句查詢的執行過程其實就是現在按照範圍數字在索引表查到了範圍0.006度內的記錄,然後再將符合的記錄和查詢點(106.1,25.6)進行ST_Within進行空間包含判斷。
最終返回包含該點的記錄。
3、原理
spatialite是首先執行屬性條件過濾然後再進行空間查詢的。也就是說即使該testTable表有大量數據,但是我們根據索引表範圍限制,永遠在指定的範圍內查有限的記錄。
測試一下可以發現,使用了索引速度一般能提高20至100倍的空間圖形查詢速度。測試方法也可以不用編程直接使用spatialite_gui.exe這個工具即可。 沒有關聯idx_testTable_GeometryColum條件就是一般查詢。
三、更加複雜的設計
以上我們只是指定了一個固定的範圍就是0.003*2度,但是實際上這個範圍沒有什麼科學性。
實際使用中怎麼辦呢。個人認爲有兩種辦法。
1、一種是針對自己數據可以使用的最大索引範圍
就是select max(xmax-xmin) from idx_testTable_GeometryColum
select max(ymax-ymin) from idx_testTable_GeometryColum
得到自己用的表的記錄中最大範圍作爲索引查詢的範圍
2、是針對自己使用的數據的最優範圍
確定最優範圍的根本問題就是即保障執行效率,又保障數據準確。
簡單來說最小的查詢範圍速度最快,但是範圍越小。可能查到的數據被過濾掉很多。有可能查不到或者查不全。
目前來看如果要最優的使用索引,第一要分析數據,第二還要結合編程實現。