Comment créer une matrice de distances (calculées en kilomètres ou en minutes) entre plusieurs points du globe?
Il existe plusieurs solutions commerciales et plus ou moins fermées pour construire ce genre de matrices (The Google Distance Matrix API, Bing Routes API ou MapQuest par exemple). Ces solutions présentent plusieurs inconvénients : limites d’extraction, limites d’utilisation, limite de diffusion…
La solution proposée ici n’utilise que des données et des outils libres :
- Un réseau routier, issu d’OpenStreetMap (OSM).
- Le logiciel Osmosis permettant de manipuler les données OSM.
- L’application GraphHopper pour calculer les itinéraires.
- R pour interroger l’API de GraphHopper et constituer la matrice de distance.
L’objectif est ici de calculer une matrice de distances entre une vingtaine de villes françaises, belges, allemandes luxembourgeoises et néerlandaises.
Ce billet est découpé en 2 parties :
- Préparation des données OpenStreetMap et mise en place de l’application de calcul d’itinéraires
- Interrogation de l’API et constitution de la matrice de distance avec R
1 – Préparation des données OpenStreetMap et installation de l’application de calcul d’itinéraire (GraphHopper)
L’application GraphHopper permet de calculer des itinéraires à partir de données OpenStreetMap. Elle peut fonctionner en local ou en serveur, des clients existent pour Android par exemple. Ici nous allons télécharger les données OSM et les intégrer dans l’application pour une utilisation en local. Nous ne nous servirons ensuite que de l’API.
Téléchargement et préparation des données OSM
Il est possible de télécharger les données OSM pour le Monde entier, un continent, un pays, une région ou une ville. Ces données sont notamment disponible sur le site http://download.geofabrik.de/
Nous avons téléchargé l’ensemble des données OSM sur la zone qui nous intéresse (plusieurs pays et régions).
Fichiers téléchargés :
champagne-ardenne-latest.osm
lorraine-latest.osm
nord-pas-de-calais-latest.osm
picardie-latest.osm
belgium-latest.osm
luxembourg-latest.osm
netherlands-latest.osm
nordrhein-westfalen-latest.osm
rheinland-pfalz-latest.osm
saarland-latest.osm
GraphHopper ne prend en entrée qu’un seul fichier et pour assembler ces différents extraits d’OSM en un seul et même fichier nous avons eu recours à l’application Osmosis.
Après avoir installé le package osmosis et s’être placé dans le répertoire contenant les fichiers OSM il faut ensuite lancer l’instruction suivante dans le terminal :
osmosis --rx champagne-ardenne-latest.osm --rx lorraine-latest.osm --rx belgium-latest.osm --rx nord-pas-de-calais-latest.osm --rx picardie-latest.osm --rx luxembourg-latest.osm --rx netherlands-latest.osm --rx nordrhein-westfalen-latest.osm --rx rheinland-pfalz-latest.osm --rx saarland-latest --merge --merge --merge --merge --merge --merge --merge --merge --merge --wx efbloa.osm
Les fichiers .osm sont assemblés en un seul fichier efbloa.osm
.
Installer l’application et y intégrer les données
L’application s’installe en lançant l’instruction suivante dans le terminal:
git clone git://github.com/graphhopper/graphhopper.git
Instructions disponibles ici : https://karussell.wordpress.com/2013/11/26/graphhopper-an-open-source-and-cost-efficient-alternative-to-google-maps-api/
Cette application indique par défaut les instructions routières de l’itinéraire (tourner à droite sur la rue Machin, rouler pendant 500m etc.). Avant d’intégrer un jeux de données OSM, nous avons désactivé cette fonctionnalité en dé-commentant la ligne 31 du fichier config.properties à la racine du dossier graphhopper :
osmreader.instructions=false
L’opération d’intégration de données dans l’appli peut nécessiter pas mal de mémoire vive, nous allons donc d’abord allouer plus de mémoire à JAVA. En fonction de notre configuration nous allons lui accorder 6 Go en lançant l’instruction suivante dans le terminal :
export JAVA_OPTS="-Xmx6144M"
Après avoir placé le fichier efbloa.osm à la racine du dossier graphhopper nous pouvons ensuite intégrer le jeux de données de la manière suivante :
cd graphhopper
./graphhopper.sh web efbloa.osm
Cette opération prend un temps non négligeable (25minutes).
Nous avons maintenant a notre disposition une API de calcul d’itinéraire disponible en local.
Accès au client web : http://localhost:8989
OpenEdition vous propose de citer ce billet de la manière suivante :
Timothée Giraud (9 mai 2014). Création d’une matrice de distances routières avec des outils et des données libres (1/2). R Géomatique. Consulté le 9 décembre 2024 à l’adresse https://doi.org/10.58079/tp2y
Bonjour, je voudrais tout d’abord vous remercier pour le travail que vous avez fait.
Ensuite je voudrais vous poser une petite question, est ce que cette solution est toujours valide ? car je n’arrive par à installer l’application, l’application est-elle devenue payante ?
J’avoue que je n’en sais rien. J’utilise plutôt OSRM (https://github.com/Project-OSRM/osrm-backend) maintenant. Et j’ai développé le package osrm (https://rgeomatic.hypotheses.org/category/osrm) pour l’interfacer avec R.