Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

#1 Tue 24 January 2023 19:40

Geo
Membre
Lieu: Liège (Belgique)
Date d'inscription: 18 Sep 2007
Messages: 26

[PostGIS] - Identification microlignes dans polygones

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. Je joins également une image du problème.

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

Dernière modification par Geo (Wed 25 January 2023 08:39)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#2 Wed 25 January 2023 16:48

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1119

Re: [PostGIS] - Identification microlignes dans polygones

Bonjour,

avez-vous essayer d'utiliset st_simplify, ST_SimplifyVW et ST_SimplifyPreserveTopology ?

Si la précision des coordonnées de vos polgyones ne vous importe pas trop, cela peut-être vous apporter un résultat satisfaisant.

Hors ligne

 

Pied de page des forums

Powered by FluxBB

Partagez  |