#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: 1554
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: 1554
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
C'est à dire, pas pris en compte par QGIS ?
Alors là je plaide incompétent
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
Hors ligne
#6 Thu 26 March 2020 15:53
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
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