Calcul de la tâche urbaine

Le calcul de la tâche urbaine est une problématique classique dans le monde de l’urbanisme et dans le monde plus général de la cartographie et de la géomatique. Nous vous proposons ici d’exploiter les nouvelles possibilités offertes par PostGIS à partir de sa version 2.5 (version du code PostGIS 3.0)

Couches utilisées :

  • Bâtiments du cadastre : selon notre MCD Cadastre

  • OrthoHR IGN : pour évaluation de la pertinence du résultat.

Méthode :

  1. Fusion des bâtiments adjacents indexation des grappes.
    Deux bâtiments adjacents sont comptés comme 1.

  2. Buffer sur le résultat, ici 10 mètres, et utilisation de la nouvelle fonction st_orientedenvelope()
    Elle calcule le rectangle englobant le polygone selon son orientation.

  3. Fusion des éléments précédents qui sont adjacents

  4. Nouveau buffer de 10 sur les éléments du 3

  5. Fusion des éléments du 4

Cette méthode permet d’obtenir le nombre d'éléments de l'étape 4 (nbgrappe) et celui de l'étape 2 (nbbat)

 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 WITH p as (SELECT st_collectionextract(unnest(st_clusterintersecting(array_agg(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(array_agg(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(array_agg(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

Astuces comment éliminer les trous dans les polygones obtenus.

1 2 3 4 5 6 7 WITH p as (SELECT row_number as a,unnest((st_dumprings((st_dump (geom)).geom)).path) as b,((st_dumprings((st_dump (geom)).geom)).geom) as c FROM buff_bati_10), -- 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, array_agg(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.