Calcul d’itinéraires avec pgRouting
NOTE: Il existe plusieurs approches pour calculer un itinéraire à partir d’un réseau routier. On peut utiliser pgRouting de PostGIS, on peut utiliser une simple librairie networkx, ou encore utiliser Neo4j. Voir l’exemple de pgRouting avec un réseau routier personnalisé et une service web flask https://github.com/voirinprof/gis_pgrouting_docker. Si vous voulez voir comment utiliser networkx pour faire un calcul d’itinéraires, utilisez ce repo : https://github.com/voirinprof/gis_nx_docker
Introduction à pgRouting
pgRouting est une extension de PostGIS qui permet d’ajouter des capacités de calcul d’itinéraires et d’analyse de réseaux dans une base de données PostgreSQL/PostGIS.
En géomatique, pgRouting permet notamment :
- Le calcul d’itinéraires les plus courts (plus rapide, plus court, multimodal)
- L’analyse de réseaux (accessibilité, graphes, itinéraires multiples)
- Le traitement de grands réseaux routiers directement dans la base de données
NOTE: La documentation officielle de pgRouting est très utile pour explorer toutes les fonctionnalités disponibles.
Installation de pgRouting
Sur un serveur avec PostgreSQL et PostGIS, installez pgRouting :
sudo apt install postgresql-15-pgrouting
Puis activez l’extension dans votre base :
CREATE EXTENSION pgrouting;
Conseil : pgRouting fonctionne sur des graphes stockés sous forme de tables d’arcs (edges).
Préparer un réseau routier
Votre réseau routier doit être structuré sous forme d’une table d’arêtes (edges) :
CREATE TABLE reseau_routier (
id SERIAL PRIMARY KEY,
source BIGINT,
target BIGINT,
geom GEOMETRY(LineString, 4326),
cout DOUBLE PRECISION
);
source
: identifiant du nœud de départtarget
: identifiant du nœud d’arrivéecout
: coût pour parcourir l’arête (distance, temps, etc.)
Vous pouvez utiliser
pgr_createTopology
pour générer automatiquementsource
ettarget
à partir degeom
.
SELECT pgr_createTopology('reseau_routier', 0.0001, 'geom', 'id');
Connexion à pgRouting en Python
Installez les dépendances :
pip install psycopg sqlalchemy shapely
Connexion simple :
import psycopg
conn = psycopg.connect("dbname=geomatique user=postgres password=motdepasse host=localhost")
cur = conn.cursor()
Calculer un chemin le plus court
Supposons que vous connaissez les source_id
et target_id
dans votre réseau :
depart = 1001
arrivee = 1050
cur.execute("""
SELECT seq, id1 AS node, id2 AS edge, cost
FROM pgr_dijkstra(
'SELECT id, source, target, cout AS cost FROM reseau_routier',
%s, %s,
directed := true
)
""", (depart, arrivee))
chemin = cur.fetchall()
for ligne in chemin:
print(f"Étape {ligne[0]}: passer par le noeud {ligne[1]} via l'arc {ligne[2]} (coût {ligne[3]})")
pgr_dijkstra
est l’algorithme classique du plus court chemin.
Autres fonctionnalités pgRouting utiles
- Itinéraire vers plusieurs destinations :
pgr_dijkstraVia
- Calcul de matrices de coûts entre plusieurs points :
pgr_dijkstraCostMatrix
- Recherche isochrone (zones atteignables en distance ou temps) :
pgr_drivingDistance
Exemple de distance de conduite :
SELECT * FROM pgr_drivingDistance(
'SELECT id, source, target, cout FROM reseau_routier',
1001,
2000 -- distance maximum
);
Bonnes pratiques
- Créez des index sur
source
ettarget
pour accélérer les calculs :CREATE INDEX ON reseau_routier(source); CREATE INDEX ON reseau_routier(target);
- Optimisez votre réseau : limitez les arcs inutiles, vérifiez la topologie.
- Utilisez un système de projection métrique (ex : EPSG:2154 pour la France) pour des distances précises.
- Séparez les réseaux dirigés et non-dirigés selon vos besoins.
Cas d’usage en géomatique
- Calcul d’itinéraires de véhicules (livraisons, bus, services d’urgence)
- Analyse de l’accessibilité (distance aux hôpitaux, écoles)
- Construction de matrices Origine-Destination pour les flux de mobilité