我在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函数是否返回错误的结果?
谢谢,Rene。
编辑:为不同的缓冲区大小添加了一个循环:
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
答案 0 :(得分:0)
可能是sdo_geom.relate返回了错误的结果(结果在MapViewer上看起来都很好而且合理)。
但是,值得注意的是,如果您执行相关的DETERMINE并且容差为0.0001,则会根据您的预期返回上述所有情况(0.001到0.028)的CONTAINS。
虽然我没有进一步研究,但您可能会发现缓冲结果(由于某种原因)在0.006和0.026之间的公差范围内。过去内置缓冲命令存在一些问题,因此如果它不完全一致,我也不会感到惊讶。