Les outils SIG de validation des géométries(2) : Spatialite et PostGis

Dans l’article précédent (Les outils SIG de validation de géométries (1)) nous avons traité la couche des communes italiennes (com2011.shp) avec le vérificateur de géométries d’ArcMap. Nous n’avons détecté aucune anomalie.

Maintenant, chargeons cette couche dans une base Spatialite et voyons ce que nous trouvons. Comme il a été indiqué précédemment, ceci est valable pour une base PostGis, les requêtes sql utilisées étant rigoureusement les mêmes.

Validation des géométries dans Spatialite et PostGis

Vous trouverez le peu de références à la validation des géométries dans Spatialite sur cette page: https://www.gaia-gis.it/fossil/libspatialite/info/0978ac2017454733. En ce qui concerne PostGis il y en a un tout petit peu plus, à la page http://postgis.net/docs/using_postgis_dbmanagement.html#OGC_Validity

GEOS (et donc SpatiaLite) prend en charge la fonction SQL ST_IsValid(). En appelant cette fonction, vous pouvez facilement identifier toutes les géométries incriminées contenues dans vos tables. Mais cette fonction ne permet pas de résoudre les problèmes.
SpatiaLite prenait en charge, dans les versions précédentes, une fonction SQL ST_SanitizeGeometry(). Mais cette fonction permettait de traiter un petit nombre d’anomalies.
Maintenant, grâce à l’intégration de la bibliothèque liblwgeom, SpatiaLite peut prendre en charge la fonction ST_MakeValid(), identique à celle prise en charge par PostGIS.

Pour notre exemple, nous avons créée une base spatialite vide, chargé la couche com2011.shp et défini le champ géométrie. Si vous avez besoin d’aide pour le faire, référez vous à cet article : La création d’une base de données spatiale Spatialite pour le faire avec QGis ou à cet article Partager les données entre ArcGis et QGis pour le faire avec ArcGis.

Pour la suite de l’exemple, nous allons d’abord utiliser QGis pour exécuter les requêtes SQL sur la base Spatialite, puis on montrera comment faire avec ArcMap.

Détection des anomalies de géométrie avec QGis

La première requête SQL à exécuter est celle qui permet de vérifier et détecter les anomalies de géométrie. La fonction ST_IsValid effectue cette détection.

SELECT Count(*)
FROM com2011
WHERE ST_IsValid(geometry) = 0;

im4

Vous constaterez que 19 communes présentent des anomalies.

Pour savoir quelles communes sont concernées, il suffit d’exécuter la requête:

SELECT nome_com
FROM com2011
WHERE ST_IsValid(geom) = 0;

im5Les requêtes SQL ne sont pas très loquaces. Si vous voulez savoir quelle est l’erreur détectée, vous devez la chercher dans votre SIG.

La première erreur concerne la commune de Sannicandro di Bari.

commune de sannicandro avec une anomalie

L’anomalie est « visible ». Le polygone de cette commune contient un autre polygone inclus. Le plus probable est que le sens des deux polygones ne soient pas contraires.

Pour la commune de Trieste, la suivante, il est plus difficile à trouver à première vue.

nomalie de la commune de Trieste

Ici aussi, on retrouve un polygone intérieur. Au lieu d’être constitué par deux polygones, un pour l’anneau extérieur et un autre pour l’anneau intérieur, il a été construit avec un seul anneau. Ceci est possible car le bord du polygone intérieur est constitué par un seul point.

Détection des anomalies avec ArcMap

Dans QGis vous avez une fenêtre SQL pour exécuter les requêtes, disponible dans le panneau Gestionnaire des bases de données.

Dans ArcMap, rien de tel. Donc à première vue vous ne pouvez pas exécuter des requêtes SQL sur la base Spatialite.

Rappelons que vous chargez une couche Spatialite directement dans ArcMap, sans passer par aucune connexion à des bases de données.

Mais si on réflêchit bien, les requêtes sur attribut qu’on fait avec ArcMap sont en réalité des requêtes SQL. Même si ce n’est pas documenté, vous pouvez exécuter la requête ST_IsValid() tout simplement à partir d’un fenêtre de Sélection par Attributs!

requête st-isvalid avec sélection par attributs dans arcmap

Vous remarquerez le résultat de la requête : les 19 communes avec des anomalies, les mêmes que celles que nous avons trouvé avec QGis.

Correction automatique des erreurs

Tout d’abord, mettons les choses au point. La correction automatique, étant automatique, ne fait pas intervenir l’opérateur humain. La solution qui sera appliquée n’est pas forcément la bonne, mais c’en est une qui rendra la géométrie valide.

Dans le cas de la commune de Trieste, il est évident qu’au moment de la numérisation du fond du bras de mer, l’opérateur à mis deux points trop proches qui ont fusionné, fermant le dernier petit bout du bras de mer. La solution correcte serait de dupliquer le point en question et de séparer ces deux points, de manière qu’il n’y ait pas de polygone intérieur. Mais ceci ne peut pas être déterminé par une correction automatique.

Ce que la correction automatique fera sera de respecter les placement des points existants. Il dupliquera le point en question en affectant un au polygone extérieur, l’autre au polygone intérieur. Puis il inversera l’ordre des points intérieur pour qu’ils respectent la règle qui dit que le sens des polygones intérieurs doit être anti-horaire (Le sens des anneaux extérieur étant horaire).

En appliquant cette solution, si on ne s’approche pas de la réalité du terrain, au moins la géométrie respectera les règles et ne sera plus considérée comme erronée.

Pour corriger les géométries vous disposez d’une requête SQL utilisant la fonction ST_MakeValid() :

UPDATE com2011 SET geom = ST_MakeValid(geom)
WHERE ST_IsValid(geom) = 0;

Mais selon le logiciel utilisé, cette fonction est implémentée ou pas.

Avec ArcMap, le SQL est limité à des clauses SELECT. Comme nous voulons faire un UPDATE, ceci n’est pas possible dans les fenêtres de Sélection par attributs.

Sous QGis elle ne l’est pas directement dans le gestionnaire de bases de donnés Spatialite. Vous devez passer par un plugin : « Processing LWGEOM provider ».  Une fois installé, vous pouvez disposer de lwgeom comme fournisseur d’algorithmes dans la Boîte à Outils de traitements.

Petit, ou plutôt grand, hic : Pas moyen dans la version 2.8 de corriger la table existante. Vous êtes obligé de créer une nouvelle couche… de type shape. Même si vous sélectionnez le format spatialite comme sortie, c’est buggé et vous avez un shape.

En attendant que ce soit corrigé, de toutes façons ce que l’on cherche c’est à corriger une table existante. Voici le plus simple, même s’il doit y avoir d’autres solutions.

Téléchargez l’exécutable spatialite_gui. Celui-ci est fourni par le projet qui développe Spatialite et possède donc toutes les implémentations nécessaires, à jour. Il n’a pas besoin d’installation, vous téléchargez et exécutez le fichier .exe en double-cliquant.

L’adresse de téléchargement est http://www.gaia-gis.it/gaia-sins/windows-bin-x86/ et le fichier à télécharger c’est celui qui commence par spatialite_gui_

Actuellement, vous pouvez le télécharger en cliquant ici directement: spatialite_gui-1.8.0-devel-win-x86.7z

Si nous exécutons la requête SQL de vérification de la géométrie, nous voyons le même résultat que précédemment:

spatialite gui test de validitéNous exécutons maintenant la requête de corrections de la géométrie:

atialite gui make validFinalement, nous ré-exécutons la requête de validation de la géométrie:

resultat de la correctionLes 19 géométries contenant des anomalies ont été corrigées.

Dans le prochain article on verra comment faire la même chose que pour une base Spatialite, mais cette fois-ci avec n’importe quel format SIG. Pour cela nous utiliserons le logiciel FME de Safe Software.

Laisser un commentaire

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