Message posté par : Nicolas Ribot
----------------------------------------
Une premiere approche en se basant sur les points des polygones proches d'un autres
polygone.
On cherche ces points, on construit le buffer a x m de ces points, on fait l'union de
ces buffer, puis l'union de ce buffer avec tous les polygones:
on obtient un polygone avec pas mal de trous.
On vire tous les trous de ce résultat, et on ajoute les trous présents dans les polygones
initiaux.
Pb:
• certaines parties sont comblées: elles ne devraient pas l'être: il faut appliquer
un critere de surface sur les trous qu'on vire.
• ca ne prend pas en compte les routes qui coupent en partie un polygone (mais la requete
peut etre adaptée pour trouver ces points et les combler avec un buffer.
En SQL:
-----------------
Code :
-- la table frtdmp contient le dump du multipolygone à nettoyer sous forme de polygones
simples
create table frtdmp as
select (st_dump(geom)).path[1] as id, (st_dump(geom)).geom
from frt;
-- la table frtpts contient le dump des points des polygones
create table frtpts as
select id as idpg, (st_dumppoints(st_exteriorring(geom))).path as path,
(st_dumppoints(st_exteriorring(geom))).geom
from frtdmp;
-- index et tout...
with holes as ( -- trous des polygones
select st_dumprings(geom) as dmp
from frtdmp
), array_holes as ( -- on regroupe les trous dans un tableau
select array_agg(st_exteriorring((dmp).geom)) as holes
from holes
where (dmp).path[1] > 0
),tmp as ( -- on fait l'union des buffers des points proches des contours
select st_union(st_buffer(geom2, 30)) as geom
from frtpts f cross join lateral (
select f2.id, f2.idpg as idpg2, f2.geom <-> f.geom as dist, f2.geom as
geom2
from frtpts f2
where f.id < f2.id and f.idpg <> f2.idpg
order by f.geom <-> f2.geom
limit 1
) as t
), tmp1 as ( -- on fabrique la liste des polygones initiaux + le polygone issu des buffers
des points
select geom
from tmp
UNION ALL
select geom
from frtdmp
) select st_makePolygon(st_exteriorring(st_union(geom)), holes) -- on refait un polygone
en ajoutant les trous initiaux
from tmp1, array_holes
group by holes;
-----------------
Image du résultat jointe
Nicolas
----------------------------------------
Ce message est accompagné de fichiers, pour les télécharger, suivre le lien ci-dessous.
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=351808#p351808
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