Itinéraires Google Maps et Encoded Polyline Algorithm Format

On a tous utilisé les services web en ligne de calcul d'itinéraire avec maps.google.com...

On peut aussi utiliser la Google Maps API si on souhaite faire une intégration dans son propre site web ou blog. Et on peut aussi utiliser les serices web REST de la Google Maps API pour une intégration coté server.

L'itinéraire est explimé de façon textuelle et aussi à travers un tracé founi de façon encodé via l'Encoded Polyline Algorithm Format. C'est ce que nous alons voir ici. Et notamment une solution de décodage en Java.

Calcul d'itinéraire avec Google Maps API

L'API Google Maps est là depuis longtemps. On notera simplement que depuis le V3, il n'est plus nécessaire d'avoir à manipuler de clé. Pour ce qui est de l'accès gratuit, on peut invoquer 2500 fois les services web Google Maps par tranche de 24h.

Pour ce qui est de la techno client, on peut opter classiquement pour du JavaScript. Mais on a aussi la Google Maps API for Flash.

On a aussi aussi la possibilité d'invoquer les services web de cartographie de façon agnostique : par simples requêtes Http en style REST pour obtennir un résultat textuel en Xml ou Json avec Google Maps API Web services .

Par exemple pour un calcul d'itinéraire, ici de Concorde au Trocadero :

concorde-trocadero

L'url pour obtenir une version purement textuel de cet itinéraire : http://maps.google.com/maps/api/directions/json?sensor=false&origin=trocadero,paris&destination=concorde,paris&mode=walking

On notera dans la réponse l'élément overview_polyline :

{
  "status": "OK",
. . .
      "duration": {
        "value": 1902,
        "text": "32 minutes"
      },
      "distance": {
        "value": 2579,
        "text": "2,6 km"
      },
    "overview_polyline": {
      "points": "isfiH{t}L@aBf@{@eHma@i@uFw@o_@LmAx@aDRqCMyE}@}|ABa@Vw@@_DMm@H[?mCCi@e@MqA{@",

On a une description textuelle de l'iténéraire avec aussi une description graphique sous forme de polyline : ensemble de segments ou liste de points GPS.

Cette liste est verbeuse et Google en propose une version encodé au format Encoded Polyline Algorithm Format : un encodage base64 de la latitude et de la longitude.

Polyline et encodage Encoded Polyline Algorithm Format

Le mathématicien McClure propose sur son site les algorithmes d'encodage et de décodage. Par exemple on peut utiliser le décodeur en ligne pour obtenir les 20 points GPS correspondant à l'itinéraire ci-dessus.

Avec le décodeur ci-dessus, la polyline Concorde-Trocadero encodée en isfiH{t}L@aBf@{@eHma@i@uFw@o_@LmAx@aDRqCMyE}@}|ABa@Vw@@_DMm@H[?mCCi@e@MqA{@ donne :

48.86341, 2.28702
48.86340, 2.28751
48.86320, 2.28781
48.86467, 2.29332
. . .
48.86516, 2.32041
48.86557, 2.32071

markers-trocadero-concorde

Un click dans l'image ci-dessus, permet d'accéder à la version interactive...

Ce décodeur est écrit en Javascript, voir le code source : decode.js.

Décodage de la polyline en Java

Cas de figure : on souhaite développer un serveur en Java, s'appuyant sur les services web REST de calcul d'itinéraire Google Maps. Notre serveur pourra décoder la polyline représentant l'itinéraire pour, par exemple, insérer l'insérer dans une base de données géographique : typiquement dans PostGIS.

Sur son site web, McClure mentionne un portage Java de son algorythme d'encodage : JavaPolylineEncoder. Mais pas de lien pour l'opération inverse : le décodage.

Le code javascript decode.js, vu ci-dessus, peut facilement être porté en Java. C'est ce que j'ai été amené à faire. github Si vous en avez l'utilité, vous pouvez télécharger le code de GitHub : polyline-decode. C'est un petit projet complet avec build Maven et tests unitaires. Vous pouvez utiliser uniquement la classe PolylineDecoder.java.

Commentaires

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

La discussion continue ailleurs

1. Le vendredi, novembre 29 2013, 14:34 par Pearltrees

M2

Discover a selection of related articles on Pearltrees...

URL de rétrolien : http://blog.scoutant.org/index.php?trackback/4