【问题标题】:Trouble with SDO_OVERLAPBDYDISJOINT and spatial indexSDO_OVERLAPBDYDISJOINT 和空间索引的问题
【发布时间】:2021-01-31 04:13:27
【问题描述】:

我正在使用 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,NULL)) = 'TRUE';'''

我得到以下错误:

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

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

【问题讨论】:

    标签: vba oracle-spatial


    【解决方案1】:

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

    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';
    

    【讨论】:

    • 嗨 Albert,我会试试这个,谢谢。
    【解决方案2】:

    我认为您的问题是 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),那么您的索引就可以了。

    【讨论】:

    • 感谢 Gregg,并且等于缓冲区 sdo_point(...) 未编入索引,再次感谢。干杯!!!
    猜你喜欢
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    • 2013-04-07
    相关资源
    最近更新 更多