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 25 March 2020 16:31

MathieuGodard
Participant occasionnel
Date d'inscription: 28 Mar 2018
Messages: 30

St_difference et géométries multiparties

Bonjour,

Je travaille sur QGIS 3.4.
J'ai deux polygones : le polygone ZONE1 est inclus dans le polygone ZONE2.
Je cherche à montrer les endroits où la ZONE1 sort de la ZONE2.
J'utilise donc la fonction ST_Difference qui fonctionne bien, mais qui ne retourne qu'une seule entité alors que la ZONE1 dépasse à deux endroits.
Comment éviter le multipartie et générer une couche avec deux entités : une entité par dépassement ?

Merci !

Code:

select 
a.NOM AS ZONE1, 
b.NOM AS ZONE2, 
ST_Difference(a.geometry, b.geometry) as GEOM,
ST_GeometryType((st_difference(a.geometry, b.geometry)))

FROM ZONE2 b 
LEFT JOIN ZONE1 a ON ST_Intersects(a.geometry, b.geometry)

Edit : le st_geometrytype m'informe que c'est un multipolygon, alors que je ne veux que des polygones. J'ai peur que ce ne soit pas possible sur QGIS... st_dump ?

Dernière modification par MathieuGodard (Wed 25 March 2020 16:38)

Hors ligne

 

#2 Wed 25 March 2020 17:06

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

Re: St_difference et géométries multiparties

Bonjour,

Oui, utilisez st_dump pour extraire les différentes parties du résultat. (st_difference(a, b) doit retourner un seul objet géometrique, donc parfois un multipolygone, seul objet pouvant représenter le résultat de l'opération)

Nicolas

Hors ligne

 

#3 Wed 25 March 2020 18:11

MathieuGodard
Participant occasionnel
Date d'inscription: 28 Mar 2018
Messages: 30

Re: St_difference et géométries multiparties

Bonjour,

Malheureusement, j'ai l'impression que st_dump n'est pas prit en compte par QGIS...
Si pas d'autre solution je m'en accommoderai !

Merci !

Hors ligne

 

#4 Thu 26 March 2020 11:06

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

Re: St_difference et géométries multiparties

Bonjour,

C'est à dire, pas pris en compte par QGIS ?

Attention, st_dump(geom) renvoie un objet de type geometry_dump (https://postgis.net/docs/manual-2.5/geometry_dump.html), pas geometry.

geometry_dump est un type composite comportant un tableau d'entiers path (numéro du polygone dans le multipolygone) et une géométrie geom représentant le polygone (pour un dump de multipolygone)

Pour acceder aux valeurs, il faut mettre des parenthèses autour de st_dump:

Code:

select (st_dump(geom)).path[1] as id_polygon, (st_dump(geom)).geom as geom 
...

Nicolas

Hors ligne

 

#5 Thu 26 March 2020 13:10

MathieuGodard
Participant occasionnel
Date d'inscription: 28 Mar 2018
Messages: 30

Re: St_difference et géométries multiparties

Nicolas Ribot a écrit:

C'est à dire, pas pris en compte par QGIS ?


Alors là je plaide incompétent big_smile
Je travaille sur le gestionnaire de base de données de QGIS. Je n'utilise pas Postgis en base de données mais directement à partir des shapes.
Je vais plancher sur la manière d'utiliser st_dump. J'pense que j'ai du travail de compréhension avant tout big_smile

Hors ligne

 

#6 Thu 26 March 2020 15:53

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

Re: St_difference et géométries multiparties

Bonjour,

Postgis est une extension à Postgresql. Donc postgis s'utilise forcément dans le contexte d'une base de données PG, sur laquelle l'extension est installée.
Dans le gestionnaire de BD, vous etes bien connecté a un BD postgis, ou c'en est une autre (spatialite, geoPackage, ...) ?

Pouvez-vous décrire un peu plus votre contexte ? les shapes sont chargés dans qgis, ou bien convertis et stockés dans postgis avec le Gestionnaire BD ?

st_dump s'utilise dans une requête SQL pour générer une ligne (une géométrie et un path) par objet contenu dans une collection (multipoint, multiline, etc.)

Par ex: (multipoint en exemple, mais ca marche pareil avec les autres types de collections)

Code:

with tmp as (
    select 'MULTIPOINT((0 0), (1 1), (2 2))'::geometry as geom
) select (st_dump(geom)).path[1] as idpoint, st_astext((st_dump(geom)).geom)
from tmp;

idpoint    st_astext
1        POINT(0 0)
2        POINT(1 1)
3        POINT(2 2)

Le multipoint est "dumpé" en ces 3 points constitutifs (3 lignes de résultat)

Nicolas

Hors ligne

 

Pied de page des forums

Powered by FluxBB