OUTIL – La géoMoulinette

Quand on veut faire une carte, on a besoin de coordonnées. En fait, si ce sont des points qu’on veut représenter, on a besoin de la latitude et de la longitude de chacun de ces points.

Par exemple, mon bureau est très exactement situé à 45,514846 degrés de latitude nord et à 73,560622 degrés de longitude ouest. Ces derniers degrés ont une valeur négative pour les distinguer des longitudes situées à l’est du méridien de Greenwich.

Mais voilà. Souvent, lorsque mes étudiants veulent cartographier des données, les fichiers qu’ils trouvent ne contiennent pas de coordonnées. Ils contiennent des adresses.

Je pense à Clément qui souhaitait placer sur une carte différents monuments historiques de France. Voici un extrait du fichier csv qu’il avait trouvé sur le site des données ouvertes du gouvernement français.

Je pense aussi à Alexandra, qui souhaitait faire une carte des établissements condamnés pour insalubrité, à Montréal. Voici également un extrait de son fichier.

En jaune, j’ai surligné, dans chaque cas, des colonnes contenant des éléments d’une adresse. Il est facile, lorsqu’on a une adresse, d’en trouver les coordonnées exactes grâce à l’API de Google Maps.

En fait, j’ai même créé un raccourci pour y accéder plus rapidement. Vous pouvez le prendre en note:

bit.ly/googeoapi   <- cliquez ici

Si vous y accédez, vous allez vous retrouver devant une page qui semble afficher un message d’erreur.

{
    "error_message" : "Invalid request. Missing the 'address', 'bounds', 'components', 'latlng' or 'place_id' parameter.",
    "results" : [],
    "status" : "INVALID_REQUEST"
}

C’est qu’il vous manque simplement un petit quelque chose. Si vous examinez la barre d’adresse, vous constaterez qu’elle se termine par le caractère = (égal).

https://maps.googleapis.com/maps/api/geocode/json?address=

Eh bien le petit quelque chose qui manque, c’est l’adresse que vous souhaitez géolocaliser. Vous pouvez l’ajouter dans la barre d’adresse, immédiatement après le caractère égal. Allons-y avec une adresse quelconque, choisie aléatoirement, au hasard et au petit-bonheur-la-chance.

https://maps.googleapis.com/maps/api/geocode/json?address=1391, rue Bellevue Nord, Saint-Félicien, QC

L’API de Google Maps va alors vous retourner des données en format JSON à l’intérieur desquelles il vous suffit maintenant de chercher la clé location. Vous verrez que sa valeur sera constituée d’un dictionnaire de deux éléments, lat et lng, ayant respectivement pour valeurs la latitude et la longitude de l’adresse que vous cherchez (partie surlignée en jaune ci-dessous).

{
   "results" : [
      {
         "address_components" : [
            {
               "long_name" : "1391",
               "short_name" : "1391",
               "types" : [ "street_number" ]
            },
            {
               "long_name" : "Rue Bellevue Nord",
               "short_name" : "Rue Bellevue N",
               "types" : [ "route" ]
            },
            {
               "long_name" : "Saint-Félicien",
               "short_name" : "Saint-Félicien",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Le Domaine-du-Roy",
               "short_name" : "Le Domaine-du-Roy",
               "types" : [ "administrative_area_level_2", "political" ]
            },
            {
               "long_name" : "Québec",
               "short_name" : "QC",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "Canada",
               "short_name" : "CA",
               "types" : [ "country", "political" ]
            },
            {
               "long_name" : "G8K 1J1",
               "short_name" : "G8K 1J1",
               "types" : [ "postal_code" ]
            }
         ],
         "formatted_address" : "1391 Rue Bellevue N, Saint-Félicien, QC G8K 1J1, Canada",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 48.6613459,
                  "lng" : -72.4430411
               },
               "southwest" : {
                  "lat" : 48.6613443,
                  "lng" : -72.44305969999999
               }
            },
            "location" : {
               "lat" : 48.6613459,
               "lng" : -72.4430411
            },
            "location_type" : "RANGE_INTERPOLATED",
            "viewport" : {
               "northeast" : {
                  "lat" : 48.6626940802915,
                  "lng" : -72.44170141970848
               },
               "southwest" : {
                  "lat" : 48.6599961197085,
                  "lng" : -72.4443993802915
               }
            }
         },
         "place_id" : "EjgxMzkxIFJ1ZSBCZWxsZXZ1ZSBOLCBTYWludC1Gw6lsaWNpZW4sIFFDIEc4SyAxSjEsIENhbmFkYQ",
         "types" : [ "street_address" ]
      }
   ],
   "status" : "OK"
}

Le défi, ici, est de répéter cette opération des centaines ou des milliers de fois afin de trouver les coordonnées de centaines ou de milliers d’adresses contenues dans un fichier csv.

Le défi, aussi, pour des étudiants qui débutent en python, c’est de rédiger un script qui automatise ce travail.

Afin de leur faciliter la tâche, j’ai écrit un script qui effectue cette géolocalisation d’adresses pour eux. Je l’ai baptisé la géoMoulinette. Pour qu’il fonctionne, il faut copier le script dans le même répertoire que celui dans lequel se trouver le fichier dont vous voulez géocoder les adresses.

Faisons-le rouler avec un extrait d’un fichier csv de restaurants de la région de Montréal préparé par Shannon Pécourt, qui était dans mon cours EDM5240 à l’hiver 2017. La géoMoulinette examine d’abord le contenu du répertoire et trouve le fichier csv le plus récemment créé.

Si le fichier le plus récemment créé n’est pas celui qu’on cherche, on peut répondre «non», puis entrer le bon nom de fichier.

Une fois que c’est fait, le script commence par compter le nombre de colonnes contenues dans le fichier en question. Il vous communique ce nombre et vous demande si vous voulez connaître le nom de ces colonnes.

Il est utile d’avoir cette info, car plusieurs colonnes peuvent contenir des éléments d’une adresse. Il y peut y avoir, en plus du numéro et du nom de la rue, une colonne contenant le nom de la ville, un autre contenant le nom de la province ou du territoire, une autre contenant le code postal, etc.

Ainsi, dans le fichier de restaurants de Shannon, trois colonnes contiennent des éléments qui pourraient aider l’API de Google Maps à identifier les bonnes coordonnées. Il s’agit des colonnes «adresse», «arrondissement1» et «arrondissement2».

Chacune de ces colonnes a un numéro d’index. On va l’utiliser pour répondre à la prochaine question que nous pose la géoMoulinette:

La géoMoulinette vérifie si c’est bien ce qu’on souhaite faire. Le classique «Yes? No? Cancel?»

Si on répond «oui», elle démarre.

À chacun des points, elle nous informe des coordonnées qu’elle trouve et elle les place dans deux nouvelles colonnes qu’elle ajoute à un nouveau fichier csv. Lorsqu’elle n’y arrive pas, elle entre «?,?» en guise de latitude et de longitude. Ces coordonnées initialement introuvables sont généralement faciles à identifier manuellement par la suite.

Bien entendu, l’outil a ses limites. L’API de Google Maps permet la géolocalisation d’un maximum de 2500 points par jour. Il est cependant possible de briser son fichier CSV en autant de parties que nécessaire si on a plus que 2500 points et de passer chacune de ces parties à la géoMoulinette à des jours différents… ou sur des ordinateurs différents, puisque Google croira que chaque ordi est une personne distincte.

Joyeux géocodages!

Vous aimerez aussi...

3 réponses

  1. Karim Hamdani dit :

    Bonjour,

    Votre article est intéressant. Note plate-forme (mapevidence.com) effectue , en plus du gécodage, la cartographie des données qui contiennent des adresses. On est de Montréal également. Je vous invite a tester les opérations sur notre site et je serais content de recevoir vos avis/commentaires la dessus.

    Karim,
    Analyste programmeur (mapevidence.com)

  2. Karim Hamdani dit :

    Parfait! pour toute question, commentaire, voici notre courriel : support@mapevidence.com

    Cordialement,

Laisser un commentaire

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