#1 Tue 04 June 2019 15:41
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3195
- Site web
Tâche urbaine nouvelle approche avec postgis 2.5
Bonjour,
Je vais détailler sur ce fil, comment à partir du couple PG10 et Postgis 2.5 et de la couche bâtiment du cadastre disponible sur data.gouv.fr et intégrée avec notre outil (cf. forum données), créer une tâche urbaine un peu plus jolie et paramétrable que la méthode dite des tampons. Ça doit marcher aussi avec la couche bâtiment fournie par data.gouv.fr (non testé je vous laisse adapter).
Première requête :
Code:
WITH p as (SELECT batiment.*,ST_OrientedEnvelope(st_buffer(the_geom,10)) as obox_geom FROM cadastre.batiment), p1 as (SELECT st_buffer((st_dump(st_union(st_clusterintersecting(st_accum(obox_geom))))).geom,10) as geom FROM p ), p2 as (SELECT (st_dump(st_union(st_clusterintersecting(st_accum(geom))))).geom as resgeom FROM p1 ) SELECT row_number() over() , resgeom INTO testgeom3 FROM p2
Détails :
Code:
st_buffer(the_geom,10)
Classique un buffer de 10 mètres autour de la géométrie du bâtiment.
Code:
ST_OrientedEnvelope()
Nouvelle fonction postgis 2.5 qui fournit la BBox orientée de la géométrie
Code:
(st_dump(st_union(st_clusterintersecting(st_accum(obox_geom))))).geom
Création de multipolygons constitués des BBox orientées des bâtiments qui se touchent (st_clusterintersecting()) puis fragmentation en polygons élémentaires (st_dump()).geom
Application d'un buffer de 10 mètres sur les polygones résultants
Répétition du process sur les géométries résultantes.
Exercice : Utilises la fonction recherche du forum et trouve comment compter le nombre de bâtiments originaux qui sont compris dans un polygones final, but du jeu éliminer les bâtis isolés.
Requête numéro 2 qui permet d'éliminer les trous d'une certaine surface.
Code:
WITH p as (SELECT row_number as a,unnest((st_dumprings((st_dump (resgeom)).geom)).path) as b,((st_dumprings((st_dump (resgeom)).geom)).geom) as c FROM testgeom3 ), -- On transforme les multipolygones à trous en n polygones sans trous si path = 0 exterior ring si >0 trous p1 as (SELECT a,b,st_exteriorring(c) as e,st_area(c) as d FROM p order by a,b), -- on transforme les polygones ext en polyline p2 as (SELECT a, st_accum(e) as sg FROM p1 WHERE b<>0 AND d >=1000 GROUP BY a), les trous de plus de 1000 m² p3 as (SELECT a, e FROM p1 WHERE b=0) les enveloppes ext (shells) SELECT p2.a,CASE WHEN not sg is null THEN st_makepolygon(e,sg) ELSE st_makepolygon(e) END into testpoly1 FROM p3 LEFT JOIN p2 ON p2.a=p3.a ORDER BY a -- On reconstitue les polygones soit avec les trous qui restent soit sans.
Voilà
A+
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#2 Thu 06 June 2019 16:51
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3195
- Site web
Re: Tâche urbaine nouvelle approche avec postgis 2.5
Bonjour,
Une variante qui permet de compter le nombre de bâtiments (2 bâtiments adjacent comptés comme 1) dans une grappe.
1) Fusion des bâtiments adjacents
2) Buffer 10 + BBox orientée
3) Fusion des éléments précédents adjacents
4) buffer 10
5) Fusion des éléments adjacent du 4
Résultat : nombre d'éléments du 4, nombre d'éléments du 2
Code:
WITH p as (SELECT st_collectionextract(unnest(st_clusterintersecting(st_accum(the_geom))),3) as geom FROM cadastre.batiment ), t as (SELECT row_number() OVER() as id, geom FROM p), t1 as (SELECT id,((st_dump(geom)).geom) as geom FROM t), t2 as (SELECT id,count(id),st_orientedenvelope(st_buffer(st_union(st_makevalid(geom)),10)) as geom FROM t1 GROUP BY id), t3 as (SELECT st_collectionextract(unnest(st_clusterintersecting(st_accum(geom))),3) as geom FROM t2), t4 as (SELECT row_number() over() as id, geom FROM t3), t5 as (SELECT id,((st_dump(geom)).geom) as geom FROM t4), t6 as (SELECT id,count(id) as nbbat,st_union(geom) as geom FROM t5 GROUP BY id), t7 as (SELECT st_collectionextract(unnest(st_clusterintersecting(st_accum(st_buffer(geom,10)))),3) as geom FROM t6), t8 as (SELECT row_number() over() as id2,geom FROM t7), t9 as (SELECT id2,(st_dump(geom)).geom as geom FROM t8), tt as (SELECT id2,t9.geom,nbbat FROM t6,t9 WHERE st_within(t6.geom,t9.geom)), t10 as (SELECT id2,count(id2) as nbgrappe,sum(nbbat) as nbbat, st_union(geom) as geom FROM tt GROUP BY id2) SELECT * into buff_bati_10 FROM t10
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#3 Fri 07 June 2019 09:22
- Renaud
- Membre
- Lieu: Ploemeur (56)
- Date d'inscription: 9 Mar 2006
- Messages: 2315
Re: Tâche urbaine nouvelle approche avec postgis 2.5
Merci Christophe
Renaud Mouche
Hors ligne
#4 Fri 07 June 2019 10:43
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3195
- Site web
Re: Tâche urbaine nouvelle approche avec postgis 2.5
De rien Renaud
J'ai constaté que l'on peut faire varier la géométrie de l'enveloppe en fonction de l'ordre dans lequel on exécute les dilatation.
Version 1 : buffer sur bâti 10 m puis enveloppe orientée puis jonction puis buffer
Version 2 : jonction bâti puis buffer 10 m puis enveloppe puis buffer
...
A adapter selon les besoins.
Pour répondre à Marc Leobet : La tâche urbaine ci-définie à pour but l'estimation des changements cadastraux depuis la rénovation d'une commune sur les section rénovées par voie de mise à jour. Et ce pour une volumétrie de futur CCTP. Comme quoi une méthode peut s'appliquer à plusieurs définitions.
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#5 Tue 11 June 2019 11:08
- Sylvain M.
- Participant assidu
- Lieu: Saint-Pierre-des-Nids (53)
- Date d'inscription: 8 Sep 2005
- Messages: 995
Re: Tâche urbaine nouvelle approche avec postgis 2.5
Merci Christophe pour ce partage !
J'ai hâte de tester cette méthode sur mon territoire, mais ce ne sera pas dans les semaines à venir étant occupé par d'autres tâches (pas la tache urbaine ;-) ).
D'ici là, si jamais tu as quelques captures d'écran des résultats pour illustrer tes requêtes, ce serait très intéressant.
A+
Sylvain M.
Hors ligne
#6 Tue 11 June 2019 11:29
- yartostout
- Participant assidu
- Lieu: Bretagne
- Date d'inscription: 24 Jun 2015
- Messages: 173
Re: Tâche urbaine nouvelle approche avec postgis 2.5
Merci pour le partage !
J'ai privilégié la méthode classique par tampons pour notre suivi du SCoT sur notre territoire mais il faudrait que je teste ta méthode qui semble être plus efficace d'après tes dirs !
Hors ligne
#7 Tue 11 June 2019 12:04
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3195
- Site web
Re: Tâche urbaine nouvelle approche avec postgis 2.5
Bonjour,
@yartostout : c'est pas plus efficace, mais plus proche de la réalité à mon sens. En comparant le résultat à une ortho HR on constate cela.
@Sylvain : capture16 : méthode 1 (tampon sur bâti puis enveloppe puis tampon)
capture 17 : joindre bâti adjacent + buffer + enveloppe
capture 18 (message suivant) la méthode 1 avec bâti original.
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#8 Tue 11 June 2019 12:04
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3195
- Site web
Re: Tâche urbaine nouvelle approche avec postgis 2.5
suite
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#9 Tue 11 June 2019 12:04
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3195
- Site web
Re: Tâche urbaine nouvelle approche avec postgis 2.5
et fin
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#10 Tue 11 June 2019 12:11
- Sylvain M.
- Participant assidu
- Lieu: Saint-Pierre-des-Nids (53)
- Date d'inscription: 8 Sep 2005
- Messages: 995
Re: Tâche urbaine nouvelle approche avec postgis 2.5
Merci ChristopheV pour les captures !
Sylvain M.
Hors ligne
#11 Fri 19 March 2021 12:53
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3195
- Site web
Re: Tâche urbaine nouvelle approche avec postgis 2.5
Bonjour,
Suite à un changement avec Postgis 3.0
https://www.postgis.us/presentations/Po … S.html#/14
Il faut remplacer la fonction st_accum() par array_agg()
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne