Comme indiqué dans notre dernier compte-rendu, nous revenons avec un exemple sur la topologie. La documentation en français étant parfois difficile à réunir, nous vous proposons une recette pas à pas.
La topologie en quelques mots…
La topologie fournit un cadre pour traiter des notions de continuité et de voisinage.
En géomatique, la topologie permet de réduire la taille du stockage (deux pays limitrophes partagent nécessairement la même frontière), de “nettoyer” des shapefiles etc. En sciences humaines, la topologie et les graphes permettent de modéliser des relations (qualitatives) quand les mesures (spatiales, quantitatives) son mal approchées.
La topologie en pratique…
En nous servant de PostGIS, une base de données spatiale qui fournit des outils de topologie, nous présentons l’intégration d’un shapefile (géographique) dans un schéma topologique.
Début – Importer le shapefile test.shp dans PostGIS (avec le plugin PostGIS Shapefile and DBF loader). Dans l’interface graphique du plugin, lors de l’import du shapefile, définir son SRID comme 2154 (projection RGF93 / Lambert-93).
1– Sous PostGIS, dans l’onglet SQL, lancer :
CREATE EXTENSION postgis_topology; |
Cette commande créée :
– l’extension topologique de PostGIS (postgis_topology) ;
– un nouveau schéma (topology) ;
– dans ce schéma, deux tables : layer et topology ;
2– Sous PostGIS, dans l’onglet SQL, lancer :
SELECT topology.CreateTopology(‘ma_topo’, 2154, 0.5); |
Où :
– ‘ma_topo’ est le nom du nouveau schéma topologique ;
– 2154 est la référence spatiale de ‘ma_topo’ elle doit être identique à celle de la colonne ‘geom’ (lors de l’import su shapefile);
– 0.5 est la tolérance de la topologie (voir ci-dessous) ;
Cette commande créée :
– un nouveau schéma topologique (‘ma_topo’) ;
– quatre tables dans ce schéma : edge_data, face, node, relation ;
3– Sous PostGIS, dans l’onglet SQL, lancer :
SELECT topology.AddTopoGeometryColumn(‘ma_topo’, ‘public’, ‘test’, ‘topo’, ‘POLYGON’); |
Où :
– ‘ma_topo’ est le nom du schéma topologique ;
– ‘public’ est le schéma géométrique ;
– ‘test’ est la table où sera enregistrée la colonne ‘topo’ ;
– ‘topo’ est la nouvelle colonne topologique dans la table ‘test’ ;
– ‘POLYGON’ est le type de données qui y sera enregistré ;
Cette commande créée :
– une colonne topologique dans la table ‘test’;
– une ligne dans la table ‘layer’;
4– Sous PostGIS, dans l’onglet SQL, lancer :
UPDATE test SET topo = topology.toTopoGeom(geom, ‘ma_topo’, 1, 0.5); |
Où :
– ‘test’ est la table qui va être modifiée ;
– ‘topo’ est la colonne qui va être modifiée ;
– ‘geom’ la colonne géométrique qui va être lue ;
– ‘ma_topo’ est le nom du schéma topologique ;
– 1 fait référence à l’identifiant enregistré dans la table layer ;
– 0.5 est la tolérance de la transformation topologique ‘geom’ -> ‘topo’ ;
La commande :
– remplit la colonne topo avec les données géométriques transformées (geom -> topo) ;
– remplit les quatre tables (edge_data, face, node, relation) du schéma ‘ma_topo’;
C’est la table edge_data qui contient l’information sur les relations de voisinage…
A ce niveau des erreurs peuvent survenir.
Par exemple : “la fonction st_changeedgegeom(character varying, integer, geometry) n’existe pas”. Ceci est dû à un problème de search_path. Dans ce cas, fermer et relancer pgAdmin III.
Ou par exemple : “ERREUR: Geometry SRID (un_nombre) does not match column SRID (un_autre_nombre))”. Le SRID de la colonne ‘geometry’ ne correspond pas à celui de la colonne ‘topo’.
Fin– Importer dans un SIG (par exemple QGIS).
La tolérance (une vertu)
Pour le shapefile test_1.shp (1), il peut y avoir des vides (gaps) et des superpositions (overlaps). L’outil Vérification de topologie de QGIS permet de les mettre en évidence (2).
On peut savoir quelle est la distance maximale (entre deux points) de ces vides et de ces superpositions avec l’outil Mesurer une longueur de QGIS. Ici, la distance maximale est ≤ 5 m (on est en RGF93). C’est ce paramètre que l’on va rentrer dans les requêtes SQL : CreateTopology et toTopoGeom (voir ci-dessus).
SELECT topology.CreateTopology(‘ma_topo’, 0, 5); |
SELECT topology.AddTopoGeometryColumn(‘ma_topo’, ‘public’, ‘test’, ‘topo’, ‘POLYGON’); |
UPDATE test SET topo = topology.toTopoGeom(geom, ‘ma_topo’, 1, 5); |
Il pourra encore apparaitre des erreurs qu’il faudra chercher à identifier de manière ad hoc, par exemple en levant des exceptions (voir les liens ci-dessous).
Résultat :
Si la tolérance avait été nulle :
SELECT topology.CreateTopology(‘ma_topo’, 0, 0); |
SELECT topology.AddTopoGeometryColumn(‘ma_topo’, ‘public’, ‘test’, ‘topo’, ‘POLYGON’) As new_layer_id; |
UPDATE test SET topo = topology.toTopoGeom(geom, ‘ma_topo’, 1, 0); |
Liens sur la topologie dans PostGIS :
simplifier un ensemble de polygones limitrophes (départements)
nettoyer un ensemble de lignes (réseau routier)
Une excellente manière de continuer à ‘topologiser’ en bandes dessinées :
OpenEdition vous propose de citer ce billet de la manière suivante :
thomash (14 février 2014). La topologie, une recette… Les goûters de la géomatique. Consulté le 4 décembre 2024 à l’adresse https://doi.org/10.58079/p3sl