#1 Fri 05 January 2018 09:56
- 3cafes
- Participant occasionnel
- Date d'inscription: 6 Feb 2008
- Messages: 22
POSTGIS découpage de polygones superposés
Bonjour,
Je dispose d'une table contenant des polygones qui parfois se superposent. Il pourrait y avoir plus de deux polygones empilés.
Je souhaiterais à partir de cette couche, créer une autre couche contenant des polygones "élémentaires" issus de découpages des polygones entre eux. Mon explication n'étant pas très précise, j'ai joint une image de ce que je souhaite obtenir.
En fait, via Qgis, et Grass j'arrive à obtenir ce que je souhaite, avec des doublons, mais on peut les supprimer aisément. J'ai cherché sur internet pour voir s'il était possible de le faire via postgis mais pour l'instant je n'ai rien trouvé. Du coup je vous soumets mon problème.
Merci d'avance pour vos réponses.
Hors ligne
#2 Fri 05 January 2018 10:04
Re: POSTGIS découpage de polygones superposés
Bonjour,
Regardez du côté de la fonction ST_Intersection(). Cette dernière devrait vous donner le résultat attendu.
https://postgis.net/docs/ST_Intersection.html
Freelance traitements ETL FME certifié: www.sitdi-france.fr Twitter : @sitdifrance
Site perso ~ www.partir-en-vtt.com
Hors ligne
#3 Fri 05 January 2018 10:15
- 3cafes
- Participant occasionnel
- Date d'inscription: 6 Feb 2008
- Messages: 22
Re: POSTGIS découpage de polygones superposés
Merci Loic_GR,
Mais la fonction ST_intersection, est très efficace lorsqu'il n'y a que deux polygones qui se superposent. Au delà, je n'ai pas réussi à arriver à mes objectifs.
Hors ligne
#4 Fri 05 January 2018 10:27
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3199
- Site web
Re: POSTGIS découpage de polygones superposés
Bonjour,
Effectivement st_intersection mais avec quelques clauses WHERE.
St_intersection() uniquement quand st_intersects(a,b) renvoie vrai. et st_intersects(a,b) renvoie vrai si a && b.
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#5 Fri 05 January 2018 10:35
- 3cafes
- Participant occasionnel
- Date d'inscription: 6 Feb 2008
- Messages: 22
Re: POSTGIS découpage de polygones superposés
Bonjour ChristopheV,
Le problème c'est que ST_intersection même avec des clause WHERE, ne va prendre en entrée que deux polygones. Dans mon cas, il y a trois polygones qui se superposent. Du coup lorsque je lancerai une requête avec ST_intersection, je vais obtenir, l'intersection (A,B), puis (A,C), puis (B,C) ce qui ne me permettra pas d'obtenir les polygones élémentaires 5 et 2. ni d'ailleurs les 1, 7, 3, 1 mais ceux ci pourraient être déterminés autrement.
Hors ligne
#6 Fri 05 January 2018 10:38
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3199
- Site web
Re: POSTGIS découpage de polygones superposés
Bonjour,
Oui mais : intersection(intersection(a,b),c) = intersection (a,b,c).
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#7 Fri 05 January 2018 10:43
- 3cafes
- Participant occasionnel
- Date d'inscription: 6 Feb 2008
- Messages: 22
Re: POSTGIS découpage de polygones superposés
En effet, ça marche dans la mesure où l'on sait combien de polygones seront superposés. En outre, tous les polygones se trouvent dans la même table.
Hors ligne
#8 Fri 05 January 2018 11:16
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: POSTGIS découpage de polygones superposés
Bonjour,
Perso, pour ce genre d'explosion totale, je me sers de st_polygonize et st_union sur les lignes (qui node les lignes):
Code:
with tmp as ( SELECT st_union(st_boundary(geom)) as geom FROM testpg ), tmp1 as ( SELECT st_dump(st_polygonize(geom)) as dmp FROM tmp ) select (dmp).path[1] as id, (dmp).geom from tmp1;
Ca explose vite et bien, sauf pour les gros datasets, a traiter par parties.
Ensuite, des requetes spatiales de contenance, de distance, de % d'intersection permettent de retrouver les liens vers les objets initiaux (complètement perdus avec st_polygonize).
Nico
Hors ligne
#9 Fri 05 January 2018 11:37
- 3cafes
- Participant occasionnel
- Date d'inscription: 6 Feb 2008
- Messages: 22
Re: POSTGIS découpage de polygones superposés
Merci beaucoup Nicolas Ribot,
C'est exactement ce que je recherchais depuis un petit moment.
C'est parfait.
Hors ligne
#10 Fri 05 January 2018 14:57
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: POSTGIS découpage de polygones superposés
Une petite précision concerant st_polygonize vs st_buildArea:
st_polygonize() reconstruit tous les polygones possibles depuis des lignes qui s'intersectent.
st_buildArea() reconstruit toutes les surfaces possibles (au sens topologique): si 2 polygones se touchent, ils sont fusionnés par st_buildArea()
Et puis, pour répondre vraiment à la démande, même si je me doute que ce n'est pas ce que vous aviez en tête, une requête pour "exploser" les polygones, c'est à dire les décaler vers l'exterieur du centre de la scène:
Code:
WITH tmp AS ( SELECT st_union(st_boundary(geom)) AS geom FROM testpg ), tmp1 AS ( SELECT st_dump(st_polygonize(geom)) AS dmp FROM tmp ), tmp2 AS ( SELECT (dmp).path [1] AS id, (dmp).geom FROM tmp1 ), tmp3 AS ( SELECT st_centroid(st_extent(geom) :: GEOMETRY) AS geom_center FROM tmp2 ) SELECT t2.id, st_translate( geom, ((1.2 * st_X(st_centroid(geom))) - (st_x(geom_center) * (1.2 - 1))) - st_x(st_centroid(t2.geom)), ((1.2 * st_Y(st_centroid(geom))) - (st_Y(geom_center) * (1.2 - 1))) - st_y(st_centroid(t2.geom)) ) FROM tmp2 t2, tmp3 t3;
Nicolas
Hors ligne