POSTGIS拓扑异常:边缘位置冲突。

7

我想执行一个简单的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))');

出现以下错误信息并导致控制台崩溃:

Error: 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个回答

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


1
谢谢你!你为我节省了很多搜索的时间! - Genotypek
这应该被标记为已接受的答案,以便它浮动到顶部。 - tarikki

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

谢谢您的回答,但它仍然没有解释为什么第二个多边形相交不会返回任何错误。 - Eden Katabi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接