在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();
}
}
}
运行结果: