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 Mon 20 July 2015 17:33

Razorbak
Participant assidu
Lieu: Clermont Ferrand
Date d'inscription: 7 Oct 2007
Messages: 505

[PostGreSQL 9.3/PostGIs 2] Découpage d'une couche par une autre

Bonjour,

Je cherche à créer une vue correspondant à un ensemble de polygones contenus sur une zone prédéfinie.
En gros, j'ai une couche A qui correspond à un territoire d'étude (sous forme de polygone) et une autre couche B composée de plusieurs polygones.
J'aimerai récupérer les polygones de la couche B découpés selon les limites de la couche A.
Normalement, au final, je dois récupérer l'ensemble de mon territoire de la couche A recouvert par des morceaux de polygones de la couche B.

J'imagine que c'est une requête assez basique mais je n'ai pas du utiliser les bons mots clés dans la recherche pour trouver...
Merci et bonne journée

Hors ligne

 

#2 Mon 20 July 2015 21:49

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9855
Site web

Re: [PostGreSQL 9.3/PostGIs 2] Découpage d'une couche par une autre

Bonsoir,

Chercher st_intersection et st_intersect.

Quelque chose comme : SELECT st_intersects(a.the_geom,b.the_geom) FROM a, b WHERE st_intersection(a.the_geom, b.thegeom);

Y.


Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !!  - GeoRezo vous aide ? Aidez GeoRezo !

Hors ligne

 

#3 Tue 21 July 2015 08:41

Nicolas Granier
Participant assidu
Date d'inscription: 19 Apr 2007
Messages: 271

Re: [PostGreSQL 9.3/PostGIs 2] Découpage d'une couche par une autre

Bonjour,

Quelque chose comme : SELECT st_intersects(a.the_geom,b.the_geom) FROM a, b WHERE st_intersection(a.the_geom, b.thegeom);


ne serait pas plutôt l'inverse...wink

Code:

SELECT st_intersection(a.the_geom,b.the_geom) FROM a, b WHERE st_intersects(a.the_geom, b.thegeom)

Hors ligne

 

#4 Tue 21 July 2015 08:55

Razorbak
Participant assidu
Lieu: Clermont Ferrand
Date d'inscription: 7 Oct 2007
Messages: 505

Re: [PostGreSQL 9.3/PostGIs 2] Découpage d'une couche par une autre

Salut,

Merci à tous les 2 : la 2e requête est effectivement la bonne.
Bonne journée

Hors ligne

 

#5 Tue 21 July 2015 09:58

Martin Bocquet
Participant occasionnel
Date d'inscription: 4 Mar 2015
Messages: 22

Re: [PostGreSQL 9.3/PostGIs 2] Découpage d'une couche par une autre

Bonjour,

De manière générale, mieux vaut utiliser l'opérateur normalisé JOIN que WHERE pour faire des jointures.
Ca donnerait donc :

Code:

SELECT st_intersection(a.the_geom,b.the_geom) 
FROM a
JOIN b 
ON st_intersects(a.the_geom, b.thegeom)

Hors ligne

 

#6 Tue 21 July 2015 10:09

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9855
Site web

Re: [PostGreSQL 9.3/PostGIs 2] Découpage d'une couche par une autre

Martin,

Peux tu m'expliquer pourquoi est ce mieux ? Pour des performances ou pour une meilleur lecture ?

Merci,

Y.


Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !!  - GeoRezo vous aide ? Aidez GeoRezo !

Hors ligne

 

#7 Tue 21 July 2015 10:51

Martin Bocquet
Participant occasionnel
Date d'inscription: 4 Mar 2015
Messages: 22

Re: [PostGreSQL 9.3/PostGIs 2] Découpage d'une couche par une autre

Bonjour,

Les performances sont exactement les mêmes sur les deux requêtes. Cependant, lors de requêtes multiples, les clauses JOIN explicites permettent d'orienter les requêtes :

http://docs.postgresql.fr/9.1/explicit-joins.html

La jointure avec WHERE est aujourd'hui dépréciée (https://msdn.microsoft.com/en-us/librar … 00%29.aspx), et on conseille d'utiliser le JOIN pour :
- des raisons de lisibilité, notamment lors des jointures multiples
- pour éviter de confondre le WHERE « traditionnel » qui filtre les données et le WHERE de jointure

Bonne journée,

Hors ligne

 

#8 Tue 21 July 2015 11:02

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9855
Site web

Re: [PostGreSQL 9.3/PostGIs 2] Découpage d'une couche par une autre

Bonjour,

Alors je suis d'accord smile mais j'ai du mal à perdre ma mauvaise habitude.

Y.


Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !!  - GeoRezo vous aide ? Aidez GeoRezo !

Hors ligne

 

#9 Tue 21 July 2015 11:38

JF BEHM
Participant actif
Lieu: toulouse
Date d'inscription: 9 Aug 2013
Messages: 126
Site web

Re: [PostGreSQL 9.3/PostGIs 2] Découpage d'une couche par une autre

Martin Bocquet a écrit:

Bonjour,

Les performances sont exactement les mêmes sur les deux requêtes. Cependant, lors de requêtes multiples, les clauses JOIN explicites permettent d'orienter les requêtes :

http://docs.postgresql.fr/9.1/explicit-joins.html

La jointure avec WHERE est aujourd'hui dépréciée (https://msdn.microsoft.com/en-us/librar … 00%29.aspx), et on conseille d'utiliser le JOIN pour :
- des raisons de lisibilité, notamment lors des jointures multiples
- pour éviter de confondre le WHERE « traditionnel » qui filtre les données et le WHERE de jointure

Bonne journée,


Bonjour,
j'ai du mal à voir la simplicité dans les JOIN par rapport au WHERE quand il y a 4 ou 5 jointures à faire.

Je pense que JOIN est intéressant pour récupérer tous les enregistrements d'une table et les enregistrements de l'autre table correspondants au critère de jointure (LEFT JOIN ou RIGHT JOIN).
Cordialement,


Jean-François Behm, formateur SIG, jf.behm@texte-a-enlever.idgeo.fr, formations@texte-a-enlever.idgeo.fr
IDGEO, www.idgeo.fr
Institut de Développement de la Géomatique  42, avenue de Général de Croutte - 31100 toulouse

Hors ligne

 

#10 Tue 21 July 2015 14:08

Martin Bocquet
Participant occasionnel
Date d'inscription: 4 Mar 2015
Messages: 22

Re: [PostGreSQL 9.3/PostGIs 2] Découpage d'une couche par une autre

Bonjour,

Voici pour exemple deux codes différents, qui renvoient la même chose.
Sur le deuxième, on fait mieux la différence entre les tables jointes, les critères de jointure et les critères de tri.

Code:

SELECT *
FROM a, b, c, d
WHERE st_intersects(a.the_geom, b.thegeom) 
AND  st_intersects(a.the_geom, c.thegeom) 
 AND st_intersects(a.the_geom, d.thegeom)  
AND a.id > 10
 AND b.idcom = '59350'

Code:

SELECT *
FROM a
JOIN b 
    ON st_intersects(a.the_geom, b.thegeom)
JOIN c
    ON st_intersects(a.the_geom, c.thegeom)
JOIN d 
    ON st_intersects(a.the_geom, d.thegeom)
WHERE a.id > 10 AND b.idcom = '59350'

Après, il s'agit d'un gout personnel, mais aussi d'une anticipation : aujourd'hui la syntaxe avec WHERE est dépréciée, c'est à dire marche encore, mais est non conseillée. A l'avenir, cette syntaxe pourrait être supprimée.

Dernière modification par Martin Bocquet (Tue 21 July 2015 14:12)

Hors ligne

 

#11 Tue 21 July 2015 15:01

JF BEHM
Participant actif
Lieu: toulouse
Date d'inscription: 9 Aug 2013
Messages: 126
Site web

Re: [PostGreSQL 9.3/PostGIs 2] Découpage d'une couche par une autre

C'est effectivement une affaire de goût et d'habitude de travail.
Mais si la tendance est à la mise à l'écart de la syntaxe WHERE pour les jointures, il faut effectivement changer ses habitudes !
Cependant, comment fera-t-on pour les critères de sélection si la syntaxe WHERE disparaît ?


Jean-François Behm, formateur SIG, jf.behm@texte-a-enlever.idgeo.fr, formations@texte-a-enlever.idgeo.fr
IDGEO, www.idgeo.fr
Institut de Développement de la Géomatique  42, avenue de Général de Croutte - 31100 toulouse

Hors ligne

 

#12 Tue 21 July 2015 15:45

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9855
Site web

Re: [PostGreSQL 9.3/PostGIs 2] Découpage d'une couche par une autre

Bonjour,

Ce qui a été dit c'est que la syntaxe WHERE pour les jointures est dépréciée. Les filtres passeront toujours via cette syntaxe.

Y.


Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !!  - GeoRezo vous aide ? Aidez GeoRezo !

Hors ligne

 

#13 Wed 22 July 2015 14:51

MathieuB
Membre du bureau
Lieu: Montpellier
Date d'inscription: 18 Jan 2006
Messages: 1222
Site web

Re: [PostGreSQL 9.3/PostGIs 2] Découpage d'une couche par une autre

Bonjour,

pour ma part, je privilégie l’expression des critères de jointure avec JOIN pour bien les distinguer des critères de sélection dans le WHERE.

Je trouve cela plus lisible et plus logique : on créée son pool de tuples dans les jointures, puis on filtre les lignes qui répondent au critères exprimés dans le WHERE.

Les recommandations de syntaxe ont souvent une cause valable ;-)

Dernière modification par MathieuB (Wed 22 July 2015 14:55)


Mathieu BOSSAERT
Association GeoRezo

Hors ligne

 

Pied de page des forums

Powered by FluxBB