我有一个这样的数据表:
CREATE TABLE devices (id INTEGER PRIMARY KEY NOT NULL, shape SDE.ST_GEOMETRY)
对于给定的GPS位置(纬度,经度),我想查询50米内的所有物体。如何实现?
我在搜索许多文档时非常沮丧,直到现在都没有结果。
一个想法是在Eris(开发ArcGis的公司)网站上使用该功能:
sde.st_distance (g1 sde.st_geometry, g2 sde.st_geometry)
然而,返回值被描述为"双精度",如何使用GPS? 许多其他功能(例如Oracle内置函数)与我认为的不同类型(SDO_GEOMETRY)一起工作。 http://webhelp.esri.com/arcgisserver/9.3/java/index.htm#geodatabases/st_distance.htm
另一个想法是创建一个ArcGis形状对象(sde.st_geometry),一个半径为50米的圆形对象,并使用sde.st_contains函数(http://webhelp.esri.com/arcgisserver/9.3/java/index.htm#geodatabases/st_contains.htm)。但是,如何创建这样的几何对象?
示例中的所有地理对象创建SQL(INSERT ...)在我的Oracle数据库上失败,并且在调用' ST_POINT'时出现错误信息"错误的数量或类型的参数。
我认为这应该是大多数基于GPS的应用程序的基本要求。 对不起这个烂摊子......
编辑: 我找到了处理地理数据的oracle函数,但不确定它是否适用于SDE.ST_GEOMETRY对象? http://docs.oracle.com/cd/B12037_01/appdev.101/b10826/sdo_complex_queries.htm#sthref2131
答案 0 :(得分:0)
假设您可以使用SDO_GEOMETRY数据类型将device.shape数据放入表中,那么使用空间运算符SDO_WITHIN_DISTANCE应该可以解决问题。以下查询选择经度和纬度坐标为50米范围内的所有设备-71.3033,44.2706。
select * from devices
where sdo_within_distance (devices.shape, sdo_geometry(2001,4326,
sdo_point_type(-71.3033,44.2706,null),null,null),
'distance=50 unit=meter') = 'TRUE'