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