La topologie, une recette…

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.

Graphe du moulon A (ensemble de structures urbaines contigües, limité par des rues) de Saint-Antonin-Noble-Val (82), d’après le terrier de 1397 (crédit : Albane Rossi, Cécile Rivals)
Graphe du moulon (ensemble de structures urbaines contigües, limitées par des rues) de Saint-Antonin-Noble-Val (82), d’après le terrier de 1397
Copyright : Albane Rossi, Cécile Rivals

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).

test.shp
Visuel du shapefile test.

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’;

table edge_data
Aperçu de la table edge_data.

C’est la table edge_data qui contient l’information sur les relations de voisinage…

 panneau_attention 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).

Topologie de test.shp
Résultat de l’opération de topologie sur le shapefile test.

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).

shapefile test_1 avant (1) et après  (2) la vérification de sa topologie
Shapefile test_1 avant (1) et après (2) la vérification de sa topologie.

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 :

topologie de test_1.shp avec une tolérance de 5 degrés
Topologie de test_1.shp avec une tolérance de 5 m.

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);
topologie de test_1.shp sans tolérance (tolérance=0)
Topologie de test_1.shp sans tolérance (tolérance=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  :

le Topologicon.pdf


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