【发布时间】:2017-08-21 09:31:34
【问题描述】:
我正在尝试实现一个函数,该函数返回我的表中包含特定半径(距离)内的多边形(描述区域)的所有条目。我找到了函数SDO_GEOM.SDO_WITHIN_DISTANCE 并阅读了this post。
由于这是一种理论方法,我没有实际数据 - 而且我不是母语人士,我完全不确定这个函数是否能够做到这一点。
【问题讨论】:
标签: oracle spatial oracle-spatial
我正在尝试实现一个函数,该函数返回我的表中包含特定半径(距离)内的多边形(描述区域)的所有条目。我找到了函数SDO_GEOM.SDO_WITHIN_DISTANCE 并阅读了this post。
由于这是一种理论方法,我没有实际数据 - 而且我不是母语人士,我完全不确定这个函数是否能够做到这一点。
【问题讨论】:
标签: oracle spatial oracle-spatial
首先,您需要使用 SDO_WITHIN_DISTANCE 运算符,而不是 SDO_GEOM.WITHIN_DISTANCE 函数。第一个将使用多边形表上的空间索引执行搜索。第二个不会(所以会很慢)。
然后 SDO_WITHIN_DISTANCE 可能是也可能不是您需要的,这取决于您定义“在半径内”的方式。如果您的意思是多边形的最近 border 必须在半径内,那么 SDO_WITHIN_DISTANCE 就是您所需要的。
假设您有一个表 AREAS (ID, GEOMETRY) 和一个表 LOCATIONS (ID, GEOMETRY),并且您想查找点 42 10 公里内的所有区域:
select a.id
from areas a, locations l
where l.id=42
and sdo_within_distance (a.geometry, l.geometry, 'distance=10 unit=km') = 'TRUE';
另一方面,如果要查找完全包含在半径范围内的多边形,则需要构建一个 10 公里的缓冲区,并将其用作搜索区域以找到匹配的多边形:
select a.id
from areas a, locations l
where l.id=42
and sdo_inside (
a.geometry,
sdo_geom.sdo_buffer (
l.geometry,
10,
0.05,
'unit=km'
)
) = 'TRUE';
【讨论】:
可以在WHERE 子句中使用SDO_GEOM.SDO_WITHIN_DISTANCE 来执行您想要的操作 - 即根据行与原始形状的距离来限制行。
【讨论】: