2017-03-06 1442 views
2

我试图执行一个简单的查询st_intersects:POSTGIS TopologyException:侧位置冲突

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))'); 

两者的唯一区别是la中的4/4.5 st多边形..

我使用POSTGIS版本2.2.1 我在这里失踪了什么?

回答

0

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

感谢您的答案,但它仍然不能解释为什么第二个多边形相交不会返回任何错误 –

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