POSTGIS TopologyException:侧面位置冲突

问题描述 投票:0回答:3

我正在尝试执行一个简单的 st_intersects 查询:

select st_intersects('MULTIPOLYGON(((1 5,4 8,7 5,4 2,1 5)),((5 5,8 8,11 5,8 2,5 5)))','POLYGON((3 4.5,3 5,4 5,4 4,3 4.5))');

这会破坏控制台并返回以下错误:

错误:GEOSIntersects:TopologyException:侧面位置冲突位于:6 4

这完全奇怪,因为以下查询有效:

select st_intersects('MULTIPOLYGON(((1 5,4 8,7 5,4 2,1 5)),((5 5,8 8,11 5,8 2,5 5)))','POLYGON((3 4,3 5,4 5,4 4,3 4))');

两者之间的唯一区别是最后一个多边形中的 4 / 4.5..

我使用POSTGIS版本2.2.1 我在这里缺少什么?

sql postgresql polygon postgis intersect
3个回答
14
投票

我找到了解决我问题的相关解决方案。

select st_intersects(st_buffer('MULTIPOLYGON(((1 5,4 8,7 5,4 2,1 5)),((5 5,8 8,11 5,8 2,5 5)))',0),'POLYGON((3 4.5,3 5,4 5,4 4,3 4.5))');

当我添加

st_buffer
时,它将多重多边形的两个多边形合并为一个并解决了问题。


6
投票

您可以检查查询中的 MultiPolygon 几何图形是否不是有效的 MultiPolygon:

=> select st_isvalid(
    st_geomfromtext(
        'MULTIPOLYGON(((1 5,4 8,7 5,4 2,1 5)),((5 5,8 8,11 5,8 2,5 5)))'
));
NOTICE:  Self-intersection at or near point 6 6
 st_isvalid
------------
 f
(1 row)

其原因是定义“孔”(内环)的多边形

(5 5,8 8,11 5,8 2,5 5)
与外环
(1 5,4 8,7 5,4 2,1 5)
相交。

要么需要手动修复输入,要么可以使用

ST_MakeValid
来完成这项工作(它会自动检测并处理重叠部分):

=> select st_intersects(
    st_makevalid(
        'MULTIPOLYGON(((1 5,4 8,7 5,4 2,1 5)),((5 5,8 8,11 5,8 2,5 5)))'
    ),
    'POLYGON((3 4.5,3 5,4 5,4 4,3 4.5))'
);
 st_intersects 
---------------
 t
(1 row)

0
投票

我尝试将多边形和小多边形集合与 ST_CoveredBy 进行比较。我尝试用

ST_collect
收集小多边形,但得到了同样的错误。 我用
st_IsValid
验证了它们,然后转动
ST_collect(geom_1,geom_2...) >> ST_Union()
,它成功了。

© www.soinside.com 2019 - 2024. All rights reserved.