Suite

Nettoyer les géométries dans PostGIS ?


J'essaie de faire un traitement sur de très grandes couches de polygones. Cependant, je rencontre diverses erreurs de géométrie telles que:

AVIS : Auto-intersection en anneau au ou près du point 470396.52017068537 141300.52235257279 CONTEXTE : fonction PL/pgSQL st_intersection(geometry,raster,integer) ligne 10 à RETURN QUERY Fonction SQL "st_intersection" instruction 1 AVIS : Auto-intersection en anneau au ou près du point 504154.61769969884 140782.041157676 CONTEXTE : fonction PL/pgSQL st_intersection(geometry,raster,integer) ligne 10 à RETURN QUERY Fonction SQL "st_intersection" instruction 1 entier) ligne 10 à RETURN QUERY Fonction SQL "st_intersection" instruction 1 AVIS : Auto-intersection en anneau au niveau ou près du point 510312.46970004693 141215.29256710084 CONTEXTE : fonction PL/pgSQL st_intersection(geometry,raster,integer) ligne 10 à RETURN QUERY Fonction SQL "st_intersection" instruction 1 AVIS : Auto-intersection en anneau au niveau ou à proximité du point 510312.46970004693 141215.29256710084 CONTEXTE : fonction PL/pgSQL st_ intersection(geometry,raster,integer) line 10 at RETURN QUERY Fonction SQL "st_intersection" instruction 1 QUERY SQL fonction "st_intersection" instruction 1 AVIS : Ring Self-intersection au niveau ou près du point 515064.03024010791 140895.68087158105 CONTEXTE : PL/pgSQL fonction st_intersection(geometry,raster,integer) line 10 at RETURN QUERY SQL function "st_intersection" statement 1 NOTA: Ring Self -intersection au ou près du point 519233.18724611058 140881.47590733573 CONTEXTE : fonction PL/pgSQL st_intersection(geometry,raster,integer) ligne 10 à RETURN QUERY Fonction SQL "st_intersection" instruction 1 Fonction pgSQL st_intersection(geometry,raster,integer) ligne 10 à RETURN QUERY Fonction SQL "st_intersection" instruction 1 AVIS : Rin g Auto-intersection au ou près du point 523331.31943088671 141144.26774587421 CONTEXTE : fonction PL/pgSQL st_intersection(geometry,raster,integer) ligne 10 à RETURN QUERY Fonction SQL "st_intersection" instruction 1 AVIS : Ring Auto-intersection au ou près du point 523331.31943088671 141144.26774587424 CONTEXT Fonction PL/pgSQL st_intersection(geometry,raster,integer) ligne 10 à RETURN QUERY Fonction SQL "st_intersection" instruction 1 ligne 10 à RETURN QUERY Fonction SQL "st_intersection" instruction 1 AVIS : Auto-intersection en anneau au ou près du point 524531.63890961662 140810.45108610913 CONTEXTE : fonction PL/pgSQL st_intersection(geometry,raster,integer) ligne 10 à RETURN QUERY Fonction SQL "st_intersection" instruction 1

J'ai essayé la fonction suggérée ici : https://trac.osgeo.org/postgis/wiki/UsersWikiCleanPolygons

pour nettoyer les géométries, le code que j'ai utilisé étant :

UPDATE public.mytable SET geom=cleangeometry(geom);

Avec le résultat:

ERREUR : GEOSisSimple : IllegalArgumentException : cette méthode ne prend pas en charge les arguments GeometryCollection

et aussi

MISE À JOUR public.valid_mytable SET geom=ST_MakeValid(geom);

Celui-ci fonctionne, mais seulement si je change d'abord ma colonne de géométrie en géométrie

ALTER TABLE public.mytable ALTER COLUMN geom SET DATA TYPE geometry;

Ce qui me laisse alors une table qui ne fonctionne plus avec mes autres fonctions !

ERREUR : opération de relation appelée avec un type LWGEOMCOLLECTION. Ceci n'est pas pris en charge.

J'ai essayé de remettre les colonnes en géométrie (MultiPolygon)

ALTER TABLE public.my_table ALTER COLUMN geom SET DATA TYPE geometry(MultiPolygon);

Mais cela échoue

ERREUR : le type de géométrie (GeometryCollection) ne correspond pas au type de colonne (MultiPolygon)

J'ai essayé de parcourir PostGIS en action (deuxième éd.) http://www.manning.com/obe/ mais je ne peux trouver que des fonctions pour trouver des géométries invalides, mais mon ensemble de données est si volumineux pour résoudre ce problème manuellement, j'ai vraiment besoin de quelque chose qui les réparera automatiquement.


J'ai pu isoler les polygones problématiques, lorsque j'essaie d'exécuter ST_MakeValid(), j'obtiens le résultat :

ERREUR : le type de géométrie (GeometryCollection) ne correspond pas au type de colonne (MultiPolygon) ********** Erreur ********** ERREUR : le type de géométrie (GeometryCollection) ne correspond pas au type de colonne (MultiPolygon ) État SQL : 22023

J'ai fait une vérification de type sur ma colonne de géométrie, et il a dit que le type était "MULTIPOLYGON"


Si vous souhaitez uniquement des polygones ou des multipolygones de ST_MakeValid, vous pouvez utiliser ST_Dump pour extraire les géométries constitutives, puis tester le type de géométrie. ST_MakeValid produira parfois des points ou des LineStrings d'où provient la GeometryCollection. Essayez quelque chose comme :

SELECT g.geom, row_number() over() AS gid, FROM (SELECT (ST_DUMP(ST_MakeValid (geom))).geom FROM your_table ) AS g WHERE ST_GeometryType(g.geom) = 'ST_MultiPolygon' OU ST_GeometryType(g.geom ) = 'ST_Polygone';

Vous pouvez utiliser une clause IN au lieu d'une condition OR, bien que le résultat et le plan de requête soient les mêmes. Si vous ne voulez que des multipolygones, vous pouvez envelopper ST_Dump dans la fonction ST_Multi.

Le row_number() over() vous renverra simplement un identifiant unique, à partir de un, pour chaque géométrie renvoyée par ST_Dump. Vous pouvez également utiliser l'élément path renvoyé par ST_Dump, avec le même résultat.

Vous voudrez probablement combiner cela avec une instruction de type CREATE TABLEclean_geoms AS SELECT…, car une mise à jour directe est peu susceptible de fonctionner car ST_MakeValid ne produira généralement (ou toujours) un mappage un à un à partir de la sortie.

Ceci n'a pas été testé car je n'ai aucun moyen, actuellement, donc il pourrait y avoir une parenthèse mal placée, mais le principe général est sain. J'espère que cela t'aides.


Vous pouvez essayer ST_CollectionExtract pour extraire des [Multi] Polygones de GeometryCollections. Utilisez ST_Multi pour les forcer en tant que MuliPolygons.

MISE À JOUR public.valid_lcmsouthshapefile SET geom=ST_Multi(ST_CollectionExtract(ST_MakeValid(geom), 3)) WHERE NOT ST_IsValid(geom);

Une fois terminé, utilisez une contrainte CHECK pour vous assurer qu'ils restent valides. Voir les détails ici.


Voir la vidéo: Dissolve Geometry. PostGIS (Octobre 2021).