在spatialite(4.0)中想要按照範圍查找,可以用個RTreeIntersects(point,point)這個函數實作(RTreeIntersects這個函數好像是3.0以後才支援的),在使用這個函數之前必須對要查詢的表建立索引,可以使用:SELECT CreateSpatialIndex('表名', 'Geometry'); 執行這個SQL語句之後,可以發現在SpatialIndex下多了idx_表名_geometry這張表(可以在spatialite_gui工具中檢視和執行sql語句)
接下來就可以使用RTreeIntersects(point,point)這個函數啦,我使用的spatialite_gui1.7.1在裡面執行帶有RTreeIntersects函數時候,總提示沒有這個函數的錯誤,不知道什麼原因。是以可以在指令行或者在代碼中連接配接資料庫執行帶RTreeIntersects的SQL語句。
例如要查詢在表highways中通過點(629530.359,4912376.231)和(638022.743,4907366.679)所形成的矩形範圍内的資料,并将結果以json格式輸出可以執行:
select PK_UID,name,asgeojson(geometry)
from highways
where Rowid
in(
SELECT pkid
FROM idx_highways_Geometry
WHERE pkid
MATCH RTreeIntersects(629530.359,4912376.231,638022.743,4907366.679)
);
其中函數asgeojson(geometry)将結果圖形以geojson的格式表達。
Spatialite中提供的其他豐富的函數來進行空間資料的操作,例如:
selectST_Length(MakeLine(MakePoint(114.17052,22.475837,4326),MakePoint(114.1689,22.4518,4326)),1);
使用ST_Length 計算距離,AsKml(geometry)可以将輸入kml格式,可以參考
http://www.gaia-gis.it/gaia-sins/spatialite-sql-4.0.0.html
spatialite教程可以看:http://www.gaia-gis.it/gaia-sins/spatialite-cookbook/
下面代碼是下一個android工程中連接配接資料庫進行按範圍查找資料的,首先要加spatialite的.so檔案和jar包進入到libs目錄中,如下
之後就可以在就可以加入以下代碼啦:
public class MainActivity extends Activity {
private jsqlite.Database db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//資料庫的路徑
String dbPaht="/mnt/sdcard/ArcGIS/test-2.3.sqlite";
try {
Class.forName("jsqlite.JDBCDriver").newInstance();
db=new jsqlite.Database();
db.open(dbPaht, jsqlite.Constants.SQLITE_OPEN_READONLY);
//查詢在點(629530.359,4912376.231)和點(638022.743,4907366.679)所形成的矩形範圍内的資料,并将結果以json格式輸出
String sql="select PK_UID,name,asgeojson(geometry) from highways where Rowid in(" +
" SELECT pkid " +
" FROM idx_highways_Geometry " +
" WHERE pkid MATCH RTreeIntersects(629530.359,4912376.231,638022.743,4907366.679))";
Log.i("sql", sql);
db.exec(sql, new Callback() {
public void types(String[] arg0) {
}
//傳回的資料
public boolean newrow(String[] arg0) {
Log.i("PK_UID", arg0[0]);
Log.i("name", arg0[1]);
Log.i("json", arg0[2]);
return false;
}
//傳回的列名
public void columns(String[] arg0) {
Log.i("arg0", arg0[0]);
}
});
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
運作結果: