我在10.2.0.5 (win64)和11.2.0.3 patch 7 (win32)上得到了以下行为。
我不确定是我的预期错了还是甲骨文的结果错了。
当在line元素周围创建缓冲区并确定缓冲区和线之间的关系时,我希望获得包含(线包含在缓冲区的边界内),但我得到了不相交的结果。
下面是测试代码:
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时,该关系是相等的(正如预期的那样)。当使用缓冲区大小0.027 -0.26时,该关系是不相交的;当使用缓冲区大小>0.26时,该关系是包含。
在我们的数据集中有相当多的行可以发现这种行为。所有这些线路几乎都是南北向的。
我对结果的预期是正确的吗?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发布于 2013-02-04 01:35:02
这可能是sdo_geom.relate返回了错误的结果(结果在MapViewer上看起来都很好,很合理)。
但是,值得注意的是,如果您在容差为0.0001的情况下执行关联确定,则会像您预期的那样返回上述所有情况(0.001到0.028)的CONTAINS。
尽管我没有进一步研究它,但您可能会发现缓冲结果(出于某种原因)在您的容差范围内(出于某种原因),介于0.006和0.026之间。在过去,内置缓冲命令存在一些问题,所以如果它不完全一致,我也不会感到惊讶。
https://stackoverflow.com/questions/11136555
复制相似问题