Je suis récemment tombé sur une initiative très intéressante: les frigos communautaires, via une publication LinkedIn. J’ai demandé une référence sur la liste des emplacements, et on m’a dirigé vers cette page.
J’adore l’idée du répertoire, mais j’avoue que sur « sur le fly », si j’ai un peu de bouffe à donner, je ne trouverai pas rapidement où aller la porter près de chez-moi ! Nous ne sommes plus vraiment à l’époque du bottin !
Donc, je me suis dit qu’il fallait faire une carte interactive ! Pour améliorer l’expérience utilisateur des visiteurs de ce site.
Comment transformer un bottin d’adresse en une carte interactive !
Nous allons transformer un bottin d’adresse sous la forme d’une carte interactive. Pour ce faire, nous allons utiliser le logiciel statistique R, ainsi que l’outil de création de cartes Leaflet.
Voici les étapes à effectuer pour faire ce projet:
- Étudier la structure de la page web
- Extraire les données du tableau
- Nettoyer les données
- Géocoder les adresses à l’aide du service en ligne Google Maps
- Produire la carte à l’aide de Leaflet
- Exporter la carte
Nous allons voir chacune de ces étapes ensemble. On commence !
Structure de la page web
La première étape pour extraire le contenu désiré d’une page web, c’est de trouver le sélecteur CSS associé à cet élément.
Dans ce cas-ci, nous cherchons à extraire un tableau. La balise HTML recherchée est <table>
.
Nous avons maintenant notre sélecteur CSS qui est
#tablepress-1
Extraction des données
Nous allons maintenant utiliser le logiciel R pour extraire la page.
La librairie rvest
permet d’extraire des données depuis le langage HTML. Elle fait partie de la collection Tidyverse. Celle-ci est développée par Hadley Wickham, un grand contributeur à la communauté du langage R.
Nous allons aussi utiliser dplyr
, stringr
et ggmap
, la première pour manipuler le tableau de données, et la seconde pour manipuler les chaînes de caractères et la dernière pour traiter les données géospatiales.
library("rvest") library("dplyr") library("ggmap") library("stringr")
Insérons l’URL de la page ainsi que le sélecteur CSS dans deux variables.
url_page <- "https://sauvetabouffe.org/boite-a-outils/repertoire-des-frigos-communautaires-du-quebec/" selecteur_css <- "#tablepress-1"
Nous allons maintenant télécharger la page web avec la fonction read_html
de rvest
.
html_page <- read_html(url_page)
Ensuite, nous allons extraire le tableau à l’aide de deux autres fonctions de rvest
.
frigo_table <- html_page %>% html_element(selecteur_css) %>% html_table()
Nous avons maintenant un tableau de données (data.frame) dans la variable frigo_table. Voici un aperçu.
Nettoyage des données
Nous allons maintenant nettoyer ces données. Nous remarquons, en particulier, que l’adresse contient aussi une indication pour préciser la localisation une fois qu’on se trouve à la bonne adresse. Cependant, pour effectuer le géocodage, nous n’en avons pas besoin. Nous allons donc la supprimer.
Pour ce faire, nous allons utiliser une expression régulière. C’est une chaîne de caractère qui représente un modèle pour extraire une section précise d’un texte.
Nous cherchons ici à enlever le texte qui est entre parenthèses à la fin de la chaîne de caractères de l’adresse.
L’expression prend donc la forme suivante:
\(.*\)$
Voici une explication en utilisant l’outil web RegExr.
Fait à noter, avec le langage R, il faut doubler les backslash « \\ ». L’extraction se fait donc comme suit.
Nous créons la colonne adr_propre
depuis Adresse
en supprimant ce qui correspond à l’expresion régulière avec str_remove
, puis nous supprimons les espaces superflus avec str_trim
.
frigo_table2 <- frigo_table %>% mutate(adr_propre = Adresse %>% str_remove("\\(.*\\)$") %>% str_trim())
Géocodage des adresses des frigos communautaires
Pour géocoder les adresses, nous utilisons l’outil Google Maps. Pour ce faire, il faut se créer une clé d’API Google. La documentation pour ce faire se trouve ici.
Pour enregistrer notre clé dans la session R, on utilise la fonction register_google
.
Nous pouvons ensuite utiliser la fonction geocode de ggmap pour obtenir le géocodage depuis Google Maps. La 4e adresse n’a rien retourné, je vais donc aller cherches les coordonnées manuellement et la patcher pour avoir des données complètes.
geo_frigo <- geocode(frigo_table2$adr_propre) # Je patch celle qui n'a pas fonctionné geo_frigo[4,] <- list(-67.4330588, 48.4657985)
Je vais maintenant joindre les coordonnées aux tableau de données, puis exporter les données au format CSV.
frigo_table3 <- frigo_table2 %>% cbind(geo_frigo) frigo_table3 %>% write.csv("frigo_table.csv")
Production de la carte des frigos communautaires
Nous allons importer 4 librairies additionnelles.
sf
(qui signifie Simple Features, permet de manipuler des tableaux de données géospatiales).leaflet
(pour créer la carte)htmltools
(générer le popup de la carte)htmlwidgets
, (exporter la carte dans une page HTML autonome)
library("sf") library("leaflet") library("htmltools") library("htmlwidgets")
Nous allons lire le fichier CSV créé précédement, créer un tableau de données géoréférencées avec st_as_sf
puis le convertir au format geojson à l’aide de write_sf
. Puisque cette dernière fonction ne permet pas d’écraser les données, nous allons les effacer par file.remove
en validant si elles existent avec file.exists
.
frigo_table_sf <- read.csv("frigo_table.csv") %>% st_as_sf(frigo_table3, coords = c("lon", "lat")) if (file.exists("frigo_table_sf.geojson")){ file.remove("frigo_table_sf.geojson") } frigo_table_sf %>% write_sf("frigo_table_sf.geojson")
Voici un aperçu des données. La colonne geometry
contient les coordonnées GPS des emplacements des frigos communautaires.
Nous allons maintenant créer la carte. Nous remarquons que pour chaque marqueur, nous créons un popup qui contient du code HTML généré depuis les variables Quoi
, Adresse
et Particularités
.
La carte est contenu dans la variable l
à cette étape.
l <- leaflet(data = frigo_table_sf) %>% addTiles() %>% addMarkers(popup = ~paste0( '<h2>', Quoi, '</h2><p>', Adresse, "</p>", Particularités %>% str_replace_all("\\n", "<br>") ))
Elle ressemble à ceci, dans l’éditeur de code R que j’utilise.
Exportation de la carte des frigos communautaires
Pour exporter la carte, j’appelle une dernière fonction.
saveWidget(l, file = "frigo_carte.html")
Pour voir la carte, clique sur le lien suivant.
Conclusion
Je fais ça par plaisir, créer des cartes, des visualisations, des produits tangibles avec des données, parce que c’est agréable et ça fait sourire 😊 !
Comme tu peux voir, je suis parti d’une page web, pas d’une base de données toute bien structurée. Derrière ces informations, il y a des gens, des bénévoles, des passionnés, des gens de cœur, qui ont monté des frigos communautaires pour offrir de la nourriture fraîche aux gens dans le besoin.
Grâce à ça, je vais permettre à plus de gens de participer à la cause. Les données, ça semble parfois technique et froid. Mais, ici, ça garde des aliments au froid et des cœurs au chaud 💛 !