SDO_OVERLAPBDYDISJOINT 和空间索引

问题描述

我正在使用 Oracle 11 g,我需要知道一个特定点是否在具有空间索引的表中的另一个点的缓冲区内,我正在使用以下句子:

'''SELECT A.fieldX 从表A 在哪里 SDO_OVERLAPBDYdisJOINT(sdo_geom.sdo_buffer(A.geometry,2,0.1),SDO_GEOMETRY(2001,NULL),SDO_POINT_TYPE(497644.6,2432725.8,NULL,NULL)) = 'TRUE';'''

我得到以下错误

13226。 00000 - “没有空间索引不支持接口” 原因:几何表没有空间索引。 操作:验证空间运算符中引用的几何表 上面有一个空间索引。

运算符 SDO_OVERLAPBDYdisJOINT 仅使用具有空间索引的表中的几何图形,我知道此错误是由缓冲区运算符引起的,但如果我反转顺序并将 SDO_POINT_TYPE 放在首位,则会出现相同的错误。有没有办法在没有空间索引的情况下使用此运算符或其他类似运算符? 我不想使用 pl sql 因为我需要在 VBA 代码中使用这句话。 非常感谢!!!

解决方法

我认为您的问题是 A.geometry 已编入索引,但其缓冲区未编入索引。
您应该尝试的第一件事是使用
SDO_OVERLAPBDYDISJOINT(A.geometry,buffer(sdo_point(...),2,0.1)) - 而且,在这里使用 SDO_INSIDE 会更正确。
如果这不起作用,您应该检查您的索引是否确实正常。您可以使用表中的特定 id 轻松测试它 - 比如说 10 - 并运行:
select a.id from your_table a,your_table b where a.id=b.id and b.id=10 and sdo_equals(a.geometry,b.geometry)='TRUE'; 如果它返回您的 id(在我的示例中为 10),则您的索引没问题。

,

您本质上想要的是找出彼此相距一定距离内的所有几何图形。通过这种方式可以轻松且更好地完成此操作。它也更有效率。

SELECT A.fieldX 
FROM TABLE A 
WHERE sdo_within_distance(A.geometry,SDO_GEOMETRY(2001,NULL,SDO_POINT_TYPE(497644.6,2432725.8,NULL),NULL)),'distance=2') = 'TRUE';