Message posté par : GEOFFROY DETRY
----------------------------------------
Bonjour,
Je dispose d’une table de polygone [z_pop] dans une BD PostGIS. Les géométries des
polygones peuvent contenir des artefacts sous forme de microlignes dues à des erreurs de
numérisation ou de groupement.
Je cherche à identifier les polygones présentant ces erreurs, en récupérant l’identifiant
[agr_id] du polygone et, si possible, la géométrie de la microligne concernée ou des
vertex constitutifs. L'identification suffit. Je ne cherche pas à solutionner les
problèmes topologiques qui feront l’objet d’une révision manuelle.
Vous trouverez un jeu de données test [z_pop] postgis en attaché, avec 3 polygones
présentant des artefacts. Cette table peut être restaurée dans le schéma Public
Voici les traitements que j'ai réalisé pour l'instant.
1. Générer une sortie qui présente les vertex via [ST_DumpPoints] se trouvant complétement
inclus dans leur polygone d’appartenance
-----------------
Code :
WITH cte_1 as ( SELECT agr_id, (ST_DumpPoints(geom)).geom AS pt FROM z_pop),
geom_envelop AS ( SELECT agr_id as id_pol, geom AS geom_ext FROM z_pop)
SELECT row_number() over w as gid, pt FROM geom_envelop JOIN cte_1
ON ST_WITHIN (geom_ext, pt)
WINDOW w AS (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-----------------
Cette méthode ne marche pas car il faudrait récupérer les polygones sans les microlignes.
Or, un simple dump sur les polygones ne renvoie qu'une seule géométrie [Polygone] et
ne permet pas d'identifier les vertex totalement compris dans l’aire d’intérêt.
2. J'ai réalisé la méthodologie suivante
-----------------
Code :
--1. Explosion des polygones en tronçons
WITH geom_transf AS (
SELECT agr_id, ST_MakeLine(lag((pt).geom, 1, NULL) OVER (PARTITION BY agr_id ORDER BY
agr_id, (pt).path), (pt).geom) AS geom_line
FROM (SELECT agr_id, ST_DumpPoints(geom) AS pt FROM z_pop) as dumps
),
--2. Génération de l’enveloppe externe des polygones
geom_envelop AS (
SELECT agr_id as id_pol, ST_EXTERIORRING((st_dump(z_pop.geom)).geom) AS geom_ext FROM
z_pop
)
-- 3. Croisement du résultat de 1) et du résultat de 2) afin d’individualiser les lignes
qui ne s’intersectent pas avec l’enveloppe extérieure.
SELECT row_number() over w as gid, geom_line as geom_line_erreur
FROM geom_envelop JOIN geom_transf ON NOT st_intersects(geom_ext, geom_line) AND
agr_id=id_pol
WINDOW w AS (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-----------------
Certaines lignes, mais pas toutes, sont identifiées. Le résultat est donc assez moyen.
En suivant cette voie, il faudrait réaliser un [ST_EXTERIORRING] puis une opération de
reconstitution des polygones [ST_Polygonize] mais je crains un traitement trop lourd
(environ 65.000 polygones dans le jeu de données)
Quelqu’un aurait-il une méthode plus efficace et moins couteuse ou aurait déjà réalisé un
traitement similaire ?
Merci d'avance
----------------------------------------
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=357915#p357915
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