postgresql POSTGIS TopologyException:边位置冲突

anhgbhbe  于 11个月前  发布在  PostgreSQL
关注(0)|答案(3)|浏览(212)

我尝试执行一个简单的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版,我在这里缺少了什么?

kpbwa7wx

kpbwa7wx1#

我找到了一个解决问题的相关方法。

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

btxsgosb

btxsgosb2#

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

42fyovps

42fyovps3#

我试着用ST_CoveredBy比较一个多边形和一个小多边形的集合。我试着用ST_collect收集我的小多边形,得到了同样的错误。我用st_IsValid验证了它们,转了ST_collect(geom_1,geom_2...) >> ST_Union(),它工作了。

相关问题