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é ?

#1 Tue 18 May 2021 09:51

Tan85
Participant occasionnel
Date d'inscription: 20 Sep 2019
Messages: 23

Erosion/dilatation avec PostGreSQL

Bonjour,

j'ai deux couches 'bâtiments' pour 2 années différentes : 2016 et 2020.
Je voudrais calculer la consommation foncière entre les deux années en question.
J'ai donc pensé de faire un buffer de 50 mètres autour des bâtiments, regrouper les polygones résultants qui se touchent, faire un buffer négatif de -30 mètres et calculer la surface totale.
Tout ça sous PostgreSQL j'ai essayé comme ça :

- Buffer 50 mètres : (st_makevalid(st_buffer(b."GEOM",50)
- Regrouper les polygones : (st_union (...))
- Diviser les polygones qui ne se touchent pas : (st_subdivide (...))
- Buffer -30 mètres : (st_makevalid(st_buffer(..., -30))

Tout ensemble ça fait ça :

SELECT st_makevalid(st_buffer((st_subdivide(st_union(st_makevalid(st_buffer(b."GEOM",50))))),-30))
FROM edigeo."BATIMENT" b, contour.communes c
where st_intersects(b."GEOM", c.geom);

Mon problème vient de st_subdivide je pense car pour les grosse tâches urbaines, il me les subdivise à leur intérieur.

Quelqu'un peut m'aider ? Merci beaucoup !!!!

Hors ligne

 

#2 Tue 18 May 2021 10:29

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

Re: Erosion/dilatation avec PostGreSQL

Bonjour,

Quel est votre problème ? avez-vous un exemple visuel ?

Pourquoi utilisez-vous subdivide ? c'est fait pour découper un gros polygone en petits morceaux pour des questions de perf.

Nicolas

Hors ligne

 

#3 Tue 18 May 2021 10:39

Tan85
Participant occasionnel
Date d'inscription: 20 Sep 2019
Messages: 23

Re: Erosion/dilatation avec PostGreSQL

Merci pour votre réponse. En effet j'ai utilisé st_subdivide car je voulais séparer les polygones qui ne se touchaient pas entre eux, mais clairement ce n'est pas la bonne solution. Avez-vous un conseil pour faire ça ?

Merci beaucoup


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

Hors ligne

 

#4 Tue 18 May 2021 11:06

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

Re: Erosion/dilatation avec PostGreSQL

Il faut utiliser st_dump(geom) pour extraire les polygones individuels depuis des multipolygones.

Code:

st_makevalid(st_buffer(((st_dump(st_union(st_makevalid(st_buffer(b.geom,50)))))).geom,-30))

Nicolas

Hors ligne

 

#5 Tue 18 May 2021 11:18

JP LLORENS
Participant assidu
Date d'inscription: 12 Nov 2008
Messages: 231

Re: Erosion/dilatation avec PostGreSQL

Bonjour
Si votre objectif est "d'éclater" le (les) multi- polygone issue du st_union  alors il faut utiliser le st_dump :
exemple : st_collectionextract((st_dump(st_union(mes géométries))).geom, 3)::geometry(Polygon,mon srid)

Comme le dit N. Ribot, le st_subdivide est utilisé pour faire des découpes de polygone selon une maille définie pour améliorer les perfs sur des croisements spatiaux avec des couches d'objets ayant des différences de taille importantes (ex croisement parcelles / zonages PLUi).

Cordialement
JP

Désolé, N. Ribot a dégainé avant moi !

Dernière modification par JP LLORENS (Tue 18 May 2021 11:43)

Hors ligne

 

#6 Wed 19 May 2021 13:32

Tan85
Participant occasionnel
Date d'inscription: 20 Sep 2019
Messages: 23

Re: Erosion/dilatation avec PostGreSQL

Merci beaucoup pour vos réponses ! C'est bon maintenant.

Hors ligne

 

Pied de page des forums

Powered by FluxBB