Comment géocoder des adresses de frigos communautaires et les afficher sur une carte Leaflet avec R ?
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.Retleaflet.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 :
extraction.R— script d’extraction et géocodageleaflet.R— script de création de la carte Leafletfrigo_table.csv— données tabulaires avec coordonnéesfrigo_table_sf.geojson— données au format géospatial
🌘 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.