Développer une application avec pgrouting sous Windows (1)

Voici une série d’articles permettant de mettre en place une application web de routage (calcul d’itinéraires) totalement autonome, c’est à dire n’utilisant aucun service web ni api pour le calcul de l’itinéraire.
Nous mettrons en place la base de données contenant le réseau routier (ou fluvial, etc.) avec Postgresql, puis nous mettrons en place un flux wms avec Geoserver et, enfin, nous développerons une page de calcul avec OpenLayers 3. Le tout sous Windows.

Dans ce premier article nous verrons la mise en place de la base de données du réseau.
Vous devrez avoir une installation opérationnelle de PostreSQL/Postgis. Si ce n’est pas le cas, reportez vous à l’article Débuter avec PostgreSQL/Postgis .

Installation de pgrouting

Pour les calculs de routage, nous utiliserons l’extension de Postgis pgrouting. Elle est installée, en principe, avec les nouvelles versions de Postgis. Pour vous en assurer, ouvrez pgAdmin III et exécutez la requête SQL suivante:

SELECT pgr_version();

Vous devez avoir un résultat de ce type:

vérification de la version de pgrouting Si pgrouting n’est pas installé :

  1. Téléchargez le fichier zip de pgRouting zip file pour votre système (32 or 64 bit) à partir de Winnie.
  2. Décompressez le fichier. Vous trouverez trois répertoires : bin, lib et share folders et deux fichiers texte.
  3. Copiez ces fichiers et ces répertoires dans le répertoire de votre installation Postgres (dans mon cas C:\Programmes\PostgreSQL\9.5)
  4. Dans pgAdmin III sélectionnez votre base de données Postgis et exécutez la requête SQL suivante:
CREATE EXTENSION pgrouting;

Vérifiez avec la requête suivante que l’installation s’est bien terminée

SELECT pgr_version();
Si la version que vous avez n’est pas la dernière (2.2.3), téléchargez et mettez à jour votre version. Toute la série de ces articles est réalisée avec cette version et sachez que la syntaxe de nombreuses commandes de pgrouting a été modifiée. Si vous essayez d’exécuter les requêtes indiquées ici avec d’anciennes versions vous risquez des messages d’erreur comme celui-ci:

s2 Mise en place des données

Nous allons prendre le cas le plus simple, mais si vous avez déjà une base de données de réseau, vous devrez vous inspirer de cet exemple pour faire le nécessaire à son utilisation avec pgrouting.

Dans notre cas, nous allons télécharger les données openStreetMap de la Bretagne.

Nous les téléchargeons à partir de Geofabrik (http://download.geofabrik.de/europe/france/bretagne.html).

Vous avez plusieurs formats disponibles (osm,shp,pbf). Quel qu’il soit votre choix, il y aura du travail à faire pour rendre utilisable les données une fois chargées dans votre base Postgis. Le format qui donne le moins de travail et les meilleurs résultats finaux est le format osm. De plus, il y a un outil (osm2pgrouting) qui permet le chargement et la création de la topologie en une seule passe.

Import des données OSM avec osm2pgrouting

Dans les dernières versions de Postgis, cet outil est installé automatiquement. Vérifiez que le fichier C:\Program Files\PostgreSQL\9.5\bin\osm2pgrouting.exe est bien présent dans votre installation.

Si ce n’est pas le cas, téléchargez la version de l’outil correspondante à votre installation  à partir de winnie. Décompressez le fichier et suivez les instructions d’installation contenues dans le fichier osm2pgrouting_Readme.txt.

Pour simplifier vos lignes de commande, ajoutez le répertoire \Program Files\PostgreSQL\9.5\bin à votre variable d’environnement PATH.

Pour utiliser l’outil vous devrez ouvrir une fenêtre d’invites de commande.

Pour avoir la syntaxe complète de l’outil vous pouvez rentrer

osm2pgrouting.exe –help

Les éléments indispensables pour lancer l’outil:

  • le nom du fichier osm à charger (bretagne-latest.osm)
  • le nom de la base de données postgis (postgis_22_sample)
  • le port d’écoute de votre installation Postgresql (5432)
  • le nom de l’hôte (localhost)
  • le nom du fichier config xml : deux fichiers sont fournis avec l’outil mapconfig.xml (générique) et mapconfif_for_cars.xml (pour les automobiles)

Voici donc un exemple de ligne de commande

osm2pgrouting.exe –clean=1 -f bretagne-latest.osm -d postgis_22_sample -p 5432 -h localhost -c mapconfig_for_cars.xml

Le paramètre clean=1 indique d’écraser les tables existantes. Cette commande charge les données dans plusieurs tables, mais génère aussi la topologie correspondante. Pour pgrouting la table de base est la table ways (routes) et la topologie créée la table ways_vertices_pgr.

exécution de osm2pgroutingUne fois la commande exécutée, vous trouverez une série de nouvelles tables dans votre base

pg7Les seules tables que vous utiliserez pour votre application de routage sont ways (réseau linéaire) et ways_vertices_pgr (nœuds du réseau).

Import de données sans osm2pgrouting

Si vous téléchargez les données de Geofabrik au format shapefile ou si vous avez des données avec ce format, c’est un peu plus long.

Vous devez commencer par charger votre shapefile contenant le réseau linéaire dans votre base PostgreSQL/Postgis. Si nécessaire, reprojetez vos données en Géographique WGS84 car tous les outils de routage de pgrouting fonctionnent sur des données en latitude/longitude.

Référez-vous à l’article Débuter avec PostgrSQL/Postgis -Introduction à pgAdmin3 pour le chargement d’un shape dans Postgis.

La table créée correspond à la table ways du chapitre précédent. Il faut créer donc la table des noeuds (ways_vertices_pgr) à travers la génération de la topologie du réseau. Pour que la suite soit plus simple, on considérera que vous avez dénommé votre table ways et que vous l’avez placée dans le schéma public.

Ceci se fait par la commande SQL pgr_createTopology. Mais cette commande assume que votre table contient deux colonnes dénommées source et target.

Voici donc les commandes à rentrer dans la fenêtre SQL de pgAdmin III .

commande sql de génération de la topologieLa valeur de 0.00001 correspond à la tolérance en degrés, geom au nom du champ géométrie et gid au champ identifiant de la table.

A l’issue de cette commande vous trouverez la table ways_vertices_pgr dans votre base PostgreSQL.

Validation de vos données dans Postgis

Dans un monde idéal, vous pourriez passer directement à la mise en place de votre serveur de données sous Geoserver. Mais, il y a de fortes chances pour que les choses ne marchent pas comme il faut…

Nous allons voir les problèmes les plus courants, en vous laissant le soin d’en découvrir par vous mêmes un tas d’autres problèmes!

Tout d’abord, nous allons utiliser QGis pour tester notre base et le fonctionnement des différents algorithmes de routage.

Tests de pgrouting avec QGis

Vous commencerez par vous connecter sur votre base Postgis et charger la couche ways:

connexion à la base postgis à partir de qgiscouche ways chargée dans QGisPour exécuter les commandes sql de pgrouting sur votre base, à partir de QGis, ouvrez le gestionnaire de bases de données

gestionnaire de bases de données de qgisPuis, sélectionnez votre base de données Postgis dans la liste des bases de données et ouvrez une fenêtre SQL

fenêtre sql du gestionnaire de bases de données de qgisC’est dans cette fenêtre supérieure que nous allons rentrer les commandes sql de pgrouting.

La fenêtre inférieure listera les enregistrements de la table résultant de la commande sql.

En cochant la case du bas Charger en tant que nouvelle couche, on chargera le résultat dans la fenêtre cartographique de QGis.

Exemple:

exemple d'utilisation de la fenêtre sql du gestionnaire de bases de données de qgisLa commande SQL correspond à la recherche d’itinéraire dans pgrouting avec l’algorithme A*, en partant du nœud 69072 et arrivant au nœud 64204

Le bouton Exécuter envoie la commande à la base Postgres et récupère le nombre de lignes (30 lignes dans cet exemple) correspondantes à l’itinéraire et affiche dans la fenêtre du bas ces lignes dans l’ordre de l’itinéraire.

Si on demande maintenant de charger la couche dans QGis, c’est bien les données de cette fenêtre inférieure qui seront affichées dans la fenêtre cartographique.

Problème : il n’y a pas de colonne géométrie dans le résultat. Nous ne pourrons pas afficher l’itinéraire en tant que couche.

Pour contourner ce problème, nous allons ajouter la géométrie dans les résultats de la commande. C’est un peu compliqué à expliquer, alors passons directement à comment le faire:

Nous allons faire une jointure entre le résultat de l’algorithme pgr_astar(…) (Tout ce qui est entre parenthèses sont les paramètres de l’algorithme), qui ne renvoie pas dans le résultat les géométries mais seulement les identifiants des nœuds (edges), et la table des nœuds, puis avec la table des routes (ways):

SELECT seq, id1 AS node, id2 AS edge,  the_geom
FROM pgr_astar( ‘SELECT gid as id, source, target,cost, x1, y1, x2, y2  FROM public.ways’, 69072, 64204, false, false ) as res
  JOIN public.ways ways_vertices_pgr
  ON res.id2 = ways_vertices_pgr.gid ;

En clair, on cherche le nœud correspondant au edge du résultat et on récupère le tronçon linéaire qui lui est joint par la topologie. Maintenant on peut ajouter dans les champs résultat du select le champ the_geom qui nous permettra de tracer le résultat dans QGis.

résultat de la jointure avec la topologiePour charger la couche dans QGis, cochez la case Charger en tant que nouvelle couche, sélectionnez le champ géométrie, puis cliquez sur le bouton Charger.

résultat du chargement du résultat de pgrouting dans qgisMaintenant que nous avons vu comment tester notre base de données, nous verrons les principaux algorithmes proposés par pgrouting, et quelles modifications dans les données on doit faire pour que ceux-ci fonctionnent correctement… mais tout ceci dans le prochain article.

3 réflexions sur « Développer une application avec pgrouting sous Windows (1) »

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *