Message posté par : Christophe Vergon
----------------------------------------
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+
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=321968#p321968
Pour y répondre : geobd(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net