Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#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: 3805

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: 1536

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: 3805

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 roll
Merci d'avance.

Hors ligne

 

#8 Thu 14 November 2013 11:53

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1536

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 wink

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... hmm
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: 1536

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: 3169
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: 1536

Re: Intersection polylignes / polygones...

wink

Hors ligne

 

#13 Fri 15 November 2013 11:32

SANTANNA
Moderateur
Lieu: Angers
Date d'inscription: 18 Jan 2008
Messages: 3805

Re: Intersection polylignes / polygones...

Bonjour,

ChristopheV a écrit:

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 big_smile

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

Nicolas Ribot a écrit:

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

Nicolas Ribot a écrit:

(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: 1536

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

 

Pied de page des forums

Powered by FluxBB