天天看點

Spatialite 按範圍查找

在spatialite(4.0)中想要按照範圍查找,可以用個RTreeIntersects(point,point)這個函數實作(RTreeIntersects這個函數好像是3.0以後才支援的),在使用這個函數之前必須對要查詢的表建立索引,可以使用:SELECT CreateSpatialIndex('表名', 'Geometry'); 執行這個SQL語句之後,可以發現在SpatialIndex下多了idx_表名_geometry這張表(可以在spatialite_gui工具中檢視和執行sql語句)

Spatialite 按範圍查找

  接下來就可以使用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目錄中,如下

Spatialite 按範圍查找

之後就可以在就可以加入以下代碼啦:

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();
			}
	}

}
           

運作結果:

Spatialite 按範圍查找

繼續閱讀