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.

library(sf)
library(leaflet)
library(RColorBrewer)
library(dplyr)

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
carte

Si 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")
À vous de jouer

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
carte

Nous avons maintenant une carte interactive qui nous renvoie facilement vers une page externe.

À vous de jouer

Changez le label pour afficher la page OpenData du département cliqué.