2017-03-06 3 views
2

Je suis en train d'exécuter simple ST_Intersects requête:POSTGIS TopologyException: emplacement latéral conflit

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

qui écrasent la console et renvoie l'erreur suivante:

Error: GEOSIntersects: TopologyException: side location conflict at: 6 4

Ce qui est tout à fait étrange parce que la fonctionne requête suivante:

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 seule différence entre les deux est le 4/4,5 dans la la st polygon ..

J'utilise POSTGIS version 2.2.1 Que manque-t-il ici?

Répondre

0

vous pouvez vérifier que la géométrie MultiPolygon dans votre requête n'est pas un MultiPolygon valide:

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

la raison est que la Polygon (5 5,8 8,11 5,8 2,5 5) définissant le « trou » (bague intérieure) coupe la bague extérieure (1 5,4 8,7 5,4 2,1 5) .

Il serait soit nécessaire de fixer l'entrée manuellement, ou on peut utiliser ST_MakeValid pour faire le travail (il détecte automatiquement et gère les parties qui se chevauchent):

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

Merci pour la réponse mais cela n'explique toujours pas pourquoi le deuxième polygone ne se retourne pas –

1

je trouve une solution pertinente à mon problème .

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

Quand j'ajouté le st_buffer il fusionnera les deux polygones du multipolygone à un seul et résolu la question.