Une couche peut s'afficher parfaitement et cacher des géométries invalides : un contour qui se croise, un trou hors de son polygone, deux parcelles qui se chevauchent d'un mètre. Le jour où l'on calcule une surface, une intersection ou une jointure spatiale, les résultats deviennent faux ou les traitements échouent. Ce tutoriel explique les règles de validité, les erreurs les plus courantes et la manière de les détecter et de les corriger dans QGIS, PostGIS et GDAL.
Deux niveaux de contrôle
- La validité de chaque géométrie, définie par la norme OGC Simple Features : un polygone ne doit pas se croiser lui-même, ses trous doivent être à l'intérieur, etc. C'est une propriété de l'objet seul.
- La topologie de la couche : les relations entre objets voisins. Des parcelles, des communes ou des zones de PLU doivent former un pavage sans chevauchement ni trou. Chaque polygone peut être valide et la couche fausse.
Les règles de validité d'un polygone
| Erreur | Ce que cela signifie | Cause fréquente |
|---|---|---|
| Auto-intersection | Le contour se croise (forme en « nœud papillon ») | Sommets saisis dans le désordre, inversion de deux points |
| Boucle d'anneau | L'anneau repasse par un même point en formant une boucle | Numérisation à main levée, vectorisation de raster |
| Trou hors du contour | Un anneau intérieur sort du contour extérieur | Mauvais regroupement des anneaux (conversion DAO, export) |
| Intérieur déconnecté | Des trous qui se touchent coupent le polygone en morceaux | Découpage, différence entre couches |
| Anneau non fermé | Le dernier sommet ne répète pas le premier | Fichier écrit à la main, WKT tronqué |
| Trop peu de points | Anneau de moins de 4 positions, ligne d'un seul point | Simplification trop forte, points en double |
Une surface fausse sans message d'erreur. Sur un polygone en nœud papillon, les deux moitiés tournent en sens inverse et se retranchent l'une de l'autre : la surface calculée peut tomber à zéro alors que le dessin couvre un hectare. Beaucoup de logiciels calculent sans prévenir.
L'orientation des anneaux n'est pas une question de validité, mais une convention de format, et les formats se contredisent. La norme GeoJSON (RFC 7946) demande un contour extérieur dans le sens inverse des aiguilles d'une montre et des trous dans le sens horaire. Le Shapefile impose exactement l'inverse. La plupart des logiciels tolèrent les deux, mais certains outils web (rendu de tuiles, calculs D3.js) dessinent alors l'inverse du polygone.
Diagnostiquer
Dans QGIS
Vecteur › Outils de géométrie › Vérifier la validité produit trois couches : les objets valides, les objets invalides (avec un champ _errors) et une couche de points qui situe chaque erreur, avec un champ message. Choisissez la méthode GEOS : c'est le moteur de PostGIS, celui dont les règles feront foi lors des traitements.
Pour la topologie entre objets, l'extension intégrée Vérificateur de topologie applique des règles comme « ne doit pas se chevaucher » ou « ne doit pas avoir de trous », et liste les erreurs sur la carte.
Dans PostGIS
-- Les objets invalides et la raison
SELECT id, ST_IsValidReason(geom)
FROM parcelles
WHERE NOT ST_IsValid(geom);
-- → 42 | Self-intersection[942617.68 6538150.26]
-- Chevauchements entre voisins (l'index spatial rend la requête rapide)
SELECT a.id, b.id, ST_Area(ST_Intersection(a.geom, b.geom)) AS surface_m2
FROM parcelles a JOIN parcelles b
ON a.id < b.id AND ST_Intersects(a.geom, b.geom)
WHERE ST_Area(ST_Intersection(a.geom, b.geom)) > 0.01;
Réparer
Le principe de « MakeValid »
Les outils modernes reconstruisent une géométrie valide sans perdre de surface dessinée. Deux méthodes existent dans le moteur GEOS :
- Linework : tous les contours sont découpés à chaque croisement, puis les faces sont reconstruites. Le nœud papillon devient deux triangles.
- Structure : chaque anneau est d'abord rendu valide, puis les contours sont fusionnés et les trous soustraits. Le résultat est plus proche de l'intention quand les trous sont bien identifiés. Cette méthode demande GEOS 3.10 ou plus récent.
| Outil | Commande | Méthode par défaut |
|---|---|---|
| QGIS | Vecteur › Outils de géométrie › Réparer les géométries | Structure (Linework au choix) |
| PostGIS | ST_MakeValid(geom), ou ST_MakeValid(geom, 'method=structure') depuis PostGIS 3.2 | Linework |
| GDAL | ogr2ogr -makevalid sortie.gpkg entree.shp (GDAL 3.1 et plus) | Linework |
L'astuce du « buffer(0) » est à proscrire. Elle « répare » un polygone en calculant une zone tampon de largeur nulle, mais sur un nœud papillon elle ne garde qu'une des deux moitiés : la moitié de la surface disparaît en silence. Préférez toujours MakeValid.
Chevauchements et trous entre objets
MakeValid ne corrige pas la topologie d'une couche. Pour un chevauchement, il faut décider à qui revient la surface commune, puis la retirer de l'autre avec une différence (ST_Difference, ou l'outil Différence de QGIS). Un trou entre deux voisins se comble en déplaçant les sommets avec l'accrochage activé, ou en l'ajoutant à l'un des polygones. Une astuce pour trouver les trous d'un pavage : fusionnez tous les polygones, et les anneaux intérieurs du résultat sont les trous.
-- Les trous d'un pavage : anneaux intérieurs de l'union de tous les polygones
SELECT r.geom AS trou
FROM (SELECT (ST_Dump(ST_Union(geom))).geom AS geom FROM parcelles) AS d,
LATERAL ST_DumpRings(d.geom) AS r
WHERE r.path[1] > 0; -- path[1] = 0 : contour extérieur ; > 0 : anneaux intérieurs
Prévenir plutôt que guérir
- Activez l'accrochage (et l'édition topologique dans QGIS) quand vous dessinez des polygones voisins : les sommets communs restent communs.
- Simplifiez avec un outil topologique : simplifier chaque polygone séparément ouvre des trous et crée des chevauchements entre voisins. Mapshaper ou PostGIS Topology simplifient les frontières une seule fois pour les deux côtés.
- Contrôlez après chaque conversion, surtout depuis la DAO : un DXF ne connaît pas la notion de trou.
L'outil Convertir et valider une géométrie applique ce diagnostic à une géométrie collée en WKT, EWKT, GeoJSON ou en coordonnées. Il la répare avec la méthode Linework, puis la convertit et la reprojette.
Démonstration
Un petit lotissement fictif près d'Annecy, avec quelques erreurs typiques. Le contrôle utilise JSTS, la version JavaScript du moteur de PostGIS et QGIS.
À essayer : lancez le contrôle. Le lot n°4 se croise : sa surface affichée est nulle. Le lot n°5 a un trou en dehors. Les lots n°1 et n°2 se chevauchent, et un mince trou sépare les lots n°2 et n°3. Réparez ensuite les géométries, puis retirez le chevauchement : comparez les surfaces avant et après.
Licences : textes et schémas sous licence CC BY-SA 4.0 (réutilisation libre en citant CartoForge et en partageant à l'identique) ; extraits de code sous licence MIT, à copier librement dans vos projets.
Liens, services et noms de couches vérifiés le 15/10/2026. Un lien cassé ? Signalez-le.