Visualiser des zones géographiques autour de points d'intérêts avec leaflet

Utilisation du package leaflet pour visualiser une intersection de zone

Marie Vaugoyeau

5 minutes

But : Tracer des cercles autour de points d’intérêts

Cette article est pour moi l’occasion de partager quelque chose que j’ai découvert sur R en utilisant le package leaflet : la possibilité de dessiner une zone de couleur autour d’un point GPS donné.
Utilité : Visualiser une zone qui obéit à un ou plusieurs critères de localisation afin de trouver une maison, une école ou autre…

Pour information, il est possible de demander à R de vous donner les coordonnées GPS d’un point mais pour cela il faut utiliser la fonction geocode() du package ggmap.
Malheureusement depuis juillet 2018, pour l’utiliser il faut se créer un compte Cloud Google en rentrant son numéro de carte bancaire (sic). J’ai donc décidé de m’en passer ici.
Pour le code, il faut juste mettre le lieu entre guillemets comme ceci geocode("gare du Mans").
Cependant, si vous voulez utiliser ggmap et que vous avez un problème pour charger la carte, je vous explique dans la dernière partie comment résoudre le problème.

Importer un fond de carte avec leaflet

Pour visualiser des cartes sous R il existe plusieurs outils.
Le package leaflet est très pratique car il permet de zoomer/dézoomer mais aussi de se déplacer sur la carte.

Je commence par charger le fond de carte, axé sur mon point d’intérêt principal, ici la gare du Mans (longitude = 0.192612, latitude = 47.995675), auquel j’ajoute un cercle jaune de 10 km de rayon.

library(leaflet)

coordonnees_point_central <- c(lng = 0.192612, lat = 47.995675)

distance_max <- 10

fond_carte <- leaflet() %>% 
  addTiles() %>% 
  setView(lng = coordonnees_point_central[1], lat = coordonnees_point_central[2], zoom = 10) %>%
  addCircles(lng = as.numeric(coordonnees_point_central[1]), lat = as.numeric(coordonnees_point_central[2]), radius = distance_max * 1000, color = "yellow") 
  
fond_carte

Une première zone c’est bien mais en général, nous sommes intéressés par plusieurs endroits.
Vous pouvez ajouter à cette carte le nombre de points d’intérêt voulu.

Ajouter des points d’intêrêts avec leurs zones

Un deuxième :

coordonnees_point_deux <- c(0.139636, 47.921906)
 
distance_max_deux <- 10

carte <- fond_carte %>% 
  addCircles(lng = coordonnees_point_deux[1], lat = coordonnees_point_deux[2], radius = distance_max_deux * 1000, color = "red")

carte

Et un petit dernier pour la route :

coordonnees_point_trois <- c(lng = 0.07, lat = 48.02) 
 
distance_max_trois <- 8

carte_avec_3 <- fond_carte %>% 
  addCircles(lng = as.numeric(coordonnees_point_trois[1]), lat = as.numeric(coordonnees_point_trois[2]), radius = distance_max_trois * 1000, color = "blue")

carte_avec_3
carte <- carte %>%
  addCircles(lng = as.numeric(coordonnees_point_trois[1]), lat = as.numeric(coordonnees_point_trois[2]), radius = distance_max_trois * 1000, color = "blue")

carte

Je ne sais pas si vous l’avez remarqué mais il y a une petite différence entre l’ajout du point 2 et du point 3. En effet, lorsque que l’on donne des noms aux valeurs, la fonction addCircles() a besoin d’une valeur numérique, j’ai donc rajouté as.numeric() dans la ligne de code.

Voilà pour cette article, en esperant qu’il vous soit utile.

Comme préciser en début d’article, je vous mets ci-dessous la démarche pour créer un compte Google Cloud et mettre à jour ggmap.

Astuce : Compte Cloud Google et utilisation des API

Si vous n’avez pas utiliser ggmap depuis juillet 2018, vous ne vous êtes peut-être pas rendu compte du problème.

En écrivant cet article, j’ai eu la désagréable surprise de voir l’erreur suivante.
*Error in download.file(url, destfile = tmp, quiet = !messaging, mode = “wb”) : impossible d’ouvrir l’URL ’http://maps.googleapis.com/maps/api/staticmap?center=gare+du+Mans&zoom=13&size=640x640&scale=2&maptype=terrain&language=en-EN&sensor=false'*

Google a décidé de “fermer” l’utilisation des API, il faut donc maintenant un code / une clé pour les utiliser. Pour pouvoir obtenir cette clé, il faut tout d’abord se créer un compte en rentrant votre numéro de carte bancaire…

Pour créer le compte, rendez-vous sur Google Cloud Plateforme.
Une fois que c’est fait, il faut que vous réinstalliez ggmap en utilisant le code de @dkahle disponible ici
devtools::install_github("dkahle/ggmap", ref = "tidyup")
Redémarrer R
Puis
library(ggmap)
register_google(key = 'copié-collé-ici-votre-clé-API')
Et voilà, cela m’a pris du temps pour le faire alors je le mets ici !

Petit bonus : Comment utiliser le package opencage pour trouver des coordonnées GPS

Suite au tweet de Maëlle Salmon, j’ai décidé d’ajouter cette partie à l’article.

En effet, Maëlle m’a fait remarqué que Open Cage Data était une très bonne alternative pour ne plus utiliser geocode(), donc je profite de l’occasion pour faire passer l’information ici !

Première étape, comme pour Google Cloud il faut se créer un compte ici pour obtenir une clé mais pas besoin de rentrer son numéro de carte bancaire !

Ensuite il faut enregistrer la clé dans l’environnement de R en faisant usethis::edit_r_environ() ce qui ouvre un fichier .Renviron.
Dans ce fichier il faut ajouter OPENCAGE_KEY="copier-coller-votre-clé".
Attention le fichier .Renviron doit toujours se finir par une ligne vierge ! Donc si votre fichier est vierge, vous mettez la clé sur la première ligne et vous tapez sur Entrée pour obtenir une deuxième ligne vierge.

Il est maintenant nécessaire de redémarer R pour pouvoir questionner la base.

Je ne vais pas détailler ici toutes les fonctionnalitées du package, juste vous dire comment obtenir les coordonnées. Pour le reste, je vous renvoie à la page GitHub de Open Cage Data qui est bien plus précise.

Pour obtenir des coordonnées
Installer le package
library("devtools")
install_github("ropensci/opencage")

Charger le package library("opencage")

Puis chercher votre lieu avec la fonction opencage_forward()
Attention Contrairement à la fonction geocode(), la fonction opencage_forward() donne beaucoup plus d’informations donc associez la à un nom.
donnees_geographiques <- opencage_forward(placename = "Gare du Mans")

Ici nous avons un fichier de résultats avec 3 entrées, il faut donc choisir le bon.
Ce qui nous intéresse c’est la gare du Mans uniquement et non les autres gares à proximité donc on choisit la troisième ligne et on garde les coordonnées GPS qui nous intéresse.
coordonnes <- donnees_geographiques$results[3, c(55,56)]
Et voilà !

Bonne journée à tous.