2017-03-06 68 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它的多面的兩個多邊形合併成一個,並解決了問題。