POSTGIS TopologyException:边位置冲突

时间:2017-03-06 13:45:04

标签: sql postgresql polygon postgis intersect

我正在尝试执行一个简单的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:side location conflict at: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版 我在这里失踪了什么?

2 个答案:

答案 0 :(得分:1)

您可以检查查询中的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)

答案 1 :(得分:1)

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

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时,它将多边形的两个多边形合并为一个并解决了问题。