Frigos communautaires, données et sourires !

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.

Aperçu du tableau de données des frigos communautaires importé dans R

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 💛 !

Articles connexes