· Tech watch

Géolocalisation : Google vs. Yahoo

Google et Yahoo fournissent un service de géolocalisation (geocoding en anglais), c’est à dire un service permettant d’obtenir la longitude et latitude d’un lieu en fonction de son adresse. Cela permet notamment de positionner ce lieu sur une carte, ou de calculer des distances entre plusieurs lieux.


L’accès à ces services se fait simplement via une requête HTTP. Et comme rien ne vaut un bon exemple, voici comment appeler le service Google pour localiser « 37 boulevard des capucines, Paris » :
http://maps.google.com/maps/geo?q=37+boulevard+des+capucines%2Cparis&output=xml&key=…

Et voici la même requête mais via Yahoo cette fois-ci :
http://local.yahooapis.com/MapsService/V1/geocode?street=37+boulevard+des+capucines&city=…

Maintenant que le décor est planté, comparons d’un peu plus près ces deux services.

Saisie de l’adresse

Avec Yahoo, l’adresse est entrée avec plusieurs paramètres :
| paramètre | valeur |
| street | 37 boulevard des capucines |
| city | Paris |
| zip | 75002 |
| state | France |

Il n’est pas obligatoire de renseigner tous les paramètres, mais évidemment, plus on en renseigne, plus on a de chances de lever les ambigüités.
Exemple :
La recherche de city=Lancaster renvoie un très grand nombre de solutions :

<ResultSet>
<Result precision="zip">
<Latitude>34.698905</Latitude>
<Longitude>-118.144779</Longitude>
<City>Lancaster</City>
<State>CA</State>
<Country>US</Country>
</Result>

<Result precision="zip">
<Latitude>39.571800</Latitude>
<Longitude>-95.302239</Longitude>
<City>Lancaster</City>
<State>KS</State>
<Country>US</Country>
</Result>

etc...

Si l’on précise que l’on souhaite city=Lancaster, state=UK , une seule réponse est retournée :

<ResultSet>
<Result precision="zip">
<Latitude>54.044535</Latitude>
<Longitude>-2.799029</Longitude>
<City>Lancaster, Lancashire</City>
<State>United Kingdom</State>
<Country>GB</Country>
</Result>
</ResultSet>

Yahoo propose également une alternative à la saisie des paramètres street, city, zip, et state. Il est possible de saisir un seul paramètre : location, contenant l’adresse complète. Cette solution est moins efficace que la solution précédente, mais dans certains cas où les adresses ont été stockées de manière peu formalisée, il n’est pas possible de séparer la rue, la ville, le code postal et le pays.

Contrairement à Yahoo, Google ne permet la saisie que via un seul paramètre :

| paramètre | valeur |
| q | 37 boulevard des capucines, Paris |

Pour faciliter l’interprétation par Google de l’adresse saisie, il est préférable d’utiliser la virgule pour séparer la rue, la ville, le code postal, et le pays.

Cependant, cela montre une lacune importante : les ambigüités peuvent être beaucoup plus nombreuses qu’avec Yahoo. Par exemple, si on recherche q=Georgia , Google va-t-il retourner le pays ? L’état américain ? Une ville ? Une rue d’Angleterre ?
Donc comme pour Yahoo, plus l’adresse est complète, moins il y a d’ambigüités :
q=Georgia,USA ,
q=Georgia,UK .

Mais il s’agit d’un point qui peut dans certain cas s’avérer très gênant.

Format de sortie

Yahoo propose 2 formats de sortie : xml ou php serialisé. Le choix se fait avec le paramètre output :

| format | exemple |
| xml | output=xml |
| php serialisé | output=php |

Ces 2 formats sont très facilement exploitables : coté client (javascript), on préfèrera le xml, et coté serveur, si on est en technologie php, la question ne se pose même pas !

La réponse xml est formalisée par ce schéma xsd. On voit donc que la réponse est relativement simple :
– longitude / latitude
– address
– city
– state
– zip
– country

En plus de ces champs, Yahoo renvoie 2 champs permettant de qualifier la pertinence de la réponse :
precision : indique de quel ordre de précision est la réponse (rue, ville, …)
warning : fournit des informations supplémentaire (ex : si la rue fournie n’a pas été trouvée, cet attribut contiendra : « The street could not be found. Here is the center of the city. »)

Google propose plusieurs formats, le choix se fait également avec le paramètre output :

| format | exemple |
| xml | output=xml |
| kml | output=kml |
| csv | output=csv |
| json | output=json |

Les formats xml et json sont aussi bien adaptés à des technologies clientes que serveur. Le format kml sert surtout si on souhaite exploiter le résultat sur une carte Google Maps par exemple. Et enfin, un format un peu à part, le csv : non seulement basique, le strict minimum est renvoyé, ce qui permet de l’exploiter sans utiliser de librairie particulière.

Google semble avoir oublié ce qu’est un schéma xml, donc on se contentera d’analyser un exemple pour comprendre comment sont structurées les informations de sortie.
D’emblée, on remarque que la structuration est nettement plus arborée :
– Address (37, Boulevard des Capucines, 75002 2ème Arrondissement, Paris, France)
– AddressDetails

  • Country
  • * CountryNameCode (FR)
  • * AdministrativeArea
  • ** AdministrativeAreaName (Ile de France)
  • ** SubAdministrativeArea
  • *** SubAdministrativeAreaName (Paris)
  • *** Locality
  • **** LocalityName (Paris)
  • **** DependentLocality
  • ***** DependentLocalityName (2ème Arrondissement)
  • ***** Thoroughfare
  • ****** ThoroughfareName (37, Boulevard des Capucines)
  • ***** PostalCode
  • ****** PostalCodeNumber (75002)

– Point

  • Coordinates (2.329347,48.870170,0)

Cette arborescence n’est pas adaptée pour une adresse. Elle détaille trop certains points, tout en en oubliant d’autres essentiels. Par exemple, on ne récupère pas le nom du pays.
Mais le plus important (coordonnées longitude / latitude) est néanmoins très facilement accessible.

Comme Yahoo, Google renvoie également 2 champs qualifiant sa réponse :
– code : il s’agit d’un code d’état de la réponse (200 : success, 500 : internal error, ….). La liste des codes d’états est disponible sur Google Code. Il s’agit d’un plus par rapport à Yahoo qui n’a pas normalisé les différentes catégories d’erreurs possibles.
– accuracy : précision de la réponse (rue, ville, pays, …). La liste des valeurs possibles est disponible en ligne. Mais on va voir dans le paragraphe suivant qu’en pratique, la précision est peu exploitée par Google.

Adresse ambigüe

Si Yahoo trouve plusieurs localisations, la réponse listera l’ensemble des localisations (jusqu’à 50).
Exemple : street=vaugirard&city=paris :

...
<Latitude>48.841465</Latitude>
<Longitude>2.318725</Longitude>
<Address>boulevard de Vaugirard</Address>
...
<Latitude>48.841360</Latitude>
<Longitude>2.317941</Longitude>
<Address>galerie de Vaugirard</Address>
...
<Latitude>48.835936</Latitude>
<Longitude>2.293624</Longitude>
<Address>rue de Vaugirard</Address>
...

Comme Yahoo, Google est supposé pouvoir retourner une liste de plusieurs réponses dans le cas où l’adresse saisie présente des ambigüités, mais en pratique cela n’arrive quasiment jamais.

Soit Google renvoie une seule réponse qui lui paraît la plus légitime. Exemple : q=Vienne

...
<address>Wien, Austria</address>
...

Soit il diminue la précision. Exemple :
q=Vaugirard, Paris

...
<AddressDetails Accuracy="1">
<Country>
<CountryNameCode>FR</CountryNameCode>
...

Google ne gère donc pas ce problème de manière satisfaisante.

Adresse introuvable

Maintenant, que se passe-t-il si l’adresse n’a pas été trouvée ? On a vu dans le paragraphe précédent que si l’adresse n’a été trouvée que partiellement, une position est retournée associée d’une précision. Cependant, le service n’est pas toujours capable de retourner une adresse partielle.

Testons la recherche de « rue Clever-Age, Paris » :

[street=rue+clever-age&city=paris->http://local.yahooapis.com/MapsService/V1/geocode?street=rue+clever-age&city=paris&out=xml&appid=BlocCleverAge]

...
<Result precision="zip" warning="The street could not be found. Here is the center of the city.">
<Latitude>48.856925</Latitude>
<Longitude>2.341210</Longitude>
...

[q=rue+clever-age, paris->http://maps.google.com/maps/geo?q=rue+clever-age%2Cparis&output=xml&key=ABQIAAAAOFKf-0uvhFXfdI1HCJYG-hT2yXp_ZAY8_ufC3CFXhHIE1NvwkxRXLC_hBZN6abys3xBh__jp8aNXLQ]

...
<Status>
<code>602


Cela montre un inconvénient important de Google : s’il n’a pas l’adresse dans sa base de données, il renvoie un code d’erreur 602 (adresse introuvable) plutôt que de retourner une position approximative accompagnée d’une précision.

Dans le cas d’une application qui a besoin de localiser des adresses, même approximativement, si l’on utilise Google, il faut donc faire plusieurs requêtes pour localiser un site : une première avec l’adresse complète. Puis si Google renvoie « adresse introuvable », l’application faire une 2eme requête, mais sans la rue. Etc… jusqu’à ce que Google renvoie une localisation.

Illustration par un projet concret

Dans le cadre d’un projet, il fallait localiser environ 1300 adresses.

Caractéristiques de ces adresses :
– Elles sont réparties dans le monde entier, dans plus d’une centaine de pays.
– Elles ne concernent pas ou peu les principaux pays d’Europe, elles ne concernent pas non plus les Etats-Unis et le Canada.
– Elles sont en général dans les villes importantes des pays concernés

| Résultats | Google|Yahoo|
| Adresses trouvées avec une bonne précision | 25 % | 5 % |
| Adresses trouvées avec une mauvaise précision | 70 % | 84 % |
| Adresses introuvables | 5 % | 11 % |

Quelques remarques qui se dégagent de cette expérience :

– Le taux de localisation parfaite est très faible (~ 25 % pour Google).

– Google est nettement plus efficace que Yahoo pour les adresses précises. Pour les localisations avec une précision de l’ordre de la ville, Yahoo rattrape un peu ce retard.

– Comme décrit un peu plus haut, il a fallu faire beaucoup plus de requêtes avec Google qu’avec Yahoo afin d’obtenir une localisation sur la ville seulement. Sans ces requêtes supplémentaires, le taux d’adresses localisées avec une mauvaise précision aurait été très faible.

Limitations

Le service Yahoo est bridé à 5.000 requêtes par jour et par adresse IP. Au delà, un message d’erreur xml explicite est retourné.

Le service Google est quant à lui limité à 15.000 requêtes par jour et par clé.

L’utilisation de Yahoo est donc très limitée, non seulement par le nombre de requêtes, mais également par le fait que la comptabilisation se fait par adresse IP et pas par clé, ce qui peut-etre très gênant lorsque plusieurs applications sont installées sur un réseau interne par exemple.

Quelques autres points d’attention

D’autres facteurs peuvent se montrer déterminants pour le choix du fournisseur de service :

Performances : la rapidité des réponses peut-être déterminante pour certaines applications.

Erreurs internes et autres frivolités : dans cet article, les seules réponses étudiées sont « adresse localisée » et « adresse introuvable ». Il faut cependant savoir qu’on peut avoir d’autres réponses, de la plus obscure « erreur interne » jusqu’à des erreurs légèrement plus explicites, telles que « adresse indisponible ». Par exemple, si l’on fait des requêtes à Google trop rapidement, on obtient une erreur 620 (« too many queries »). L’appel au service de géolocalisation de Google depuis un client javascript est donc très limité en raison de ce point précis.

Géolocalisation de commerces : un peu hors-sujet, mais Yahoo propose d’autres services, dont la géolocalisation de commerces. Google offre également un service similaire, mais encapsulé dans une couche Javascript, et donc moins facilement accessible.

Conclusion

D’un point de vue technique, Yahoo a nettement l’avantage sur Google, pour les raisons suivantes :
– Saisie de l’adresse via plusieurs paramètres (street, city, …) levant un grand nombre d’ambigüités
– Bonne gestion des ambigüités en retournant les différentes réponses possibles, alors que Google renvoie une réponse arbitraire.
– Bonne gestion des adresses introuvables en diminuant la précision de localisation et en le signalant, plutôt que de retourner un laconique « introuvable »
– Plus quelques autres détails, tels qu’un format xml simple, formalisé par un xsd, des warnings explicites retournés en cas de problème, …

Cependant, en pratique, Google semble avoir une base de données nettement plus exhaustive, couvrant le monde entier.

Si les adresses à localiser concernent le monde entier, mon conseil serait donc d’utiliser Google. Si les adresses à localiser concernent les principaux pays occidentaux, la solution Yahoo me semble plus appréciable, à condition que le nombre de requêtes ne soit pas trop important.

Comme les 2 services sont néanmoins très proches (REST, XML, de nombreuses similitudes sur les modèles de données manipulés), il n’est pas si difficile d’implémenter les 2 solutions et de comparer les résultats pour affiner son choix.

En savoir plus

Service Yahoo
Service Google

7 commentaires

  1. Olivier Durand

    Article sympa et facile à lire.

    Le tableau dans la section « Illustration par un projet concret » est (à mon sens) au premier abord pas très lisible. Il serait peut être plus judicieux d’utiliser les termes (Adresses trouvées avec une localisation exacte et Adresses trouvées avec une localisation inexacte).

    Voila, félicitation à l’auteur tout de même!

  2. Tristan Marly

    Effectivement, ce n’est peut-être pas assez clair:

    Sur les 1300 adresses, Yahoo n’a réussi qu’à localiser de manière « exacte » 5% de ces adresses, c’est à dire les adresses dont la rue est connue de Yahoo.

    Et Yahoo a réussi à localiser 84% des adresses avec une « mauvaise précision », c’est à dire que Yahoo connaissait la ville, mais pas la rue.

  3. Humphrey Bienchiet

    Pourquoi se concentrer constamment sur les services que proposent les acteurs majeurs ? Connaissez-vous openstreetmap ? L’avenir est plus vers les services ouverts que chez les éditeurs non ?

  4. Xavier Lacot

    Bonjour Humphrey,

    Effectivement, OpenStreetMap est plein d’avenir. Couplé à Mapnik et OpenLayers ou à d’autres solutions comme FireEagle, c’est sans doute une des pierres fondatrices de l’avenir de la géolocalisation. Tous les composants d’une plateforme de cartographie libre sont en train de se mettre en place, et une bonne idée pour les projets proposant de la cartographie sur le Web serait déjà d’employer la solution d’abstraction proposée par Mapstraction… Cela pourrait être utile en vue d’un changement de fournisseur, un jour !

    Ceci dit, je ne crois pas que la base d’OpenStreetMap soit exposée à des webservices permettant de localiser des adresses (ce dont traite ce billet), si ?

  5. Eric Delord

    Bonjour, bel article en effet.

    Sinon pour ma part sans avoir fait de statistiques précises il m’a semblé que la précision était meilleure sur Yahoo lorsque l’on utilisait le module de geolocalisation de Yahoo Pipes. Et notamment pour la géolocalisation d’un code postal + ville, yahoo pipes est souvent bien meilleur que Google.

    J’en profite pour citer un petit article de mon blog:
    http://www.clocal.fr/2008/01/20/villes-et-code-postaux-geolocalises/

  6. Bonjour,

    j’utilise depuis longtemps l’API Yahoo! Maps
    pour afficher des cartes et obtenir les latitudes longitudes de multiples adresses à Paris… ou IDF
    [http://www.parisetudiant.com/agenda/sortir-a-paris-bon-plan.php->http://www.parisetudiant.com/agenda/sortir-a-paris-bon-plan.php]

    et je suis en train de tester l’API google en meme temps car l’API Yahoo! montre des signes de faibllesse en fiabilité en répondant 8 fois sur 10 par des erreurs;

    Je dois dire que Yahoo! trouve la pluspart des adresses que je lui donne mais en effet Google indique quelques degres de plus de precisions
    La précision est donc plutot égale…
    Mais pas la fiabilité
    La grosse différence est de la fiabilité des outils
    Yahoo! montre des signes de faiblesses dans l’affichage de certaines cartes sur IE6 et les cartes en version image sont bien plus fiable par exemple ici sur la partie mobile
    [http://www.parisetudiant.com/m/sortir-a-paris-evenement.php?ne=39271->http://www.parisetudiant.com/m/sortir-a-paris-evenement.php?ne=39271]

  7. c’est l ère de la meta recherche

    http://www.braavoo.com

Les commentaires sont désormais fermés.