天天看点

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 按范围查找

继续阅读