OSRM : utilisation

Suite à l’article précédent concernant l »installation d’OSRM, on va maintenant s’atteler à son utilisation.

Le serveur va répondre à des requêtes HTTP. Dans l’URL on lui passera le service a utiliser ainsi que le ou les paramètres de la façon suivante:

http://server:5000/service?param1=value&m2=value&…&mN=value

L’API propose plusieurs services :

  • Localisation d’un noeud ( /locate?loc=lat,lon)
  • Le nœud le plus proche d’une rue (/nearest?loc=lat,lon)
  • Le calcul d’itinéraire entre au moins 2 points (/viaroute?loc=lat1,lon1&loc=lat2,lon2)
  • Le calcul d’une matrice des temps (/table?loc=lat1,lon1&loc=lat2,lon2&loc=lat3,lon3&loc=lat4,lon4&…&latN,lonN)
  • Le « Map matching » à partir de points GPS  (/match?loc=lat1,lon1&t=0&loc=lat2,lon2&t=7&loc=lat3,lon3&t=14&geometry=false&classify=true)

Pour la suite de l’article, on va s’intéresser au calcul d’itinéraire en appelant donc le service « viaroute ».

Ce service attend comme paramètres obligatoires au moins deux paires de coordonnées (départ/ destination) mais il est possible de lui en donner d’autres pour créer des points de passages. Les autres paramètres optionnels sont :

  • &z={0,...,18} : L’échelle a laquelle les données vont être affichées afin d’adapter la géométrie retournée. Plus c’est faible, plus la géométrie sera grossière et le poids faible.
  • &output={json, gpx} : Format en sortie
  • &jsonp=_function_ : Retourne le résultat encapsuler dans une fonction.
  • &instructions={true, false} : Retourne les instructions de routing.
  • &alt={true, false}: Retourne les routes alternatives.
  • &geometry={true, false} : Retourne la géométrie de l’itinéraire.

Pour l’exemple nous n’allons pas utiliser de paramètres optionnels. Nous aurons donc (par défaut) une simplification  de la géométrie au zoom 18 (la plus précise), un format en JSON et bien sûr, la géométrie encodée à la façon Google avec 6 décimales.

L’exemple est accessible ici

Capture_OSRM

L’objectif est de réaliser un simple calculateur d’itinéraires qui affiche sur une carte Leaflet la route empruntée. Les définissions des positions de départ, destination et points intermédiaires se font grâce aux clique sur la carte. Il est également possible de supprimer un marker  (en cliquant sur ce dernier), modifier sa position (en le faisant glisser) ou d’ajouter un point intermédiaire en cliquant sur la ligne.

Les requêtes « viaroute » sont envoyées en GET vers une page PHP qui communique avec le serveur OSRM. Cela permet éventuellement de traiter la donnée côté serveur ou de contrôler les accès et surtout d’utiliser le port 80 qui n’est jamais fermé contrairement au 5000 port par défaut d’OSRM.

En réponse nous obtenons un JSON dont voici un exemple.

{"hint_data":{"locations":["j6ABAP____9RHAAAKQAAAC4AAAAAAAAABwAAAAURCgAAAAAAG3axAoRLVwAAABEA","tngEALh4BADSVwAALAAAALAAAACEAAAAEwAAAC7VAAAAAAAAGDG0AsZCVQACABEA"],"checksum":1000300994},"route_name":["",""],"via_indices":[0,396],"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":1229,"total_distance":27303},"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@yGsAwH_BeBk@sTmF}Cs@cGaBoKsCgB]{BQcFDgD`@}C|B{v@tc@uCfB{BvAeFhDcH~FkF|KyEnLkGaA}Ni@}H`@qR^wBFaCF}CJkTn@yLTiIv@}Dt@gCj@wBd@cPtCqFbAwdAdUmCn@{JbAoEz@iShDkCd@aDw@wCdGlCjG}FdEuD|CeOzJeC`BaC~AkDvBaHlFuB|AiLzIod@h^wVpQqMtEeVnKiP~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{DyAmC_Gqb@uAmJaPet@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_@hUoGvA]lRoEtHMltAx@","status_message":"Found route between points","status":0}

Dans notre application, seule la géométrie nous intéresse.  Nous utilisons un plugin afin de convertir côté client cette géométrie encodée en géométrie Leaflet.

Rien de bien compliqué donc, mise à part peut être la partie ou il faut trouver à quel rang doit être ajouter le point intermédiaire que l’on vient de créer.

Vous pouvez télécharger le code source de l’application ICI

 

Laisser un commentaire

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