SDO_OVERLAPBDYDISJOINT 和空间索引有问题

Trouble with SDO_OVERLAPBDYDISJOINT and spatial index

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

'''SELECT A.fieldX 来自 TABLE 在哪里 SDO_OVERLAPBDYDISJOINT(sdo_geom.sdo_buffer(A.geometry,2,0.1),SDO_GEOMETRY(2001,NULL ,SDO_POINT_TYPE(497644.6,2432725.8,NULL),NULL,NULL)) = 'TRUE';'''

我得到以下错误:

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

运算符 SDO_OVERLAPBDYDISJOINT 仅使用来自 table 的具有空间索引的几何图形,我知道此错误是由缓冲区运算符引起的,但如果我颠倒顺序并首先放置 SDO_POINT_TYPE,我也有同样的错误。有没有办法在没有空间索引的情况下使用此运算符或其他类似运算符? 我不想使用 pl sql 因为我需要在 VBA 代码中使用该句子。 非常感谢!!!

我认为您的问题是 A.geometry 已编入索引,但其缓冲区未编入索引。
您应该尝试的第一件事是使用
SDO_OVERLAPBDYDISJOINT(A.geometry, buffer(sdo_point(...),2,0.1)) - 而且,在这里使用 SDO_INSIDE 会更正确。
如果这不起作用,您应该检查您的索引是否确实可以。您可以使用 table 中的特定 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'; 如果它 returns 你的 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,NULL)),'distance=2') = 'TRUE';