Il existe différentes solutions pour géocoder des adresses ou des lieux avec R. Les plus fréquemment citées sont basées sur des services commerciaux et utilisent des données non libres. D’autres utilisent des logiciels libres et des données libres (OpenStreetMap). La nature commerciale / non commerciale, libre / non libre d’une solution a des implications sur la construction et la diffusion des données géocodées.
Je propose ici une petite revue des différentes possibilités de géocodage dans R ainsi qu’un package pour interroger l’une des API de géocodage basé sur OpenStreetMap (photon).
Google & Co
La solution la plus connue passe par l’utilisation du package ggmap
. L’utilisation de ce package, basé sur l’API de geocodage de Google, pose deux problèmes : les requêtes sont limitées (2500 par jour, 10 par seconde) et les résultats du geocodage doivent obligatoirement être utilisés sur une Google map.
Standard Usage Limits
Users of the standard API:
– 2,500 free requests per day
– 10 requests per second
Terms of Use Restrictions
“The Google Maps Geocoding API may only be used in conjunction with a Google map; geocoding results without displaying them on a map is prohibited.(…)”
(Google Maps Geocoding API Usage Limits )
Si l’on prend ces conditions d’utilisation au sérieux le géocodage de grands fichiers d’adresses devient long et difficile et l’utilisation que l’on pourrait faire ensuite des données géocodées est limitée.
D’autres packages utilisent d’autres API, citons par exemple geocodeHERE
utilisant l’API HERE de Nokia qui a également des limites d’utilisation et peut nécessiter l’obtention d’une clef pour l’API.
OpenStreetMap & open source
Plusieurs outils de géocodage se développent autour des données d’OpenStreetMap.
Le projet Nominatim semble être le plus abouti. Un package a récemment été publié, le bien nommé nominatim
, qui permet de faire des requêtes sur une instance de l’API (chez MapQuest). Comme ce package utilise des services mis à disposition gratuitement il n’est pas fait pour faire du géocodage en masse et des délais sont rajoutés entre les requêtes pour ne pas surcharger les serveurs.
Just like Google Maps, these services are not meant to be your freebie-access to mega-bulk-geocoding. You can and should pay for that. (…)
Il est possible de mettre en place son propre service Nominatim et d’adapter légèrement le package pour éliminer les délais et rediriger les requêtes. Cette solution permettrait de faire du géocodage en masse sans problème. Cependant la mise en place d’une instance de Nominatim peut s’avérer assez coûteuse en temps et en matériel.
Photon est un geocodeur s’appuyant sur les données d’OpenStreetMap et basé sur un moteur de recherche Elasticsearch. Photon utilise la structure de la base de données de Nominatim.
L’équipe de photon propose une API publique, dont voici les conditions d’utilisation :
You can use the API for your project, but please be fair – extensive usage will be throttled. We do not guarantee for the availability and usage might be subject of change in the future.
Have fun with photon and make OSM grow!
Contrairement à Nominatim, l’installation d’une instance de photon en local est aisée et assez légère.
Il n’existait pas pour l’instant (et à ma connaissance) de package permettant d’attaquer l’API de photon. J’en ai construit un petit qui permet d’envoyer des requêtes soit sur l’API publique de photon soit une instance en local.
Le package photon
Ce package est disponible sur Github : photon.
# installation
require(devtools)
devtools::install_github(repo = 'rCarto/photon')
Le package ne contient qu’une seule fonction (geocode
).
Les paramètres de la fonction permettent de choisir le nombre maximum de résultats par requête et l’API à interroger mais aussi de filtrer les résultats en fonctions des tag d’OSM et de la langue. La fonction retourne un data.frame.
Exemple d’utilisation :
# adresses recherchées
loc <- c("19 rue Michel Bakounine, 29600 Morlaix, France",
"5 rue Proudhon, 34000 Montpellier, France",
"2 Emma Goldmanweg, Tilburg, Netherlands",
"36 Strada Panait Israti, Bucarest, Romania")
# geocodage
locgeo <- geocode(loc, limit = 1, key = "place")
# affichage des résultats
locgeo[,c("location", "lon", "lat")]
> location lon lat
>1 19 rue Michel Bakounine, 29600 Morlaix, France -3.816435 48.59041
>2 5 rue Proudhon, 34000 Montpellier, France 3.881018 43.61525
>3 2 Emma Goldmanweg, Tilburg, Netherlands 5.041361 51.53783
>4 36 Strada Panait Israti, Bucarest, Romania 26.064266 44.46227
Pour aller plus loin
Qu’en est-il des la qualité des résultats trouvés via OpenStreetMap?
Il n’est pas facile de répondre à cette question. Les données OSM (comme celles de Google) sont de qualité variable et plus ou moins complètes en fonction de la partie du monde concernée. Par ailleurs les résultats donnés par Nominatim et par photon ne sont pas les mêmes. Nominatim semble beaucoup mieux répondre à des requêtes structurées tandis que photon semble mieux s’en sortir quand les requêtes sont un peu floues. Cela est probablement du au moteur de recherche employé par photon, conçu pour la recherche par autocomplétion (et entre autre basé sur les algorithmes n-grams).
Pour évaluer la pertinence des différents des outils évoqués il pourrait être intéressant de lancer des tests avec chacun d’eux sur un grand nombre d’adresses (combien?) plus ou moins compliquées (c’est à dire?) dont nous avons déjà les coordonnées…
Notons pour finir qu’il est possible, sous réserve de déjà bien maîtriser les outils, d’ajouter des données provenant d’autres sources qu’OSM dans photon et dans nominatim (voir la Base Adresse Nationale).
Merci à Matthieu Viry pour ses avis et conseils toujours pertinents sur les outils de géocodage et sur OSM en général.
[MAJ 29/09/2015]
OpenStreetMap et l’Open Data
Les données d’OSM sont disponibles sous licence libre ODbl.
Voici une liste de liens qui évoquent l’intérêt de cet aspect fondamental d’OSM :
– Why the world needs OpenStreetMap (EN)
Cet article insiste sur le contrôle des données offert par l’utilisation d’OSM, tant pour la représentation (cartes) que pour le calcul (outils, le plus souvent libres, basés sur les données OSM).
– OpenStreetMap a le vent en poupe… et c’est tant mieux
Cet article porte sur la fiabilité des cartes OSM, mais aussi les avantages d’OpenStreetMap dont notamment l’accès à l’intégralité des couches vectorielles.
– Google Maps versus OpenStreetMap : redistribution des cartes sur le Web ?
L’article évoque le modèle économique de l’API de Google Maps et l’avantage qu’OSM peut en tirer en s’appuyant sur le courant de l’ouverture des données.
– Comparision Google services – OSM (EN)
Article sur le wiki d’OSM qui établit bien les différences fondamentales entre OSM et Google Maps (accès aux données brutes, possibilité de créer de nouveaux services…)
[/MAJ]
OpenEdition vous propose de citer ce billet de la manière suivante :
Timothée Giraud (2 septembre 2015). Géocoder en masse avec R et sans Google Maps. R Géomatique. Consulté le 12 janvier 2025 à l’adresse https://doi.org/10.58079/tp3j
First of all, apologizes for not being able to speak French.
I’ve just used R package with certain degree of success. I have also used location bias but unfortunately some results are placed very far away. As far as I know Photon can limit results to a specific place (country, city…), but haven’t managed to use it. I also know that r package can accept keys and values, but don’t know how to use it.
Do you know how can I search highways in a specific country or city?
Bonjour,
je cherche à obtenir le code postal de la commune la plus proche d’un point (longitude , latitude). Un peu un géocodage inversé. Cela peut-il se faire avec R?
Bonjour,
Il est possible de faire cela avec le package nominatim. Vous devrez au préalable obtenir un clef d’API MapQuest (https://developer.mapquest.com/).
Vous trouverez un exemple d’utilisation ici : https://gist.github.com/rCarto/965dde0d588dabf0189ba85a4fd35c15
Merci pour cette réponse. Je teste.
Si les points à géocoder se trouvent en France vous pouvez aussi utiliser le récent package banR (https://github.com/joelgombin/banR) cité plus bas dans la discussion.
Merci beaucoup pour vos articles.
Sur ce sujet géocodage, on trouve sur data.gouv.fr une API en ligne pour géocoder des adresses de France, cette API attaque la Banque d’Adresse Nationale (Laposte, IGN,OSM,…) et les résultats sont vraiment bons.
https://adresse.data.gouv.fr/tools/
Une bonne alternative à G. Maps.
La solution proposée sur data.gouv.fr fait référence à un package Python. Est-il possible d’utiliser l’API qui attaque la Banque d’Adresse Nationale depuis R ?
Merci
A ma connaissance, il n’existe pas (encore?!) de package interfaçant l’API BAN.
Vous trouverez cependant ici (https://gist.github.com/rCarto/038ef0bb93d291b58b4b15ff58f006eb) un début de programme permettant d’interroger l’API.
Un package est sur github :
https://github.com/joelgombin/banR
et aussi sur le cran :
install.packages(“banR”)
Merci beaucoup pour cet article, il ouvre beaucoup de perspectives. J’ai justement travaillé sur des données localisées
http://resultats.hypotheses.org/518#lieux