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


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#2 Fri 05 January 2018 10:04

Loic_GR
Moderateur
Lieu: Besancon
Date d'inscription: 12 May 2011
Messages: 1017
Site web

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

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


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

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

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;

wink

Nicolas


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

Pied de page des forums

Powered by FluxBB