我在 10.2.0.5 (win64) 和 11.2.0.3 补丁 7 (win32) 上得到以下行为。
我不确定我的期望是错误的还是甲骨文的结果。
在围绕线元素创建缓冲区并确定缓冲区与线之间的关系时,我希望得到 CONTAINS(该线包含在缓冲区的边界内),但我得到了 DISJOINT。
这是测试代码:
declare
l_geo1 mdsys.sdo_geometry;
l_geo2 mdsys.sdo_geometry;
l_relate varchar2(100);
begin
-- Create the line
l_geo1 := mdsys.sdo_geometry(2002
,90112
,null
,mdsys.sdo_elem_info_array(1, 2, 1)
,mdsys.sdo_ordinate_array(153972.952, 473287.52, 153972.839, 473281.531));
-- Create the buffer using 0.020 meters = 20mm
l_geo2 := sdo_geom.sdo_buffer(l_geo1, 0.020, 0.0005);
-- Determine the relation
l_relate := sdo_geom.relate(l_geo2, 'determine', l_geo1, 0.0005);
dbms_output.put_line(l_relate);
end;
当使用缓冲区大小 0 时,关系为 EQUAL(如预期的那样)。当使用缓冲区大小 0.01-0.26 时,关系是 DISJOINT 当使用缓冲区大小 > 0.027 时,关系是 CONTAINS。
这种行为在我们数据集中的很多行中都可以找到。所有这些线路几乎都是南北走向。
我对结果的期望是否正确?sdo_geom.relate 函数是否返回错误的结果?
谢谢,雷内。
编辑:为不同的缓冲区大小添加了一个循环:
0 EQUAL
.001 CONTAINS
.002 CONTAINS
.003 CONTAINS
.004 CONTAINS
.005 CONTAINS
.006 DISJOINT
.007 DISJOINT
.008 DISJOINT
.009 DISJOINT
.01 DISJOINT
.011 DISJOINT
.012 DISJOINT
.013 DISJOINT
.014 DISJOINT
.015 DISJOINT
.016 DISJOINT
.017 DISJOINT
.018 DISJOINT
.019 DISJOINT
.02 DISJOINT
.021 DISJOINT
.022 DISJOINT
.023 DISJOINT
.024 DISJOINT
.025 DISJOINT
.026 DISJOINT
.027 CONTAINS
.028 CONTAINS