6.4 Cartes avec {tmap} et autres

De nombreux packages R permettent de réaliser des cartes. Nous avons utilisé jusqu’à présent {ggplot2} pour visualiser nos objets sf. Mais d’autres moteurs graphiques peuvent aussi être employés pour générer des cartes statiques ou dynamiques et interactives.

6.4.1 Graphiques de base R

Le package {sf} associé à des instructions en R de base permet de réaliser des cartes. Le R de base à l’avantage d’être très rapide dans son exécution. Le package {mapsf}, successeur du package {cartography} permet d’améliorer ces graphiques comme avec la fonction mf_layout() pour ajouter un titre, une orientation ou encore une légende. Malheureusement, son interface (les fonctions et leurs arguments à utiliser) est totalement différente de {ggplot2}, de même que le rendu final. Nous l’évoquons, car il s’agit tout de même d’une solution efficace pour réaliser des cartes professionnelles dans R. Voici donc, de manière illustrative, une carte réalisée avec ce package.

library(mapsf)

plot(st_geometry(africa_sa),
  col = "grey", border = "grey3", bg = "lightblue1")
plot(st_geometry(s_africa_sa),
  add = TRUE, cex = 1.2, col = "darkseagreen3", pch = 20)
mf_layout(title = "Afrique", frame = TRUE, scale = TRUE,
  credits = "CRS = EPSG:22235") # credits est habituellement auteurs/sources

6.4.2 Utilisation de {tmap}

Le package {tmap} est un package dédié à la représentation cartographique dont la syntaxe va se rapprocher de celle de {ggplot2} (utilisé avec chart()). En effet, il superpose des couches sur le graphique en utilisant l’opérateur + comme vous avez l’habitude de faire jusqu’ici pour vos graphiques en R. Mais il est beaucoup plus rapide que {ggplot2} et permet de combiner à souhait des couches vectorielles et rasters. Il comprend également une série de fonctions de personnalisation de cartes très intéressantes.

Si nous reprenons notre carte du continent africain, cela donnera ceci en {tmap} : tm_shape() lit les données d’un objet raster ou sf et les fonctions suivantes telles que tm_polygons ou tm_borders() vont jouer le même effet que geom_xxx() dans {ggplot2} en matérialisant ces données sous une forme particulière (ici un polygone) sur la carte. Des fonctions comme tm_compass() ou tm_scale_bar() vont orienter la carte et lui ajouter une échelle. Enfin, tm_layout() propose de nombreux paramètres pour changer l’apparence de la carte et sont l’équivalent des fonctions theme_xxx() de {ggplot2}. Avec la SciViews Box 2022, vous n’avez pas besoin de charger {tmap} à l’aide de library(tmap). Si vous avez indiqué SciViews::R("spatial") plus haut dans votre document, {tmap} est déjà chargé.

tm_shape(africa_sa) +
  tm_borders() +
  # Mise en évidence de l'Afrique Australe
  tm_fill("austral", legend.show = FALSE) + 
  tm_compass(position = c("right", "top")) + # Ajout de l'orientation
  tm_scale_bar(position = c("left", "bottom")) + # Ajout de l'échelle
  tm_layout(bg.color = "skyblue") # Ajout d'un fond bleu

Les avantages de {tmap} apparaissent clairement lorsqu’une couche raster est ajoutée au graphique. Reprenons notre carte du relief marocain que nous avions été incapables de réaliser en un temps raisonnable avec {ggplot2} sous forme entièrement convertie en objets vectoriels sf. Et bien avec {tmap} cette carte se réalise le plus naturellement du monde.

Nous allons d’abord effectuer une carte des frontières uniquement. Nous ne sommes pas obligés de le faire, mais nous pouvons assigner une carte à un objet R. Dans ce cas, la carte n’est affichée que si l’objet est imprimé.

m_map <- tm_shape(m_bord) + tm_borders()

La carte est construite, mais rien ne s’affiche. C’est exactement comme avec {ggplot2}. Pour afficher la carte, nous faisons*/ :

m_map

Toujours comme {ggplot2}, le plus intéressant, c’est que nous pouvons partir de cet objet m_map et lui rajouter des couches par après. Ajoutons notre raster modèle terrain de moyenne résolution m_tm2 avec tm_shape() et matérialisons-le sur la carte avec tm_raster() :

m_map2 <- m_map +
  tm_shape(m_tm2) +
  tm_raster(n = 8, alpha = 0.7, , title = "Altitude [m]") +
  tm_layout(legend.position = c("left", "top"))
m_map2

Vous noterez à l’usage que les couches rasters ajoutées à {tmap} sont raisonnablement rapide, et en tous cas bien plus utilisables que dans {ggplot2}. Les arguments à tm_raster() sont assez clairs. Le nombre de niveaux de couleurs est donné (ou plutôt suggéré, car la meilleure distribution possible des couches sera calculée automatiquement) par n=, alpha= est la transparence permettant de voir la couche de la frontière par dessous et title= est le titre de la légende. Cette légende peut être (re)positionnée avec tm_layout().

Vous ne l’avez sans doute pas remarqué, mais il y a ici une différente importante avec {ggplot2}. Dans le graphique {ggplot2}, les esthétiques définies dans ggplot() ou chart() restent les valeurs par défaut jusqu’au bout. Avec {tmap}, chaque appel de tm_shape() remplace les données précédentes entièrement. Ainsi, tm_raster() se rapporte automatiquement à m_tm2 et non pas à m_bord qui n’est d’ailleurs plus accessible.

Nous vous laissons comme exercice l’annotation de cette carte avec orientation, échelle et (vous devrez chercher un peu), libellé des axes en latitude et longitude.

6.4.3 Cartes interactives

La librairie JavaScript leaflet est l’une des plus utilisées pour générer des cartes interactives dans un navigateur web. OpenStreetMap sert de fond de carte ici. Le package R du même nom permet d’utiliser cette librairie dans R et RStudio. Le package {mapview} offre une surcouche pour faciliter la création de ces cartes interactives, y compris dans des documents R Markdown. C’est très utile pour visualiser ce que contient un objet sf.

SciViews::R("spatial")

read("World", package = "tmap") %>.%
  st_as_sf(.) %>.%
  filter(., continent == "Africa") %>.%
  mapview::mapview(.)

À cause d’un bug dans {leaflet} la carte interactive que l’on obtient ici ne s’affiche pas dans un bookdown. Par contre, si ce code est exécuté dans RStudio (copiez-collez ce code dans la console R dans RStudio), la carte apparaîtra dans l’onglet “Viewer”, et vous pourrez utiliser le bouton “Zoom” pour voir cette carte dans une fenêtre agrandie. Il est alors possible de zoomer/dézoomer (boutons + et -), changer de fond de carte (boutons juste en dessous) et visualiser les informations annexes de l’objet sf en cliquant sur un pays. Les fonctions de {leaflet} permettent de faire encore plus de choses, voyez sa documentation. C’est un outil fantastique pour explorer de manière interactive des données spatialisées !

Le package {tmap} propose également de convertir ses cartes en carte interactive avec {leaflet}. C’est la fonction tmap_mode() qui permet de décider si la carte est figée si on indique "plot" ou interactive si on indique "view".

tmap_mode("view")
m_map2
# Ne pas oublier de repasser dans l'autre mode, sinon toutes les cartes
# suivantes seront interactives !
tmap_mode("plot")

Pour la même raison (bug), ce code n’est pas exécuté ici, mais s’il l’était, vous auriez la carte interactive ci-dessous.

6.4.4 Édition interactive

Le package {mapedit} propose des fonctions qui permettent d’éditer et de créer des objets sf. L’exemple suivant trace un polygone sur la Zélande (province du sud des Pays-Bas) et vous permet de l’éditer et de le sauver. Exécutez ce code dans RStudio pour voir de quoi il s’agit exactement (tmaptools::bb() crée une boite encadrant une zone, que vous pouvez éditer à la souris grâce à editMap()).

library(mapedit)
library(mapview)

# Toutes les provinces des Pays-Bas
NLD_prov <- read("NLD_prov", package = "tmap")
# Zélande seulement
zeeland <- NLD_prov[10, ]
# Boite encadrant la Zélande comme point de départ d'un polygone
zeeland_bb <- tmaptools::bb(zeeland)
# Carte interactive permettant d'éditer ce polygone
editMap(mapview(zeeland_bb), targetLayerId = "zeeland_bb")

Les boutons à gauche permettent d’éditer des polygones existants ou d’en créer de nouveaux au-dessus du fond de carte. Les modifications sont sauvegardées automatiquement quand vous cliquez sur le bouton Done bleu en bas à droite.

À vous de jouer !

Effectuez maintenant les exercices du tutoriel C06La_map (Réalisation de cartes avec R).

BioDataScience3::run("C06La_map")
Pour en savoir plus

De nombreuses ressources existent sur Internet pour la cartographie avec R. En voici quelques-unes intéressantes qui vous permettront d’approfondir cette vaste matière.