Pages: 1
- Sujet précédent - Correction scories/topologies/geometries sous postgis/qgis/arcgis - Sujet suivant
#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: 1142
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.
Hors ligne
#4 Wed 08 August 2018 22:49
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1142
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
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
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: 1538
Re: Correction scories/topologies/geometries sous postgis/qgis/arcgis
Bonjour,
Pas facile de corriger une topologie avec postgis, helas
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
Pages: 1
- Sujet précédent - Correction scories/topologies/geometries sous postgis/qgis/arcgis - Sujet suivant