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é ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Tue 07 August 2018 21:53

Rlucas
Participant occasionnel
Date d'inscription: 20 Apr 2018
Messages: 31

Correction scories/topologies/geometries sous postgis/qgis/arcgis

Bonjour,

Je travaille sous PostGreSQL/PostGIS sur un SIG d'occupation du sol suivant une série temporelle annuelle. La couche de base est une matrice représentant des polygones portant l'information du type d'occupation pour chaque année.
Pour réaliser l'extraction annuelle, j'ai écrit le script suivant :

Code:

CREATE TABLE 2009_extract AS
SELECT
    geom,
    type09 AS type
FROM matrice;

CREATE INDEX 2009_gist ON 2009_extract USING GIST (geom);

CREATE TABLE 2009_union AS
SELECT 
    type,
    ST_MULTI(St_Union(geom)) :: GEOMETRY(MULTIPOLYGON, 2972) as geom
    FROM 2009_extract
    GROUP BY type
    ORDER BY type;    
    
CREATE TABLE 2009 AS
SELECT
    type, 
    (ST_DUMP(geom)).geom::GEOMETRY(POLYGON, 2972) as geom
    FROM 2009_union;
    
DROP TABLE 2009_union;
DROP TABLE 2009_extract;

Malheureusement, cette procédure produit énormément de scories dans les polygones lors de l'affichage sous QGIS et ARCGIS (lignes résiduelles, présentes juste à l'affichage mais pas dans les tables attributaires).
J'ai pensé que cela provenait d'erreurs de topologies / géométries, donc j'ai suivi pas à pas les excellentes méthodes recensées dans

http://www.geoinformations.developpemen … 5fcd75.pdf


J'ai donc corrigé les erreurs avec le St_makevalid et vérifiées sous ArcGIS (les outils de Qgis m'indiquent toujours des superpositions et intersections quoi que je fasse donc j'ai arrêté de leur faire confiance).
Fait étonnant , si je me connecte à la base avec ArcGis, les couches affichent les scories, mais lorsque je dois créer une géodatabase pour tester les erreurs, les scories disparaissent. J'avais la même chose avec une obscure méthode de "correction maison" qui consistait à convertir le shape en fichier Tab (MapInfo) puis reconvertir en shape (avec une petite déperdition de précision, basée sur l'accrochage des mailles).

J'ai donc essayé la technique de la récupération de la polyligne extérieure et de la reformation des polygones pour les supprimer, et ça marche.

Code:

CREATE TABLE agripag_2009_exterior_ring AS 
SELECT type, ST_ExteriorRing(geom) AS geom
FROM agripag_2009_dump;

CREATE TABLE agripag_2009_make_polygon AS 
SELECT type, ST_MakePolygon(geom) AS geom
FROM agripag_2009_exterior_ring;

Par contre, les polygones troués sont remplis et se superposent donc avec ceux qui les remplissaient... ce qui ne convient pas.
Avez-vous déjà rencontré ce genre de problèmes et avez vous trouvé une solution?
Je vous remercie d'avance.

Hors ligne

 

#2 Wed 08 August 2018 10:56

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

Re: Correction scories/topologies/geometries sous postgis/qgis/arcgis

Salut,

j'ai du mal à concevoir le problème, vous pourriez poster
quelques copies d'écran ?

Merci.

Hors ligne

 

#3 Wed 08 August 2018 18:22

Rlucas
Participant occasionnel
Date d'inscription: 20 Apr 2018
Messages: 31

Re: Correction scories/topologies/geometries sous postgis/qgis/arcgis

Bonjour,

Merci pour votre intérêt. Pour mieux comprendre, vous pouvez oublier ma digression sur la correction des erreurs topologiques/géométriques. C'était plus à but informatif pour les prochains qui rencontreront ce problème.
Ma question est simple, comment supprimer les scories (petits morceaux de lignes, résidu d'une union de polygones - cf. image jointe) qui apparaissent suite à un ST_UNION / ST_DUMP.

Sachant que la méthode ST_ExteriorRing suivie de ST_MakePolygon ne peut pas marcher dans mon cas car elle ne prend pas en compte les polygones à trous (elle les "comble" et provoque des superpositions).
D'ailleurs j'ai du mal à comprendre pourquoi ce lignes internes apparaissent alors que le type spécifié est bien POLYGON ou MULTIPOLYGON. Il me semblait qu'un polygone au sens strict ne pouvait pas inclure des polylignes internes?
Merci d'avance.


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

Hors ligne

 

#4 Wed 08 August 2018 22:49

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

Re: Correction scories/topologies/geometries sous postgis/qgis/arcgis

Je pense que le problème réside dans la topologie de votre couche initiale.

Les scories ont tout l'air d'être des interstices entre polygones qui ne sont pas jointifs.
Plusieurs solutions sont possibles:

Utiliser st_snaptogrid sur votre couche de départ afin d'arrondir les coordonnées
des sommets de vos géométries sur une grille régulière.
C'est au prix d'une petite perte de précision.
Cela ne garantie pas que toutes les interstices seront comblées mais c'est peut être un
bon début.
Vous pouvez mettre à jour votre couche ou bien juste transformer votre couche
à la volée dans votre script, si vous voulez conserver la donnée originale.

Transformer votre couche géométrique en couche topologique en utilisant l'extension topologique
de Postgis avec la précision adaptée. La aussi perte de précision possible.

Utiliser le correcteur topologique de QGIS comme décrit dans le chapitre 5.3.1 du rapport dont vous
avez posté le lien (ou d'un autre logiciel..)

Sinon vous pouvez rester sur votre méthode, en conservant en plus
les anneaux intérieurs qui ne sont pas des scories.
Un moyen de distinguer erreur de topologie de réel anneau,
au vu de votre capture d'écran, serait de mesurer l'aire des anneaux.

Code:

SELECT
st_buildarea(
    st_collect(
         st_exteriorRing(g) 
        || 
        (array_agg(r) FILTER (WHERE st_area(st_buildArea(r)) > a_definir)
        )
     )
)
FROM (
    SELECT g, st_interiorRing(g, id) r
    FROM couche LATERAL JOIN st_numInteriorRing(g) id
    ) foo 
GROUP BY g
UNION
SELECT g FROM couche WHERE st_numInteriorRing(g) = 0

Dernière modification par tumasgiu (Wed 08 August 2018 22:51)

Hors ligne

 

#5 Thu 09 August 2018 08:34

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9869
Site web

Re: Correction scories/topologies/geometries sous postgis/qgis/arcgis

Bonjour,

Pour préciser un point sur les POLYGON : ceux-ci peuvent avoir un trou, mais pas d'ilôts. Seuls les MULTIPOLYGON peuvent avoir un ilôt (et un trou).

Y.


Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !!  - GeoRezo vous aide ? Aidez GeoRezo !

Hors ligne

 

#6 Thu 09 August 2018 09:56

cbredel
Participant actif
Lieu: Agape Lorraine Nord
Date d'inscription: 20 Feb 2006
Messages: 99
Site web

Re: Correction scories/topologies/geometries sous postgis/qgis/arcgis

Bonjour Lucas,

Pour travailler sur des "scories", tu peux essayer d'extraire les trous de tes polygones, de les filtrer pour ensuite recréer les bons trous.


Voici une exemple du type de traitement qu'il faudrait faire qu'il faudrait généraliser pour pouvoir traiter une couche complète.

with
--Création d'une géométrie exemple
une_geom as  (
SELECT ST_PolyFromText('POLYGON((0 0,20 0,20 20,0 20,0 0),(10 10,10 11,11 11,11 10,10 10),(5 5,5 7,7 7,7 5,5 5))') AS geom
)

--Récupération du contour via le st_dumprings
-- La valeur path = 0 correspond au contour
ext as (
select row_number() over () as id,geom from (
SELECT (ST_DumpRings(a.geom)).geom,(ST_DumpRings(a.geom)).path[1] as p
          FROM une_geom
) as b where p=0
)

--Récuparation des trous via le st_dumprings
-- La valeur de path différente de 0 indique un trou
,trou as (
select st_union(geom) as geom from (
SELECT (ST_DumpRings(a.geom)).geom,(ST_DumpRings(a.geom)).path[1] as p
          FROM une geom
) as b where p!=0
--ici tu pourrais ajouter une condition pour filtrer sur la taille des trous
)

--Enfin, tu fais la différence entre le contour et les trous ce qui te donneras un polygon troué
select st_difference(ext.geom,trou.geom) from ext,trou


Alors attention, dans cet exemple simple, je me  base sur un polygone simple... Dans le cas où tu aurais à travailler avec des multipolygones, il faudrait passer par un st_dump (simple .. ) pour avoir chaque polygone pour ensuite en sortir les trous

Autre attention, des fois les "scories" proviennent d'autres problèmes de géométrie lié aux traitements. Aussi, il peut être intéressant  de faire une table  de travail contenant tes contours et tes trous, nettoyer les trous que tu ne veux pas conserver puis refaire les trous dans les polygones.

A+ et bonne journée.

Christophe BREDEL

Hors ligne

 

#7 Thu 09 August 2018 10:36

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: Correction scories/topologies/geometries sous postgis/qgis/arcgis

Bonjour,

Pas facile de corriger une topologie avec postgis, helas sad

Au final, pour des grosses couches ou si on veut une vraie topologie exacte, des outils externes sont utiles, comme GRASS par ex (qui est topologique par nature).

Nicolas

Hors ligne

 

#8 Tue 21 August 2018 20:28

Rlucas
Participant occasionnel
Date d'inscription: 20 Apr 2018
Messages: 31

Re: Correction scories/topologies/geometries sous postgis/qgis/arcgis

Bonjour à vous,

Je réponds un peu en retard, de retour de congés. Merci pour vos multiples réponses, cela m'a donné plusieurs pistes à explorer.
Concernant les traitements des trous, j'ai essayé les commandes qui marchent plutôt bien avec des ajustements, mais il y a trop de risques de déperdition d'information. En effet, j'ai des anneaux de taille variables, qui peuvent être petits, et j'ai surtout beaucoup trop d'enregistrements pour pouvoir vérifier manuellement tous les traitements.

J'ai donc plutôt tenté de "d'arrondir les coordonnées des sommets de vos géométries sur une grille régulière" avec st_snaptogrid comme l'a suggéré Thomasgiu.

Code:

update matable
set geom = st_collectionExtract(st_makeValid(st_snapToGrid(geom,1)),3);

J'ai ensuite essayé de "topologiser" la couche comme détaillé dans les liens suivants :

https://goutergeo.hypotheses.org/173
https://makina-corpus.com/blog/metier/2 … voirie#id3

Malheureusement, j'ai une erreur de type "ERREUR:  Spatial exception - geometry intersects edge" et je ne peux aller au bout de la procédure (j'avoue ne pas avoir pu appliquer le script pl/pgsql recommandé, faute de pouvoir définir le chemin du répertoire d'extensions pour installer la bibliothèque)

Au final, j'ai fait le test des traitements juste après le snaptogrid et les scories disparaissent quasiment toutes, sans deperdition d'information en terme de nombres de polygones et de surfaces.

Après effectivement GRASS à l'air d'être quand même la solution opensource la plus adaptée pour la correction des géometries et topologies...
Merci à vous pour vos commentaires et votre aide, ça permet de mieux orienter les recherches quand on pense avoir fait le tour!

Dernière modification par Rlucas (Tue 21 August 2018 20:29)

Hors ligne

 

Pied de page des forums

Powered by FluxBB