Analyse géospatiale de routage avec pgRouting sur ServBay
pgRouting
est un puissant module d’extension pour les bases de données PostgreSQL et PostGIS, offrant une large gamme de fonctionnalités d’analyse de réseau et de routage pour les données spatiales. Avec pgRouting
, les développeurs peuvent effectuer des requêtes complexes sur les données de réseaux viaires, comme rechercher le plus court chemin entre deux points, résoudre le problème du voyageur de commerce (TSP) ou analyser des zones de desserte. Ces fonctionnalités sont précieuses lors de la conception d'applications cartographiques, de solutions de planification logistique, d’analyses du trafic, etc.
Cet article vous guide pas à pas pour activer facilement l’extension pgRouting
sur votre base de données PostgreSQL dans l’environnement de développement local ServBay, puis effectuer une configuration de base et des analyses de routage.
Présentation
ServBay fournit aux développeurs sous macOS un environnement local tout-en-un, préintégrant de multiples serveurs Web, bases de données et langages de programmation. Les packages PostgreSQL fournis par ServBay incluent déjà les extensions pgRouting
et PostGIS
. Cela signifie qu’il n’est pas nécessaire de télécharger ni compiler manuellement ces modules : il suffit de les activer dans votre base de données pour commencer à les utiliser.
Prérequis
Avant de commencer avec pgRouting
, assurez-vous que vous remplissez les conditions suivantes :
- ServBay est installé et en cours d’exécution : Si ce n’est pas déjà fait, téléchargez et installez la dernière version depuis le site officiel ServBay.
- Le package PostgreSQL est installé et démarré sur ServBay : Dans l’interface ServBay, vérifiez que le package PostgreSQL est bien installé et marqué comme « En marche ».
- Connaissances de base en SQL et PostgreSQL : Ce guide part du principe que vous connaissez déjà les bases de PostgreSQL et des requêtes SQL.
- Compréhension des fondamentaux de PostGIS :
pgRouting
s’appuie surPostGIS
pour manipuler les types de données spatiaux et les fonctions associées. Vérifiez que l’extension est activée sur votre base. Les packages PostgreSQL de ServBay incluent généralement PostGIS par défaut.
Installation et activation de l’extension pgRouting
ServBay intègre déjà les fichiers nécessaires à pgRouting
. Il ne vous reste qu’à l’activer sur la base de données de votre projet.
Connexion à la base de données PostgreSQL :
Plusieurs méthodes s’offrent à vous pour vous connecter à PostgreSQL : via la ligne de commande
psql
, des outils graphiques (comme pgAdmin, DBeaver) ou des bibliothèques clientes dans vos langages de programmation.L’outil en ligne de commande
psql
fourni par ServBay est souvent le plus simple. Vous pouvez l’ouvrir rapidement depuis l’interface ServBay via le bouton « Terminal », qui initialise un terminal préconfiguré, ou bien ajouter manuellement le dossier bin de ServBay à votre PATH système.Dans le terminal, connectez-vous à votre base cible (par exemple, une base nommée
servbay_geo_db
avec l’utilisateur par défautservbay
) avec :bashpsql -U servbay -d servbay_geo_db
1Si le nom de votre base de données, d’utilisateur ou votre mot de passe diffèrent, modifiez la commande en conséquence.
Vérification et activation de PostGIS (si non déjà actif) :
Comme
pgRouting
nécessitePostGIS
, veillez à activer ce dernier en premier. Dans l’invitepsql
, tapez :sqlCREATE EXTENSION IF NOT EXISTS postgis;
1Cette commande crée l’extension PostGIS ou l’ignore si elle existe déjà.
Création de l’extension pgRouting :
Sans quitter la connexion en cours, activez pgRouting :
sqlCREATE EXTENSION pgrouting;
1Après exécution, vous devriez voir un message du type
CREATE EXTENSION
.Vérification de l’installation :
Pour lister les extensions installées et vérifier la présence de
pgRouting
:sql\dx
1Dans la liste, vous devriez voir apparaître
postgis
etpgrouting
avec leur description.
Configuration de pgRouting : Préparer les données réseau et créer la topologie
Les algorithmes de pgRouting
s’appliquent à des tables représentant la structure d’un réseau viaire. En général, il s’agit d’une table de segments de voie, chaque segment ayant un nœud source, un nœud cible et un poids (distance, temps, etc.). Pour un calcul efficace, il est nécessaire de générer une structure « topologique », c’est-à-dire un graphe qui décrit la connexion entre les segments (nœuds).
Création d’une table de données réseau
Voici un exemple basique de création d’une table ways
stockant des segments de réseau. Cette table comprend l’ID du segment, l’ID du nœud source, de destination, les coûts de passage (aller/retour) et la géométrie de chaque tronçon (type GEOMETRY
PostGIS).
sql
-- Créer une table pour stocker les données du réseau viaire
CREATE TABLE ways (
id SERIAL PRIMARY KEY, -- Identifiant unique du tronçon
source INTEGER, -- ID du nœud de départ
target INTEGER, -- ID du nœud d’arrivée
cost DOUBLE PRECISION, -- Coût de passage dans le sens direct (ex : distance ou temps)
reverse_cost DOUBLE PRECISION, -- Coût dans le sens inverse
geom GEOMETRY(LineString, 4326) -- Géométrie du tronçon : LineString en WGS 84 (SRID 4326)
);
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
Explications :
SERIAL PRIMARY KEY
: Génère automatiquement un identifiant unique pour chaque segment.source
,target
: Identifiants des nœuds de départ et d’arrivée, générés ou associés lors de la création de la topologie.cost
,reverse_cost
: Pondérations pour chaque segment. Pour un sens interdit, définissezreverse_cost
àNULL
ou à une valeur très élevée.geom
: Contient la géométrie de chaque segment sous forme deLineString
. Le SRID 4326 correspond au système de coordonnées WGS 84.
Insertion de données d’exemple
Insérez quelques segments de route d’exemple dans la table ways
:
sql
-- Ajouter des segments d’exemple
INSERT INTO ways (source, target, cost, reverse_cost, geom) VALUES
(1, 2, 1.0, 1.0, ST_SetSRID(ST_MakeLine(ST_MakePoint(116.4074, 39.9042), ST_MakePoint(116.4084, 39.9052)), 4326)),
(2, 3, 1.0, 1.0, ST_SetSRID(ST_MakeLine(ST_MakePoint(116.4084, 39.9052), ST_MakePoint(116.4094, 39.9062)), 4326)),
(3, 4, 1.0, 1.0, ST_SetSRID(ST_MakeLine(ST_MakePoint(116.4094, 39.9062), ST_MakePoint(116.4104, 39.9072)), 4326));
1
2
3
4
5
2
3
4
5
Explications :
ST_MakePoint(x, y)
: Crée un point (longitude, latitude) avec PostGIS.ST_MakeLine(point1, point2)
: Crée un segment lineaire à partir de deux points.ST_SetSRID(geometry, srid)
: Attribue un système de référence spatiale à la géométrie.- Ces exemples représentent trois segments consécutifs au centre de Pékin, tous de coût 1.0.
Création de la topologie
Une fois la table réseau prête, utilisez la fonction pgr_createTopology
pour générer la topologie, identifier les nœuds et rendre la structure exploitable par les algorithmes pgRouting.
sql
-- Générer la topologie à partir des données du réseau
-- Paramètres :
-- 'ways' : nom de la table
-- 0.00001 : tolérance pour considérer deux points comme un même nœud
-- 'geom' : colonne géométrique
-- 'id' : colonne identifiant du segment
SELECT pgr_createTopology('ways', 0.00001, 'geom', 'id');
1
2
3
4
5
6
7
2
3
4
5
6
7
Explications :
pgr_createTopology
: Fonction principale de pgRouting pour produire le graphe nœuds-arêtes à partir des géométries.- Le paramètre de tolérance définit la distance maximale entre deux points pour être considérés comme identiques. À adapter selon la précision de vos données.
Après exécution, les colonnes source
et target
sont renseignées dans la table ways
, et une nouvelle table ways_vertices_pgr
contenant tous les nœuds est créée.
Utiliser pgRouting : exemples d’analyses de routage
Une fois la topologie générée, vous pouvez appliquer les différents algorithmes de pgRouting pour vos analyses. Voici quelques exemples classiques.
Recherche du plus court chemin (Dijkstra)
Trouver le chemin le plus court entre deux nœuds est l’une des principales fonctionnalités de routage. pgRouting offre une implémentation directe de l’algorithme de Dijkstra.
sql
-- Calculer le plus court chemin du nœud 1 au nœud 4
-- Paramètres :
-- 'SELECT id, source, target, cost FROM ways' : requête décrivant le graphe
-- 1 : ID du nœud de départ
-- 4 : ID du nœud d’arrivée
-- directed := true : graphe orienté (sens direct/reverse distingués)
SELECT seq, id1 AS node, id2 AS edge, cost, geom
FROM pgr_dijkstra(
'SELECT id, source, target, cost FROM ways',
1, -- ID départ
4, -- ID arrivée
directed := true -- Passer à false pour graphe non orienté
)
JOIN ways ON edge = ways.id; -- Jointure pour récupérer la géométrie associée
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
Explications :
pgr_dijkstra
: Lance l’algorithme du plus court chemin.- Le premier paramètre doit renvoyer au moins les colonnes
id
,source
,target
,cost
. Pour prendre en compte les coûts inversés, incluez aussireverse_cost
et réglezdirected
surfalse
. - La jointure avec la table initiale permet d’accéder à la géométrie des segments, essentielle pour la visualisation.
Problème du voyageur de commerce (TSP)
L’algorithme TSP calcule la boucle de coût minimal passant par une série de nœuds donnés.
sql
-- Résoudre le TSP pour visiter les nœuds 1, 2, 3, 4 depuis le nœud 1
-- Paramètres :
-- 'SELECT id, x::float8 AS x, y::float8 AS y FROM ways_vertices_pgr' : coordonnées des nœuds à visiter
-- start_id := 1 : ID du nœud de départ
SELECT seq, node, edge, cost
FROM pgr_tsp(
'SELECT id, ST_X(the_geom)::float8 AS x, ST_Y(the_geom)::float8 AS y FROM ways_vertices_pgr WHERE id IN (1, 2, 3, 4)',
start_id := 1
);
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
Explications :
pgr_tsp
: Résout le problème du voyageur de commerce.- La requête doit retourner au minimum les colonnes
id
,x
,y
pour chaque nœud à parcourir. - Définir le point de départ avec
start_id
.
Analyse de zone de desserte (Driving Distance / Driving Time)
L’analyse de zone de desserte détermine tous les segments atteignables depuis un (ou plusieurs) points de départ dans une limite de coût (distance ou temps).
sql
-- Chercher tous les segments accessibles à moins de 2 unités de coût depuis le nœud 1
-- Paramètres :
-- 'SELECT id, source, target, cost FROM ways'
-- 1 : nœud de départ
-- 2 : coût maximum autorisé
-- directed := true : graphe orienté
SELECT seq, id1 AS node, id2 AS edge, cost, geom
FROM pgr_drivingDistance(
'SELECT id, source, target, cost FROM ways',
1, -- ID départ
2, -- coût max
directed := true
)
JOIN ways ON edge = ways.id; -- Récupère la géométrie pour la visualisation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
Explications :
pgr_drivingDistance
: Calcule la zone de desserte.- Le coût maximum limite l’étendue du réseau analysé (distance ou temps).
- Les résultats peuvent être facilement visualisés avec la géométrie.
Visualisation des résultats de routage
Visualiser les résultats de pgRouting permet de mieux comprendre et communiquer les trajets calculés. Plusieurs solutions existent, en bureau ou pour le Web.
Avec un logiciel SIG de bureau (ex : QGIS)
QGIS est une application gratuite et open source qui se connecte directement à PostgreSQL/PostGIS et peut charger et afficher les résultats spatiaux de pgRouting.
- Ouvrez QGIS.
- Sélectionnez Couche > Gestionnaire de sources de données.
- Dans le menu latéral, choisissez PostGIS.
- Cliquez sur Nouveau pour créer une connexion.
- Entrez vos paramètres de connexion ServBay PostgreSQL (hôte :
localhost
, port :5432
, base :servbay_geo_db
, utilisateur :servbay
, mot de passe : votre mot de passe PostgreSQL). Cliquez sur « Tester la connexion ». - Une fois connecté, naviguez dans la liste de vos tables, dont
ways
etways_vertices_pgr
. - Sélectionnez la table ou la vue à charger (ex : vue du plus court chemin), puis cliquez sur Ajouter pour visualiser le résultat dans QGIS.
Visualisation web (Leaflet ou OpenLayers)
Pour des applications Web, il faut un service backend (en PHP, Node.js, Python, etc., tournant sous ServBay) exécutant les requêtes pgRouting et renvoyant les résultats au format GeoJSON au frontend, qui les affiche avec une bibliothèque cartographique comme Leaflet ou OpenLayers.
Voici une structure HTML de base montrant comment afficher une polyligne statique dans Leaflet. Pour un affichage dynamique :
- Le backend exécute la requête pgRouting.
- Convertit les géométries des segments en GeoJSON ou un format supporté.
- Expose les données via une API accessible au frontend.
- Le frontend charge et affiche les données avec
L.geoJSON
.
html
<!DOCTYPE html>
<html>
<head>
<title>Exemple de visualisation pgRouting sur ServBay</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
<style>
#map { height: 600px; width: 100%; } /* Définir la taille de la carte */
</style>
</head>
<body>
<h1>Visualisation des résultats pgRouting avec ServBay</h1>
<div id="map"></div>
<script>
// Initialisation de la carte centrée sur la zone d’exemple
var map = L.map('map').setView([39.906, 116.409], 14);
// Ajouter la couche OpenStreetMap
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
}).addTo(map);
// Exemple : ajout d’un GeoJSON issu d’une requête pgRouting
// En pratique, geojsonData sera obtenu par requête AJAX auprès du backend
var geojsonData = {
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {
"id": 1,
"cost": 1.0
},
"geometry": {
"type": "LineString",
"coordinates": [
[116.4074, 39.9042],
[116.4084, 39.9052]
]
}
},
{
"type": "Feature",
"properties": {
"id": 2,
"cost": 1.0
},
"geometry": {
"type": "LineString",
"coordinates": [
[116.4084, 39.9052],
[116.4094, 39.9062]
]
}
},
{
"type": "Feature",
"properties": {
"id": 3,
"cost": 1.0
},
"geometry": {
"type": "LineString",
"coordinates": [
[116.4094, 39.9062],
[116.4104, 39.9072]
]
}
}
]
};
// Afficher le GeoJSON sur la carte, style rouge épais
L.geoJSON(geojsonData, {
style: function (feature) {
return {color: "#ff0000", weight: 4};
}
}).addTo(map);
// Ajuster la vue sur les features si valides
if (L.geoJSON(geojsonData).getBounds().isValid()) {
map.fitBounds(L.geoJSON(geojsonData).getBounds());
}
</script>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
Enregistrez ce fichier HTML dans le répertoire racine de votre site ServBay (par exemple /Applications/ServBay/www/pgrouting-demo/index.html
) et accédez-y via ServBay (http://pgrouting-demo.servbay.demo
). Ce code montre l’intégration de GeoJSON dans Leaflet ; pour de vraies analyses, les données doivent être générées dynamiquement côté backend.
Conseils et recommandations
- Qualité des données : Les résultats de
pgRouting
dépendent fortement de la qualité et de la cohérence du réseau fourni. Vérifiez vos données avant toute analyse. - Performance : Sur des grands réseaux, les calculs peuvent être longs. Utilisez les index, limitez la taille du graphe ou privilégiez les algorithmes les plus adaptés.
- Mémoire : Les grands réseaux topologiques peuvent être gourmands en RAM. Assurez-vous de disposer de ressources suffisantes côté serveur PostgreSQL.
Foire aux questions (FAQ)
Q : J’ai une erreur « extension inexistante » lors du CREATE EXTENSION pgrouting;
, que faire ?
R : Assurez-vous d’abord que le package PostgreSQL de ServBay est bien installé et démarré. Vérifiez ensuite que la version de votre base supporte pgRouting et que ServBay contient bien cette extension (c’est généralement le cas). En cas de doute, consultez les logs de ServBay ou de PostgreSQL pour plus de détail. Connectez-vous aussi avec un utilisateur ayant les droits requis (ex : servbay
).
Q : Comment choisir la valeur de tolérance dans pgr_createTopology
?
R : Adaptez-la à la précision de vos données. Elle définit la distance maximale entre deux sommets pour qu’ils soient considérés comme un même nœud. Pour des coordonnées GPS précises, visez 0.000001 ou moins. Pour des jeux de données moins précis ou venant de multiples sources, augmentez un peu. Une tolérance trop grande risque de relier des segments qui ne devraient pas l’être.
Q : Comment gérer les sens uniques ou interdictions de demi-tour ?
R : Les colonnes cost
et reverse_cost
de la table ways
servent justement à ça. Pour un tronçon à sens unique, fixez reverse_cost
à NULL
ou à une valeur très élevée pour interdire le passage. Les interdictions de demi-tour nécessitent une modélisation réseau plus sophistiquée ou une post-traitement des résultats. pgRouting offre des fonctions avancées pour gérer de tels cas.
Conclusion
Grâce à ServBay, il devient très simple de mettre en place localement une base PostgreSQL compatible avec pgRouting
. Quelques commandes SQL suffisent à activer les extensions, structurer votre réseau et générer la topologie, pour ensuite exploiter tout le potentiel analytique de pgRouting. En associant des outils SIG bureautiques ou des bibliothèques cartographiques web, vous pourrez facilement visualiser vos résultats de routage et enrichir vos applications avec des fonctions géospatiales avancées. ServBay simplifie la configuration pour vous permettre de vous concentrer sur la logique métier et l’innovation.