Potion Bottle Icon Manuel d'alchimie du code Potion Bottle Icon

Frigos communautaires, données et sourires

- 1,148 mots - Temps de lecture estimé: 6 minutes

Offre de formation

Crystal Ball IconUtiliser des chatbots LLM localement et protéger ses donnéesCrystal Ball Icon

Utilise l'IA sans envoyer les données de ta clientèle sur des serveurs américains. Fais tourner des modèles directement sur ton ordinateur, en toute confidentialité. Conforme à la loi 25.

Réconcilie IA et vie privée — Inscris-toi

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


Sun Face IconComment créer une carte interactive des frigos communautaires du Québec ?Sun Face Icon


À partir d’un répertoire web de frigos communautaires du Québec, cet article montre comment extraire les données avec R (rvest), géocoder les adresses via Google Maps et produire une carte interactive avec Leaflet. Le résultat est une carte utilisable directement dans un navigateur pour trouver le frigo communautaire le plus proche.

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:

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](https://rvest.tidyverse.org/) 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.

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.

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")

🌘 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

Offre de service

Moon Phases IconConsultation stratégique IA et vie privée — 2 heures — 490 $Moon Phases Icon

Tu veux intégrer l’IA sans compromettre les données de ta clientèle ? En 2 heures, je t’aide à définir une stratégie IA responsable, basée sur les normes ISO et IEEE.

La consultation inclut un plan d'action détaillé pour mettre en œuvre les recommandations et prioriser les étapes suivantes.

Réserve ta Consultation stratégique
Abonne-toi au fil RSS pour ne rien manquer.

Étiquettes