11 - Correction de géométries
Mise en pratique de corrections de géométrie avec PostGIS sur un exemple
Question
Charger sous QGIS le fichier localisation_geographique_des_mares_2012.TAB
Dans le gestionnaire de couches, afficher le décompte des entités de cette couche.
Utiliser l'algorithme 'vérifier la validité' de la boîte à outils de traitement pour évaluer les erreurs avec la méthode de contrôle GEOS, puis QGIS.
Dans le gestionnaire de couche procéder à un regroupement des couches produites par chaque méthode et décompter les entités non valides dans chaque cas.
Identifier les types d'erreurs détectés par chaque méthode dans la table d'attribut.
Procéder à l'import dans le schéma travail
de la base stageXX
(remplacer XX par votre numéro de stagiaire) en utilisant l'algorithme 'import vector into PostGIS database
ou 'Exporter vers PostgreSQL
' dans QGIS 3 et +
Réaliser une requête SQL pour Décompter ; les géométries null, les géométries invalides,
Sous PostGIS corriger à l'aide de requêtes SQL les entités avec la fonction ST_Makevalid()
puis corriger les problèmes de collection (st_makevalid() renvoi parfois des objets collection au lieu de multipolygon) avec st_multi(st_CollectionExtract(ST_Force_Collection(st_makevalid(geom)),3)) en remplacement du seul st_makevalid()
Ensuite corriger les problèmes de nœuds doubles avec la combinaison de fonction st_multi(st_simplify(geom,0))
et enfin supprimer les entités n'ayant pas de géométrie associée.
recharger la table sous QGIS et re-analyser la table avec vérifier la validité
selon les deux méthodes.
Qu'en concluez-vous ?
Solution
Charger localisation_geographique_des_mares_2012.SHP
faire clic droit dans le gestionnaire de couche -> Montrer le décompte des entités.
Il y a 106149 entités :

Utiliser l'algorithme vérifier la validité avec la méthode GEOS, puis QGIS.
Réorganiser les couches en utilisant clic droit -> grouper la selection
et montrer le décompte des entités

Pour identifier le type d'erreur utilisons la table attributaire de la couche erreur de sortie dans les deux cas.
(faire un zoom sur l'étendue de la couche erreur de sortie et constater qu'il y a des points aberrants)
avec la méthode GEOS, les erreurs détectées sont :
auto-intersection et trop peu de points dans la géométrie
avec la méthode QGIS les erreurs détectées sont :
nœud en double et la géométrie à 1 erreurs.
Utilisons l'algorithme d'import de gdal (ou export avec QGIS 3) pour charger la table dans le schéma travail de la base stageXX
l'onglet processing du journal des messages doit renvoyer quelque chose comme :
sous Pgadmin vérifier que la couche localisation_geographique_des_mares_2012 apparaît bien dans le schema travail de votre base.
La requête pour compter les géométries null et invalides peut s'écrire (on utilise UNION pour avoir le résultat en une seule fois) :
select 'invalid' as nb, count(*) from travail.localisation_geographique_des_mares_2012 where not st_isvalid(geom) union
select 'geonul' as nb, count(*) from travail.localisation_geographique_des_mares_2012 where geom is null
le résultat est le suivant :

Corrigez la géométrie avec la requête suivante :
update travail.localisation_geographique_des_mares_2012 set geom = st_makevalid(geom) where not st_isvalid(geom)
constater que des messages d'erreur sont générés :
NOTICE: Too few points in geometry component at or near point 370462.88999999996 6673504.5749999993
ERREUR: Geometry type (GeometryCollection) does not match column type (MultiPolygon)
********** Erreur **********
ERREUR: Geometry type (GeometryCollection) does not match column type (MultiPolygon)
État SQL :22023
En effet dans certains st_makevalid génère un objet de type collection plutôt que multipolygon.
Pour corriger ce pb nous pouvons utiliser :
update travail.localisation_geographique_des_mares_2012 set geom = st_multi(st_CollectionExtract(ST_Force_Collection(st_makevalid(geom)),3)) where not st_isvalid(geom)
PostGIS renvoi maintenant :
NOTICE: Too few points in geometry component at or near point 370462.89000000001 6673504.5700000003
NOTICE: Self-intersection at or near point 359608.83000000002 6714918.75
Corrigeons maintenant les points doubles.
update travail.localisation_geographique_des_mares_2012 set geom = st_multi(st_simplify(geom,0))
Nous pouvons supprimer les entités avec géométrie nulle avec la requête suivante :
delete from travail.localisation_geographique_des_mares_2012 where geom is null;
Charger la couche dans QGIS et réxécuter vérifier la validité avec la méthode QGIS et GEOS
constater qu'il n y a plus d'erreurs au sens QGIS et GEOS.
a noter que l'algorithme 'Réparer les géométries' de QGIS' corrige dans notre cas les anomalies détectés par la méthode GEOS mains ne corrige pas les noeuds en double (détecté par la méthode QGIS).
Remarque : Pas d'accent dans les chemins de fichiers.
Dans les algorithmes d'import sous PostgreSQL les noms des chemins ne doivent pas contenir d'accents.