Cet article présente un script permettant d’automatiser la collecte de coordonnées via le géocodeur de Google Maps. En celà, il est un peu technique puisqu’on utilise du code et un terminal. Il faut donc parfois insister et se documenter quand certaines choses semblent obscures. Néanmoins, il n’est pas nécessaire d’avoir de l’expérience en programmation pour utiliser cette technique, et ça peut même être une bonne introduction.
Objectif
On a une liste de lieux (addresses, nom de villes), et on souhaite obtenir un fichier CSV avec 3 colonnes:
- Nom du lieu
- Longitude
- Latitude
Mais pour être sûr d’avoir le bon endroit et pas un homonyme, on va aussi afficher quelques infos sur le point collecté dans le terminal.
Géocodage
Le géocodage permet de transformer des adresses en longitude/latitude. On passe d’un repérage humain comme “5 avenue de la République, Amiens” à des coordonnées numériques.
On parle de géocodage inversé lorsqu’on cherche à trouver une adresse depuis des coordonnées.
De grandes plateformes en-ligne permettent d’effectuer du géo-codage sans s’en rendre compte. Ainsi la dans Google Maps on se contente de taper une adresse dans la barre de recherche et il en ressort le marker sur l’endroit précis. Il est aussi possible de le faire de manière automatisée, sans passer par l’interface utilisateur, mais en utilisant un script, petit bout de code informatique, grâce à ce qu’on appelle une API, qui est une interface permettant à deux machines (ordinateurs) de communiquer entre eux.
Installation
Pour utiliser le script, on a besoin de Python et de son gestionnaire de packages pip. Si vous ne connaissez pas Python, il s’agit d’un langage de programmation. Il peut être intéressant de faire un tour sur ce cours, au moins la première leçon qui explique ce que c’est et comment l’installer.
Une fois qu’on a tout ça, on va installer la librairie google maps. Dans un terminal:
pip install googlemaps
On a aussi besoin de s’identifier auprès de Google dont on va utiliser l’API. Pour celà, il faut aller sur la page de l’API de Google Maps, se connecter via un compte Google et générer une clé. Cette clé sera à copier dans le script ci-dessous. L’utilisation de la clé est gratuite, dans les limites d’utilisation imposées, qui sont de 2500 requêtes par jour ou 50 par seconde.
Le script
Enregistrer le script suivant dans un fichier cities.py.
# -*- coding: utf-8 -*-
import googlemaps
import csv
gmaps = googlemaps.Client(key='COPIER_VOTRE_CLE_ICI')
cities = ["Kengtun", "Nam Kham", "Muse, Myanmar"]
with open('output.csv', 'wb') as csvfile:
csvwriter = csv.writer(csvfile, delimiter=',',
quotechar='|', quoting=csv.QUOTE_MINIMAL)
for city in cities:
city_name = city.split(',')
geocode_result = gmaps.geocode(city)
if len(geocode_result) > 0 :
csvwriter.writerow([city_name[0], geocode_result[0]["geometry"]["location"]["lng"], geocode_result[0]["geometry"]["location"]["lat"]])
print geocode_result[0]["geometry"]["location"]["lng"], geocode_result[0]["geometry"]["location"]["lat"], geocode_result[0]["formatted_address"]
La ligne
cities = ["Kengtun", "Nam Kham", "Muse, Myanmar"]
est l’endroit où on va noter les différentes villes dont on veut avoir les coordonnées. On se contente de mettre le nom entre guillemets. On peut apporter plus de précision, comme le nom du pays ou de la province, en séparant par une virgule, comme avec “Muse, Myanmar”, on peut aussi mettre des addresses complètes, comme “3 rue du Temple, Lille”.
A la place de ````COPIER_VOTRE_CLE_ICI```, copier la clé fournie par Google.
Qu’est-ce qui se passe ?
Regardons un peu ce qui se passe dans le script.
1- Configuration
# -*- coding: utf-8 -*-
import googlemaps
import csv
gmaps = googlemaps.Client(key='COPIER_VOTRE_CLE_ICI')
cities = ["Kengtun", "Nam Kham", "Muse, Myanmar"]
Les quatre premières lignes sont des lignes de configuration. On commence par déclarer que le contenu sera en codage utf-8, ce qui nous permet de chercher des adresses avec des caractères chinois, cyrilliques ou même simplement français accentués.
Ensuite on importe deux librairies qui nous seront utiles: la première pour écrire un fichier csv, la deuxième pour utiliser le géo-coder de Google maps.
Après, on donne notre clé Google Maps.
Enfin on crée un tableau avec les lieux que l’on souhaite géo-coder.
2- Création du fichier CSV de résultats
with open('output.csv', 'wb') as csvfile:
csvwriter = csv.writer(csvfile, delimiter=',',
quotechar='|', quoting=csv.QUOTE_MINIMAL)
Ici on crée un fichier CSV qui s’appelle output.csv et dans lequel on écrira les résultats.
3- Requête à Google Maps
for city in cities:
city_name = city.split(',')
geocode_result = gmaps.geocode(city)
On crée une boucle qui va itérer sur chaque lieu puis envoyer une requête à Google Maps pour chacun d’entre eux afin de collecter les informations. La réponse est stockée dans la variable geocode_result
.
4- Traitement de la réponse de Google Maps
if len(geocode_result) > 0 :
csvwriter.writerow([city_name[0], geocode_result[0]["geometry"]["location"]["lng"], geocode_result[0]["geometry"]["location"]["lat"]])
print geocode_result[0]["geometry"]["location"]["lng"], geocode_result[0]["geometry"]["location"]["lat"], geocode_result[0]["formatted_address"]
Si la réponse reçue n’est pas vide, on va alors traiter le résultat. Certaines informations seront affichées à l’écran pour qu’on puisse facilement vérifier que tout s’est bien passé, et une ligne va être écrite dans le fichier output.csv.
Utilisation
Maintenant que la librairie googlemaps est installée, et que le script est enregistré avec la clé de l’API et la liste des lieux, on peut lancer le script dans le terminal.
python cities.py
Résultat
Le premier résultat qu’on voit, c’est dans le terminal l’affichage d’informations sur le point trouvé. L’objet renvoyé par l’API de Google Maps a de nombreuses informations, on va juste afficher celle qui s’appelle “formatted_address” pour être sûr qu’on n’est pas tombé sur une ville homonyme ailleurs dans le mondE.
Le second résultat, le plus important, est un fichier “output.csv” généré au même endroit que le script, avec les colonnes qui nous intéressent.