OSRM est un moteur de calculateur d’itinéraire open source très léger, très efficace et utilise les données Openstreetmap. Il se démarque des autres moteurs de calculateurs d’itinéraires en utilisant l’algorithme Contraction hiérarchies moins répandue que le A* par exemple.
Sur le papier tout à l’air parfait! Commençons par l’installer.
Installation
A la base j’avais une distribution Lubuntu 14.04 32bits sur mon petit serveur mais je me suis vite rendu compte que OSRM ne pouvait s’installer que sur les distributions en 64 bits. Après avoir réinstallé le serveur avec une version 64 bit de Lubuntu, j’étais prêt!
Entrons dans le vif du sujet en installant les dépendance dont nous allons avoir besoins:
sudo apt-get install build-essential git cmake pkg-config libprotoc-dev libprotobuf8 \
protobuf-compiler libprotobuf-dev libosmpbf-dev libpng12-dev \
libbz2-dev libstxxl-dev libstxxl-doc libstxxl1 libxml2-dev \
libzip-dev libboost-all-dev lua5.1 liblua5.1-0-dev libluabind-dev libluajit-5.1-dev libtbb-dev
On clone le répertoire d’OSRM :
git clone https://github.com/Project-OSRM/osrm-backend.git
On se place dans le dossier qui vient d’être créé
cd osrm-backend
On compile OSRM…
mkdir -p build; cd build; cmake ..; make
On est dans donc dans le repertoire « osrm-backend/build »
On crée un lien symbolique des « profiles » dans ce dossier. C’est ici, que l’on choisit le profile voiture ou piéton par exemple.
ln -s ../profiles/car.lua profile.lua
ln -s ../profiles/lib/
On va déplacer le contenu du répertoire « osrm-backend » qui se trouve dans mon « Home » vers /opt/osrm que l’on va créer. C’est plus propre.
cd ..
sudo mkdir /opt/osrm
sudo mv * /opt/osrm
On se place dans ce nouveau répertoire:
cd /opt/osrm
On va maintenant créer un répertoire qui va accueillir les données. On le nommera OSRMfiles:
sudo mkdir OSRMfiles
cd OSRMfiles
On va télécharger les données Openstreetmap en pbf sur http://download.geofabrik.de/europe/france.html. Dans mon cas et compte tenu de ma petite configuration je n’ai pris que la région Rhône-Alpes.
sudo wget http://download.geofabrik.de/europe/france/rhone-alpes-latest.osm.pbf
On se déplace dans le répértoire /build ou se trouve l’appli compliée, puis on extrait le .pbf
cd /opt/osrm/build
sudo ./osrm-extract /opt/osrm/OSRMfiles/rhone-alpes-latest.osm.pbf
Cela peut durée un certain temps, sans que rien ne se passe. 3 minutes dans mon cas.
Il faut désormais « préparer » les données
sudo ./osrm-prepare /opt/osrm/OSRMfiles/rhone-alpes-latest.osrm
C’est presque terminé. Il faut maintenant créer le fichier de configuration server.ini (toujours dans le répertoire « build ») qui va pointer vers les fichiers que l’on a généré lors de l’étape précédente, lui indiquer le nombre de « Threads à utiliser, les IP et le port qu’il doit écouter
sudo nano server.ini
Threads = 2
IP = 127.0.0.1
Port = 5000
hsgrData= ../OSRMfiles/rhone-alpes-latest.osrm.hsgr
nodesData= ../OSRMfiles/rhone-alpes-latest.osrm.nodes
edgesData= ../OSRMfiles/rhone-alpes-latest.osrm.edges
ramIndex= ../OSRMfiles/rhone-alpes-latest.osrm.ramIndex
geometry= ../OSRMfiles/rhone-alpes-latest.osrm.geometry
fileIndex= ../OSRMfiles/rhone-alpes-latest.osrm.fileIndex
namesData= ../OSRMfiles/rhone-alpes-latest.osrm.names
server.ini
L’installation est terminé! Néanmoins vous pouvez être confronté à des problèmes si votre serveur manque de RAM. J’ai ainsi du augmenter mon SWAP de 600Mo à 6Go
J’ai également dû modifier /etc/sysctl.conf en lui ajoutant :
kernel.shmall = 1152921504606846720
kernel.shmmax = 18446744073709551615
puis : sysctl -p
On lui indique où sont les données
sudo ./osrm-datastore ../OSRMfiles/rhone-alpes-latest.osrm
On démarre le service en utilisant le Shared-Memory (optionnel)
sudo ./osrm-routed --sharedmemory=yes
Si vous avez un message : » running and waiting for requests » C’est que tout fonctionne!
Mais ce n’est pas très pratique… On va créer un « service » pour pouvoir le démarrer, l’arrêter, etc.
Pour cela, on va créer 2 fichiers.
sudo nano /etc/init/osrm.conf
Celui ci va contenir :
# osrm
description "Open Source Routing Machine"
author "delawen <[email protected]>"
# Stanzas
#
# Stanzas control when and how a process is started and stopped
# See a list of stanzas here: http://upstart.ubuntu.com/wiki/Stanzas#respawn
# When to start the service
start on runlevel [2345]
# When to stop the service
stop on runlevel [016]
# Automatically restart process if crashed
respawn
# Essentially lets upstart know the process will detach itself to the background
expect fork
exec osrm
/etc/init/osrm.conf
Puis l’autre:
sudo nano /usr/bin/osrm
#!/bin/bash
#This script assumes you have your OSRM compiled on the /opt/osrm folder.
echo "Starting OSRM..."
cd /opt/osrm/build/
./osrm-datastore ../OSRMfiles/rhone-alpes-latest.osrm
./osrm-routed --sharedmemory=yes &
echo "OSRM started"
cd $pwd
Il faut bien sur leur donner les droits d’exécution
sudo chmod 0755 /etc/init/osrm.conf
sudo chmod 0755 /usr/bin/osrm
Le service osrm est créé. On peut voir sont statut en faisant : sudo service osrm.
Pour le démarrer : sudo service osrm start
Utilisation
Il n’y a plus qu’a lui demander un itinéraire! Pour cela on utilise une URL structurée ainsi :
http://serveur:port/viaroute?loc=y1,x1&loc=y2,x2
Ou concrètement dans mon cas :
http://localhost:5000/viaroute?loc=45.18452,5.72094&loc=45.36348,5.58775
On obtient quelque chose qui peut sembler étrange :
{"hint_data":{"locations":["a54BAP ____ 9gHQAAMQAAADYAAAAAAAAACgAAAD-1CwAbdrEChEtXAAAAEQA","rG4EAK5uBABuVAAARQAAABEBAADNAAAAHgAAAGLQAAAYMbQCxkJVAAIAEQA"],"checksum":3140728172},"route_name":["",""],"via_indices":[0,393],"via_points":[[45.18454,5.720964],[45.36348,5.587654]],"found_alternative":false,"route_summary":{"end_point":"Rue Docteur Butterlin","start_point":"Place Jacqueline Marval","total_time":1494,"total_distance":27302},"route_geometry":"u`zduAgwd|IjAsBtAiC{EyGqAdCaN~W_RdGiMlEoC`AsIdD]zFi@~Ia@fH{Bt_@[hF}ArWSbDs@zL_@hGUxDsGgBio@kOqa@wJsNkD{JoCcGmAiBYkCa@cEeAce@_M{]yIaIiBcFgAiDu@{FqAqK_CoHaB}Cq@oKcCyScFiBc@aE_AeCg@yGsAkFeAqDeAsTmF}Cs@cGaBoKsCgB]{BQoFv@_Dx@yCr@{v@tc@uCfB{BvAeFhDcH~FkF|KyEnLkGaA}Ni@}H`@qR^wBFaCF}CJkTn@yLTiIv@}Dt@gCj@wBd@cPtCqFbAwdAdUmCn@{JbAoEz@iShDkCd@aDw@wCdGlCjG}FdEuD|CeOzJeC`BaC~AaEtCaKlH_S`Oy]bYwVpQqMtEeVnKiP~KuLrJ{JlJyN`PwUrZ{h@`u@a|AbwBeTh]sO~ZsItU_Prm@a\\hqAkJ|_@{GxVwSzs@kVjt@gcAlgD_i@ndBuUjw@qTzw@id@rhB_Qzt@sZf_BoVl~AyPjqAiQtrAuTlhBmVpaBuK~j@uNfp@_^fpAud@psAgjBbkFmaAlbC}^r{@gVjg@ga@xs@mWfa@oL|Qub@hj@}a@vd@_b@da@_u@~l@oeChcBis@bf@iLfIcuAz~@qpAv{@mqBftA}vAjz@qBdAivAnu@av@|^ou@d\\}nAvh@{|Atl@yUpKka@|QckApk@uhAvl@wsAvz@ghA~s@knDf~Bi`BpeAakArx@y}@`w@{v@~z@mr@v|@yg@nt@{|@frAiz@xnAwt@diAiGnJgVbb@e^`n@ut@fyAar@|_BcmA~pCoG`Man@zlAwv@xnAer@laA_fB|}BiyBrtCmkAzwAsn@~o@co@dj@od@n\\o\\lSaF|C_i@rX}i@zUetF`uB_lBju@klBhq@oJ~C_tAzc@uVfHcx@fUgLzCca@pKka@dE}X~Agk@dEq`@rC_a@hIsQhD}~Abj@k_@lMc[bHkzAzQavArMydCnIsK~Aoz@yBen@}Asx@qFkV}BcGs@eT_DsS{CyQmC}uBs`@u[gGuj@uIof@{D}EWsScAeJi@eh@mAae@A_k@rAyb@bCyl@fGih@bJgq@fOmg@|P_p@rX_f@dUckA|o@yjAhs@obBziAkbAxs@_cA|w@a|@nu@ufA~aAk_Ax_Amx@ny@is@dw@q|@fdA_v@laAww@rfAay@rkAat@|hAshAxmBoc@zx@k_@~t@aN|Xus@hyAqiBhyDg^|t@geAdqBwaAjbB}dA|cBqgB|wCq\\|m@{\\|n@o_@nw@}W`o@_^h|@a]t~@cz@xeCaTbn@qRzg@}Spf@kPxZyQzYui@lv@wu@~bAkXf`@gWn_@{Udc@kQra@_Sze@m]ldAi}Bp{G_GbQmXbs@cZvbAkIvVyJvRgLjMcJdFqHbDsIv@mMsBaMsJaQoTeSwf@u\\mnAaTkq@qPci@yNu[qLeU}E{GsG_EyCq@oGM{Fz@kG|BoE|CcHfF}DK_EnAcE`FuGnCgHIkh@_OquCoVc]uCgt@wEc}DfDux@b@i[vFkSfJyKfHcLdFqFwBeDLuCnAmHY}JoG{OePaHeLmEgL{EgO_EmSwBkNyBqRmAmKXyEz@cFvAoEa@{DkBmBeC{DyAmCuI_n@aPet@wJiZwEoLyFeLsIiMwH}H}`@cb@_N{JyGaIsEeMqCcNsBsNu@yH_BwQoBkPcD}Lag@esA{T_g@uCcFor@gi@uI{GoOaaAs@sEg@oD|gAwQpc@iWqJ}j@oGwd@aBkH_BiF{DoGsAwCz@mDwA_E^yCBsCYsDkBaLqRcjA_DcSuDkd@oCmZaDo_@hUoGdUmFtHMltAx@","status_message":"Found route between points","status":0}
Dans le prochain article, je vais revenir sur ce résultat et expliquer comment exploiter ce service par un exemple !