2017-03-06 8 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))'); 

唯一の違いは、4/4.5 in the la

POSTGISバージョン2.2.1を使用しています ここでは何が欠けていますか?あなたは、クエリ内のMultiPolygonのジオメトリが有効なMultiPolygonのないことを確認することができ

答えて

0

=> 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)

手動で入力を修正する必要がどちらかだろう、または1つの仕事をするために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

答えに感謝しますが、2番目のポリゴンが交差してもエラーが返されない理由はまだ説明されていません –

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

私はそれが一つにマルチポリゴンの2つのポリゴンをマージst_bufferを追加し、問題を解決しました。