library(sf)
library(leaflet)
library(RColorBrewer)
library(dplyr)Cartographie dynamique
Objectifs du sixième volet
Ce sixième volet présente une méthode pour générer des cartes dynamiques destinées à une publication sur le Web. Par dynamique, nous entendons la possibilité de zoomer/dézoomer, et de faire surgir des informations lors du survol de la souris ou lors d’un clic. À l’issue de ce sixième volet, vous serez capables d’effectuer les manipulations suivantes :
- générer une carte choroplèthe au format leaflet
- régler les interactions avec la souris
Données fournies
Pour cet exercice, nous utiliserons les données fournies suivantes :
- la couche des départements avec les densités de population (dep_France_pop.gpkg cf première partie)
Carte choroplèthe interactive
Nous commençons par charger les librairies nécessaires. Nous utiliserons la librairie sf et non terra pour charger notre vecteur, car leaflet ne gère pas le format spatVector de terra. La librairie RColorBrewer nous permet d’utiliser des palettes de couleurs préconfigurées et pertinentes.
Nous chargeons ensuite la couche vecteur des départements contenant un attribut relatif à la densité de population. Nous en profitons pour vérifier la structure des données.
# Chargement de la couche des départements
departements <- st_read("./Data_processed/dep_France_pop.gpkg")Reading layer `dep_France_pop' from data source
`/home/poulpe/Enseignement/r_initiation_geomatique/Data_processed/dep_France_pop.gpkg'
using driver `GPKG'
Simple feature collection with 96 features and 8 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: 99217.1 ymin: 6049646 xmax: 1242417 ymax: 7110480
Projected CRS: RGF93 v1 / Lambert-93
# Vérification des données
print(head(departements))Simple feature collection with 6 features and 8 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: 644724.2 ymin: 6272482 xmax: 1077560 ymax: 6997000
Projected CRS: RGF93 v1 / Lambert-93
CODE_DEPT Population_dep Superficie_dep_km2 NOM_DEPT CODE_REG
1 01 619497 5784.607 AIN 84
2 02 540067 7419.808 AISNE 32
3 03 343431 7377.578 ALLIER 84
4 04 161916 6995.088 ALPES-DE-HAUTE-PROVENCE 93
5 05 139279 5690.767 HAUTES-ALPES 93
6 06 1080771 4292.230 ALPES-MARITIMES 93
NOM_REG nb_communes_dep densite_hab
1 AUVERGNE-RHONE-ALPES 410 107.09405
2 NORD-PAS-DE-CALAIS-PICARDIE 805 72.78719
3 AUVERGNE-RHONE-ALPES 318 46.55065
4 PROVENCE-ALPES-COTE D'AZUR 199 23.14710
5 PROVENCE-ALPES-COTE D'AZUR 168 24.47456
6 PROVENCE-ALPES-COTE D'AZUR 163 251.79707
geom
1 MULTIPOLYGON (((840094.1 65...
2 MULTIPOLYGON (((712907.3 68...
3 MULTIPOLYGON (((672884.6 65...
4 MULTIPOLYGON (((922165.4 62...
5 MULTIPOLYGON (((914690.3 63...
6 MULTIPOLYGON (((1009089 628...
print(summary(departements$densite_hab)) Min. 1st Qu. Median Mean 3rd Qu. Max.
14.80 49.71 81.60 559.50 156.98 21039.64
La librairie leaflet ne gère que les couches dont le système de coordonnées de référence est le WGS84. Nous changeons donc le SCR de notre couche si nécessaire.
# Transformation en WGS84 si nécessaire (requis pour Leaflet)
if(st_crs(departements)$input != "EPSG:4326") {
departements <- st_transform(departements, 4326)
}Nous créons ensuite une palette de couleurs selon des bornes, appelées ici breaks. Nous faisons des breaks par quantiles de 20 % sur la colonne des densités de population. Nous appliquons ensuite la palette de couleurs nommée YlOrRd de RColorBrewer aux densités de populations selon les bornes définies précédemment.
# Création d'une palette de couleurs
# Définition des breaks de 0 à 100 % tous les 20 % (O.2)
breaks <- quantile(departements$densite_hab, probs = seq(0, 1, 0.2), na.rm = TRUE)
# Création de la palette de couleurs
pal <- colorBin("YlOrRd", domain = departements$densite_hab, bins = breaks)Nous créons maintenant les labels qui seront affichées lors du survol d’un département. Nous y afficherons le nom du département en gras, suivi sur une ligne au-dessous de la densité arrondie à un chiffre après la virgule.
# Création des étiquettes pour les popups des labels
labels <- sprintf(
"<strong>%s</strong><br/>
Densité : %g hab/km²",
departements$NOM_DEPT,
round(departements$densite_hab, 1)
) %>% lapply(htmltools::HTML)Enfin, nous créons la carte proprement dite en y mettant notre couche de départements, sur un fond OpenStreetMap. Nous réglons différentes options de mises en forme, nous ajoutons les labels, une légende et un niveau de zoom.
# Création de la carte Leaflet
carte <- leaflet(departements) %>%
# Ajout du fond de carte
addProviderTiles(providers$CartoDB.Positron) %>%
# Ajout des polygones départementaux
addPolygons(
fillColor = ~pal(densite_hab),
weight = 1,
opacity = 1,
color = "white",
dashArray = "3",
fillOpacity = 0.7,
highlight = highlightOptions(
weight = 3,
color = "#666",
dashArray = "",
fillOpacity = 0.8,
bringToFront = TRUE
),
label = labels,
labelOptions = labelOptions(
style = list("font-weight" = "normal", padding = "3px 8px"),
textsize = "15px",
direction = "auto"
)
) %>%
# Ajout de la légende
addLegend(
pal = pal,
values = ~densite_hab,
opacity = 0.7,
title = "Densité de population<br>(hab/km²)",
position = "bottomright"
) %>%
# Centrage sur la France
setView(lng = 2.3, lat = 46.8, zoom = 6)
# Affichage de la carte
carteSi nous souhaitons exporter le fichier HTML correspondant à cette carte interactive, il suffit de lancer la commande suivante une fois la carte générée.
htmlwidgets::saveWidget(carte, "./Data_processed/carte_densite_departements.html")Réalisez les deux tâches suivantes :
- changez les différents paramètres de mise en page (palette de couleurs, opacité, niveau de zoom, …) afin de bien les comprendre.
- refaites la même manipulation mais pour les communes d’une région ou d’un département de votre choix.
Ajout vers des données externes
Ici, nous allons permettre d’afficher une infobulle contenant un lien vers la page INSEE du département sur lequel nous aurons cliqué. Le script est identique au précédent, seule une nouvelle variable popup esr créée et appelée. Dans ce pop-up nous récupérons le nom du département et nous créons l’URL INSEE générique avec ce nom.
# Chargement des bibliothèques nécessaires
library(sf)
library(leaflet)
library(RColorBrewer)
library(dplyr)
# Chargement de la couche
departements <- st_read(".//Data_processed/dep_France_pop.gpkg")Reading layer `dep_France_pop' from data source
`/home/poulpe/Enseignement/r_initiation_geomatique/Data_processed/dep_France_pop.gpkg'
using driver `GPKG'
Simple feature collection with 96 features and 8 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: 99217.1 ymin: 6049646 xmax: 1242417 ymax: 7110480
Projected CRS: RGF93 v1 / Lambert-93
# Transformation en WGS84 si nécessaire (requis pour Leaflet)
if(st_crs(departements)$input != "EPSG:4326") {
departements <- st_transform(departements, 4326)
}
# Création d'une palette de couleurs selon les quantiles de 20 % sur la densité
breaks <- quantile(departements$densite_hab, probs = seq(0, 1, 0.2), na.rm = TRUE)
# Création de la palette de couleurs
pal <- colorBin("YlOrRd", domain = departements$densite_hab, bins = breaks)
# Création des étiquettes pour les popups de survol
labels <- sprintf(
"<strong>%s</strong><br/>
Densité : %g hab/km²",
departements$NOM_DEPT,
round(departements$densite_hab, 1)
) %>% lapply(htmltools::HTML)
# Création des étiquettes pour les popups avec lien INSEE lors du clic
labels_liens <- sprintf(
"<strong>%s</strong><br/>
Densité : %g hab/km²<br/>
<a href='https://www.insee.fr/fr/recherche?q=%s&debut=0' target='_blank'>
📊 Voir sur le site INSEE</a>",
departements$NOM_DEPT, # Utilisation de NOM_DEPT
round(departements$densite_hab, 1),
departements$NOM_DEPT
) %>% lapply(htmltools::HTML)
# Création de la carte Leaflet
carte <- leaflet(departements) %>%
# Ajout du fond de carte OSM
addProviderTiles(providers$CartoDB.Positron) %>%
# Ajout des polygones des départements avec la bonne palette de couleurs
addPolygons(
fillColor = ~pal(densite_hab),
weight = 1,
opacity = 1,
color = "white",
dashArray = "3",
fillOpacity = 0.7,
highlight = highlightOptions(
weight = 3,
color = "#666",
dashArray = "",
fillOpacity = 0.8,
bringToFront = TRUE
),
popup = labels_liens, # on ajoute un objet popup qui réagit au moment du clic
popupOptions = popupOptions(
maxWidth = 250,
closeButton = TRUE
),
label = labels,
labelOptions = labelOptions(
style = list("font-weight" = "normal", padding = "3px 8px"),
textsize = "13px",
direction = "auto"
)
) %>%
# Ajout de la légende
addLegend(
pal = pal,
values = ~densite_hab,
opacity = 0.7,
title = "Densité de population<br>(hab/km²)",
position = "bottomright"
) %>%
# Centrage sur la France
setView(lng = 2.3, lat = 46.8, zoom = 6)
# Affichage de la carte
carteNous avons maintenant une carte interactive qui nous renvoie facilement vers une page externe.
Changez le label pour afficher la page OpenData du département cliqué.