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

Géolocalisation des frigos communautaires avec R et Leaflet

- 589 mots - Temps de lecture estimé: 3 minutes


Sun Face IconComment géocoder des adresses de frigos communautaires et les afficher sur une carte Leaflet avec R ?Sun Face Icon


Ce projet utilise R pour extraire un répertoire web de frigos communautaires, géocoder les adresses via Google Maps, et produire une carte interactive avec Leaflet. Deux scripts R (extraction.R et leaflet.R) forment le pipeline complet, de la donnée brute à la carte HTML autonome.

J’avais envie de voir concrètement où se trouvent les frigos communautaires au Québec. Le répertoire de Sauvetabouffe est une mine d’or, mais en format texte. J’ai donc bâti deux petits scripts R pour transformer ces adresses en une carte interactive.

graph TD
    A[Site Sauvetabouffe<br>Tableau HTML] --> B[rvest: html_table]
    B --> C[data.frame: région, nom, adresse, particularités]
    C --> D[str_remove: nettoyer adresses]
    D --> E[ggmap::geocode<br>Google Maps API]
    E --> F[Coordonnées lon/lat]
    F --> G[Fusionner au tableau principal]
    G --> H[CSV: frigo_table.csv]
    H --> I[sf: st_as_sf → GeoJSON]
    I --> J[Leaflet: addTiles + addMarkers]
    J --> K[HTML autonome: frigo_carte.html]

Le projet complet se trouve dans le dossier projets-vers-blogs/frigos_localisation/ de ce site. Tu y trouveras les deux scripts, les données brutes et leur version géospatiale.

🌘 Extraction des données depuis le web

Le script extraction.R va chercher le tableau des frigos sur le site de Sauvetabouffe et le transforme en données structurées.

library("rvest")
library("dplyr")
library("ggmap")
library("stringr")

url_page <-
  "https://sauvetabouffe.org/boite-a-outils/repertoire-des-frigos-communautaires-du-quebec/"
selecteur_css <- "#tablepress-1"

html_page <- read_html(url_page)

frigo_table <-
  html_page %>%
    html_element(selecteur_css) %>%
    html_table()

La librairie rvest extrait le tableau HTML à l’aide du sélecteur CSS #tablepress-1. Le résultat, un data.frame, contient la région, le nom du frigo, l’adresse et les particularités.

🌘 Nettoyage et géocodage

Les adresses contiennent souvent des parenthèses avec des précisions de localisation (ex : « dans la bibliothèque »). Pour le géocodage, on enlève cette information avec une expression régulière, puis on utilise ggmap pour interroger l’API Google Maps.

graph LR
    A[Adresse brute<br>ex: 123 Rue Exemple (dans la bibliothèque)] --> B[str_remove: enlever parenthèses]
    B --> C[Adresse propre<br>ex: 123 Rue Exemple]
    C --> D[geocode: Google Maps API]
    D --> E[Coordonnées: lon, lat]
    E --> F[Joindre au tableau principal]
frigo_table2 <- frigo_table %>%
  mutate(adr_propre = Adresse %>%
    str_remove("\\(.*\\)$") %>%
    str_trim())

geo_frigo <- geocode(frigo_table2$adr_propre)

# Patch manuel pour la 4e adresse qui n'a pas fonctionné
geo_frigo[4,] <- list(-67.4330588, 48.4657985)

Une fois les coordonnées obtenues, on les fusionne au tableau principal et on exporte le tout en CSV.

frigo_table3 <- frigo_table2 %>% cbind(geo_frigo)
frigo_table3 %>% write.csv("frigo_table.csv")

Le fichier frigo_table.csv contient maintenant 119 frigos avec leurs coordonnées géographiques.

🌘 Création de la carte Leaflet

Le script leaflet.R prend le relais pour transformer ces données en une carte interactive.

library("dplyr")
library("stringr")
library("sf")
library("leaflet")
library("htmltools")
library("htmlwidgets")

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

On lit le CSV, on le convertit en objet spatial avec sf (Simple Features) en spécifiant les colonnes de longitude et latitude, puis on sauvegarde en GeoJSON. Le format GeoJSON est pratique pour échanger des données géospatiales sur le web.

Le fichier frigo_table_sf.geojson est disponible dans le dossier du projet.

🌘 Carte interactive

Vient ensuite la création de la carte proprement dite.

l <- leaflet(data = frigo_table_sf) %>%
  addTiles() %>%
  addMarkers(popup = ~paste0(
    '<h2>',
    Quoi,
    '</h2><p>',
    Adresse,
    "</p>",
    Particularités %>%
      str_replace_all("\\n", "<br>")
  ))

saveWidget(l, file = "frigo_carte.html")

Chaque frigo devient un marqueur sur la carte. Le popup affiche le nom du frigo en titre, son adresse et ses particularités. La fonction saveWidget exporte la carte dans une page HTML autonome que tu peux ouvrir dans n’importe quel navigateur.

🌘 Données sources

Les fichiers suivants sont inclus dans le projet :

🌘 Pour aller plus loin

Tu peux facilement adapter ce pipeline à d’autres répertoires d’adresses : il suffit de changer l’URL et le sélecteur CSS. La même recette fonctionne pour des commerces, des organismes ou tout ce qui a une adresse et mérite une carte.

Les données des frigos communautaires sont publiques et mises à jour régulièrement par Sauvetabouffe. Si tu veux repartir de zéro, exécute extraction.R puis leaflet.R dans RStudio — l’API Google Maps te demandera une clé, mais le reste est prêt à l’emploi.

Abonne-toi au fil RSS pour ne rien manquer.

Étiquettes