您可以通过以下两种方式之一执行此操作。首先,正如您所提到的,SDO_WITHIN_DISTANCE是一种有效的方法。
select
*
from center_point a
inner join target_points b
on a.id = 1
and sdo_within_distance( b.shape, a.shape, 'distance = 10' ) = 'TRUE'
;
在这种情况下,距离采用由 a 的空间参考定义的线性单位。Oracle 将坐标视为笛卡尔坐标,因此您需要确保在使用此运算符之前拥有一个线性坐标系(与角度纬度/经度单位相反)。由于您使用的是北/东,我认为只要您要比较的点在同一个空间参考中,您就可以了。
这种方法使用内部循环来解决查询,如果您有很多要比较的点,那么效率不是很高。此外,Oracle Spatial 对 SDO 函数中的操作数顺序非常挑剔,因此您可能需要使用参数顺序来找到最佳位置。如果您的查询运行了很长时间,请尝试切换 sdo 运算符的第一个和第二个参数。您还可以使用/*+ ORDERED */
后缀 after来处理 'from' 和 'inner join' 表的顺序SELECT
。
另一种方法是缓冲几何图形并与缓冲区进行比较。
select
*
from center_point a
inner join target_points b
on a.id = 1
and sdo_relate( b.shape, sdo_buffer(a.shape, 0.05 ), 'mask=anyinteract' ) = 'TRUE'
;
请记住,如果您将 SDO_RELATE(称为窗口)的第二个参数(称为窗口)中的任何内容进行转换,就像我们在这里使用缓冲区一样进行转换。
如果您打算对多个点执行此操作,建议构建一个缓冲所有源点的表。然后针对缓冲区域创建一个空间索引,并将其与您的目标点进行比较。
例如:
create table point_bufs unrecoverable as
select sdo_buffer (a.shape, b.diminfo, 1.35)
from centerpoint a, user_sdo_geom_metadata b
where table_name='CENTERPOINT'
and column_name='SHAPE';
select
a.gif,
b.gid
from target_points a,
point_bufs b
where sdo_relate(a.shape, b.shape, 'mask=anyinteract querytype=join') = 'TRUE'
;
注意:当点与多边形相交时,您总是希望多边形位于 sdo_relate 的窗口位置(这是第二个参数)。这将确保您的空间索引被正确使用。