#1 Wed 13 November 2013 11:46
- Thomas Williamson
- Participant actif
- Lieu: Poitiers
- Date d'inscription: 16 Nov 2008
- Messages: 92
Intersection polylignes / polygones...
Bonjour,
Je cherche (en vain) une fonction PostGIS qui me permette de sélectionner des polylignes qui intersectent ou se trouvent à l'extérieur d'un polygone. La fonction st_intersects inclue dans la clause WHERE d'une requête permet de sélectionner les entités qui se trouvent à l'intérieur ou qui croisent le contour d'un polygone. Ce que je cherche à faire est l'inverse, en quelque sorte...
Si quelqu'un a une idée, je suis preneur !
Merci d'avance,
Thomas
Dernière modification par Thomas Williamson (Thu 14 November 2013 12:06)
Hors ligne
#2 Wed 13 November 2013 12:15
- JP LLORENS
- Participant assidu
- Date d'inscription: 12 Nov 2008
- Messages: 231
Re: Intersection polylignes / polygones...
Bonjour
ST_Disjoint complété par une union avec ST_Crosses ?
Cordialement
JPL
Hors ligne
#3 Wed 13 November 2013 12:16
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3941
Re: Intersection polylignes / polygones...
Bonjour,
ST_overlaps et ST_Disjoint devraient, je pense vous aider. Ou tout simplement not st_within qui prendrait alors les entités qui ne sont pas totalement contenues (donc soit chevauchent, soit sont disjoints)
Hors ligne
#4 Wed 13 November 2013 13:30
- Thomas Williamson
- Participant actif
- Lieu: Poitiers
- Date d'inscription: 16 Nov 2008
- Messages: 92
Re: Intersection polylignes / polygones...
J'ai opté pour NOT st_within. Merci beaucoup pour vos avis !
Thomas
Hors ligne
#5 Wed 13 November 2013 18:40
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Intersection polylignes / polygones...
Bonjour,
Pour ces opérations plus "complexes" que les fonctions déjà fournies par l'OGC (intersects, overlaps, touches, etc.), il existe la fonction st_relate permettant de définir très précisément le type de relation spatiale que l'on veut qualifier dans son jeu de données.
Votre exemple est un cas typique ou st_relate peut repondre a la question.
Attention avec not st_within: je ne suis pas sur que l'index spatial soit bien utilisé dans ce cas.
Nicolas
Hors ligne
#6 Thu 14 November 2013 08:12
- Thomas Williamson
- Participant actif
- Lieu: Poitiers
- Date d'inscription: 16 Nov 2008
- Messages: 92
Re: Intersection polylignes / polygones...
Bonjour,
Je ne connaissais pas ST_Relate... Après quelques recherches, je ne vois pas bien comment l'utiliser. Auriez-vous des exemples concrets ou lien vers des pages illustrant l'utilisation de cette fonction ? Sinon, j'ai testé « NOT ST_Within » et cela semble bien fonctionner dans mon cas.
Merci d'avance pour vos conseils au sujet de ST_Relate !
Thomas
Hors ligne
#7 Thu 14 November 2013 10:15
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3941
Re: Intersection polylignes / polygones...
Bonjour,
Je serais aussi curieux de voir comment s'utilise cette fonction, n'ayant rien compris à l'exemple de la doc
Merci d'avance.
Hors ligne
#8 Thu 14 November 2013 11:53
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Intersection polylignes / polygones...
Bonjour,
st_relate permet de décrire précisément les relations spatiales entre deux objets, mais effectivement, ce n'est pas tres simple: il faut se concentrer
Elle s'utilise sous deux formes:
1°) st_relate(geom1, geom2) renvoie une chaine de caractère décrivant les relations entre geom1 et geom2:
select st_relate('POINT (0 0)', 'LINESTRING(0 0, 1 1)');
F0FFFF102
2°) st_relate(geom1, geom2, matrix), ou matrix est une chaine de caractère representant la matrice des informations que l'on veut décrire.
Les éléments clé pour la comprehension sont, d'après moi:
• Savoir que toute geometrie OGC à un intérieur, un extérieur et une frontière, définis mathématiquement. (pour une linestring, par exemple, la frontiere est constituée des start et end points, l'intérieur est constitué de tous les points qui ne sont pas le start et end point et l'exterieur est constitué de tout le reste. Les specs OGC précisent ces définitions pour tous les objets)
• st_relate s'interesse à la dimension des intersections entre ces 3 domaines (d'ou 9 parametres dans la matrice st_relate: 3x3): l'intersection entre une ligne et un point est un point, de dimension 0.
L'intersection entre une ligne et un polygne peut etre une ligne, de dimension 1,
L'intersection de deux surface est un polygone, de dimension 2.
• Les valeurs possibles pour la matrice de comparaison sont donc:
0, 1, 2 (pour exprimer le type d'intersection que l'on veut),
ou T (true), F (false) pour indiquer que l'on veut tester une intersection, peu importe la dimension de l'intersection,
ou * pour indiquer qu'on ne se préoccupe pas de la valeur de cette intersection.
Perso, pour m'en sortir avec cette fonction, je dessine les 9 cases de la matrice et je remplis les cases en fonction de ce que je veux obtenir comme résultat, en fonction des deux géometries que je teste.
Il y a un exemple parlant dans la présentation de Kevin Neufeld, disponible ici: http://2007.foss4g.org/presentations/vi … act_id=117
Si je reprends l'exemple donné plus haut:
select st_relate('POINT (0 0)', 'LINESTRING(0 0, 1 1)'); qui donne comme résulat F0FFFF102
Se lit:
L'intersection de l'interieur du point avec l'interieur de la ligne est l'ensemble vide (F=false= pas d'intersection)
L'intersection de l'intérieur du point avec la frontiere de la ligne est un point (effectivement, le point est situe sur le startpoint de la ligne)
L'intersection de l'intérieur du point avec l'exterieur de la ligne est l'ensemble vide
L'intersection de la frontiere du point avec la ligne est l'ensemble vide, pour l'interieur, l'exterieur et la frontiere de la ligne (les 3 FFF avant le 102)
L'intersection de l'exterieur du point avec l'interieur de la ligne est de dimension 1 = une ligne
L'intersection de l'exterieur du point avec la frontiere de la ligne est de dimension 0: ce sont les start et end points de la ligne
L'intersection de l'exterieur du point avec l'exterieur de la ligne est de dimension 2: une surface
Punaise, je sais pas si je suis plus clair que la doc...
Nicolas
Hors ligne
#9 Thu 14 November 2013 12:07
- Thomas Williamson
- Participant actif
- Lieu: Poitiers
- Date d'inscription: 16 Nov 2008
- Messages: 92
Re: Intersection polylignes / polygones...
Si si c'est clair ! Merci infiniment pour ce post qui resservira sans nul doute à d'autres... Je vais m'y pencher en détail pour tester tout ça et je reviens si nécessaire avec des demandes de précisions.
Merci encore !!
Thomas
Hors ligne
#10 Thu 14 November 2013 12:25
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Intersection polylignes / polygones...
De rien. Ca vaut le coup d'essayer de comprendre cette fonction car elle sert dans les cas complexes, ou l'enchainement des autres fonctions classique ne marche pas bien.
Pour apprendre, la forme st_relate(geom1, geom2) est pratique puisqu'elle renvoie la matrice des relations entre deux geom: on peut alors regarder en détail ce que ca donne.
Une précision concernant le NOT avec les opérateurs spatiaux: si le jeu de données est important, la performance de ce type de requête peut être tres mauvaise.
On peut réécrire ces requêtes en utilisant par exemple le mot clé SQL EXISTS et un utilisant la négation de ce que l'on veut exprimer:
select t1.*
from table1 t1, table2 t2
where not st_within(t1.geom, t2.geom)
peut devenir ainsi:
select t1.*
from table1 t1
where not exists (
select 1 from table2 t2 where st_within(t1.geom, t2.geom);
(Là aussi, EXISTS n'est pas un opérateur facile a comprendre il me semble: un tour vers la doc PG peut aider)
Nicolas
Hors ligne
#11 Thu 14 November 2013 17:07
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3197
- Site web
Re: Intersection polylignes / polygones...
Bonsoir,
Merci Nicolas pour cette explication claire et didactique, c'est beaucoup mieux que l'article wikipedia en anglais !!
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#12 Thu 14 November 2013 17:54
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Intersection polylignes / polygones...
Hors ligne
#13 Fri 15 November 2013 11:32
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3941
Re: Intersection polylignes / polygones...
Bonjour,
Bonsoir,
Merci Nicolas pour cette explication claire et didactique, c'est beaucoup mieux que l'article wikipedia en anglais !!
+1000...
Merci aussi bien pour l'explication de ST_RELATE que pour la fonction EXISTS. Reste plus qu'à les essayer dans des requêtes
Hors ligne
#14 Fri 15 November 2013 16:37
- Fritsch
- Participant occasionnel
- Lieu: Paris
- Date d'inscription: 8 Nov 2006
- Messages: 32
Re: Intersection polylignes / polygones...
On peut réécrire ces requêtes en utilisant par exemple le mot clé SQL EXISTS et un utilisant la négation de ce que l'on veut exprimer:
select t1.*
from table1 t1, table2 t2
where not st_within(t1.geom, t2.geom)
peut devenir ainsi:
select t1.*
from table1 t1
where not exists (
select 1 from table2 t2 where st_within(t1.geom, t2.geom);
Attention, ce n'est pas seulement un problème de performance. La première syntaxe en NOT WITHIN est totalement fausse. Elle n'est équivalente à la seconde que si l'une des deux tables t1 ou t2 ne contient qu'un seul élément. Sinon, encore une fois, le résultat est faux (faites le test avec un COUNT : vous aurez un nombre d'éléments aberrant, plus proche de n1*n2 que de n1 ou n2).
Une condition de jointure avec "NOT" ou avec "!=" est une condition très suspecte.
Pour bien le faire comprendre à mes élèves, je leur construis le diagramme cartésien de la relation.
La bonne solution, dans le cas qui nous occupe ici me semble bien le NOT EXISTS.
Dernière modification par Fritsch (Fri 15 November 2013 16:39)
Hors ligne
#15 Mon 18 November 2013 08:51
- Thomas Williamson
- Participant actif
- Lieu: Poitiers
- Date d'inscription: 16 Nov 2008
- Messages: 92
Re: Intersection polylignes / polygones...
(Là aussi, EXISTS n'est pas un opérateur facile a comprendre il me semble: un tour vers la doc PG peut aider)
Je n'ai pas trouvé EXISTS très compliqué à comprendre (c'est ici).
Merci à Fritsch pour ta remarque, ça apporte un éclairage très intéressant...
Thomas
Hors ligne
#16 Thu 28 November 2013 11:34
- Thomas Williamson
- Participant actif
- Lieu: Poitiers
- Date d'inscription: 16 Nov 2008
- Messages: 92
Re: Intersection polylignes / polygones...
Bonjour,
Le lien donné par Nicolas ne fonctionne pas : http://2007.foss4g.org/presentations/vi … act_id=117...
Sinon, j'ai du mal à comprendre les notions d'intérieur, extérieur et frontière pour un point... Pourrais-tu détailler un peu ce point (sans jeu de mot ; )) ?
Merci !
Thomas
Dernière modification par Thomas Williamson (Thu 28 November 2013 11:35)
Hors ligne
#17 Thu 28 November 2013 18:11
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Intersection polylignes / polygones...
Bonsoir,
L'intérieur d'un point est le point lui-même,
La frontière d'un point est l'ensemble vide
L'extérieur est tout le reste (le plan, sans le point).
Un workshop de Paul Ramsey qui explique st_relate avec de beaux exemples: http://workshops.boundlessgeo.com/postg … de9im.html
Nicolas
Hors ligne