0

我在 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
4

1 回答 1

0

可能是 sdo_geom.relate 返回了错误的结果(结果在 MapViewer 上看起来都很好且合理)。

但是,值得注意的是,如果您以 0.0001 的容差执行相关 DETERMINE,它会如您预期的那样返回所有上述情况(0.001 到 0.028)的 CONTAINS。

尽管我没有进一步研究,但您可能会发现缓冲结果(出于某种原因)在 0.006 和 0.026 之间的容差范围内。过去,内置缓冲命令存在一些问题,所以如果它不完全一致,我也不会感到惊讶。

于 2013-02-03T17:35:01.923 回答