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 <marias@emergya.com>"
# 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 !