Nettoyer des données géographiques avec PostGIS

Vive le partage des données! Vive l’Open Data! Certes on ne peut qu’être satisfaits de l’ouverture des jeux de données. Mais en matière de données géographiques, on peut vite « déchanter » en téléchargeant des fichiers (shapefile, GeoJSON, etc) corrompus. Vous savez quand, par exemple, vous lancez des géotraitements sur QGIS et que vous obtenez une multitude d’erreurs pour intersecter des entités vectorielles (figure 1). Par extension, nettoyer des données géographiques peut vite devenir un calvaire.

nettoyer des données géographiques vectorielles

Figure 1 : Erreur lors d’une intersection de deux entités vectorielles dans QGIS

L’erreur signalée par QGIS est ici « Invalid geometries ». Ce qui -comme vous le savez déjà- signifie que la géométrie spatiale de l’entité géographique concernée comporte une erreur. Une erreur de validité peut être causée par plusieurs incohérences géométriques tels une duplication des nœuds, un polygone avec moins de trois nœuds, des auto-intersections, une géométrie inexistante, etc. Alors comment valider et nettoyer des données géographiques vectorielles et leurs géométries? Les fonctions de PostGIS présentées ci-après gèrent la validité des géométries des entités vectorielles.

I. QGIS : Vérifier la validité des données géographiques

En faisant quelques recherches sur internet, on s’aperçoit qu’il existe plusieurs méthodes et outils pour répondre à cette problématique. Ainsi, on peut se référer aux articles de François Atilio qui décrit certaines étapes de validation des données géographiques notamment à partir d’une base spatialite. En outre, Anita Graser utilise le logiciel libre GRASS pour corriger les erreurs géométriques des données après les avoir détecter dans QGIS.

Outils de géométrie dans QGIS

Dans QGIS, cette détection est possible grâce à l’outil « vérifier la validité » disponible par le chemin : Vecteur > Outils de géométrie > Vérifier la Validité.

Dans cet article, on ne s’attarde pas sur ce procédé. En effet, dans la majorité des cas, je n’utilise QGIS que pour visualiser les couches SIG. Puis, je réalise les corrections géométriques directement dans PostgreSQL / PostGIS. L’idée reste identique puisqu’on s’assure dans un premier temps de la validité des données vectorielles. Enfin, on les modifie dans la table spatiale.

II. Fonctions PostGIS pour la validation des géométries des vecteurs

Après le chargement de la couche SIG dans le SGBD PostgreSQL avec un outil SIG (shp2pgsql, ogr2ogr, etc), on utilise quelques requêtes SQL permettant de corriger géométriquement des données SIG dans PostGIS. A titre d’exemple, on imagine une table « A » (de type MULTIPOLYGON) ayant pour identifiant « gid » (clé primaire) et pour colonne géométrique « geom ».

II.1. Repérage des géométries corrompues (ou non valides) : ST_isValid

Pour commencer, la fonction ST_isValid détecte les géométries vectorielles corrompues.

SELECT gid, ST_isValid(geom) FROM A ORDER BY gid ASC;

Cette sélection retourne l’identifiant et la validité de la géométrie de chaque entité du vecteur de manière binaire (true = géométrie valide et false = géométrie invalide). On note que cette opération peut prendre un peu de temps. Donc, il est important de bien vérifier qu’il existe un index lié à la colonne de la géométrie pour optimiser les traitements.

II.2. Motif de l’invalidité d’une géométrie spatiale

Deux fonctions de PostGIS indiquent les raisons de l’invalidaté d’une entité vectorielle si sa géométrie est incorrecte :

  • ST_IsValidReason : Comme pour ST_isValid, cette fonction indique si la géométrie est correcte. Si ce n’est pas le cas, la raison est indiquée en retour.
  • ST_IsValidDetail : En plus des résultats de ST_IsValidReason, cette fonction localise précisément les erreurs de validité liées aux géométries.

Pour ces deux fonctions, des exemples de résultats sont présentés dans la documentation de PostGIS.

III. Comment nettoyer des données géographiques vectorielles?

Après avoir localisé les erreurs de validité, on tâche de nettoyer les données géographiques vectorielles.

III.1. Création de géométries valides : ST_MakeValid

La fonction ST_MakeValid de PostGIS corrige les géométries non valides. Dans la requête SQL suivante, on ne prend en compte que les géométries non valides.

SELECT gid, ST_MakeValid(geom) FROM A WHERE ST_isValid(geom) IS FALSE ORDER BY gid ASC;

Ainsi, la fonction ST_MakeValid est très pratique mais il faut faire attention aux types de géométries transformées après le traitement. Il est par exemple possible d’obtenir des géométries de type POLYGON, MULTIPOLYGON, GEOMETRYCOLLECTION selon la géométrie de votre vecteur pris en charge initialement. On peut le vérifier par la fonction GeometryType.

SELECT gid, GeometryType(ST_MakeValid(geom)) FROM A WHERE ST_isValid(geom) IS FALSE ORDER BY gid ASC;

Dans cet exemple, la table est de type MULTIPOLYGON. Il est donc impératif d’obtenir des géométries corrigées du même type. PostGIS a tout prévu :

SELECT gid, ST_Multi(ST_CollectionExtract(ST_MakeValid(geom),3)) FROM A WHERE ST_isValid(geom) IS FALSE ORDER BY gid ASC;

La fonction ST_CollectionExtract, comme son l’indique, extrait les géométries issues de type GEOMETRYCOLLECTION. Dans cette requête SQL, on précise l’entier 3 pour obtenir des polygones et la fonction ST_Multi transforme ces géométries simples en MULTIPOLYGON.

III.2. Nettoyer des données géographiques non valides à l’aide d’une sous-requête

Enfin, on « nettoie » la table A en modifiant les géométries des entités non valides. Pour cela, on s’appuie sur les précédentes requêtes puis une sous-requête est mise en œuvre :

WITH subquery AS(
 SELECT gid g, geom ge FROM A WHERE ST_isValid(geom) IS FALSE
)
UPDATE A SET geom = ST_Multi(ST_CollectionExtract(ST_MakeValid(subquery.ge),3)) FROM subquery WHERE gid=subquery.g

En conclusion, l’extension spatiale PostGIS permet de traiter de manière approfondie les données géographiques par l’implémentation de multiples fonctions. Dans cet article, on a utilisé plusieurs d’entre elles dans l’objectif de corriger les géométries non valides d’entités vectorielles. Par extension, après cette validation, on pourra se consacrer à différents géotraitements comme les intersections de vecteurs. Pour aller plus loin, PostGIS met à disposition une documentation pour la gestion des bases de données géographiques.

Partager l'article
Taggé , .Mettre en favori le Permaliens.

A propos Florian Delahaye

Passionné de Géomatique

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *