Zoomer sur une carte avec R

Dans ce billet je propose une manière de zoomer sur une zone particulière d’une carte avec R.
Ce zoom peut être défini précisément si l’on connaît à l’avance les coordonnées géographiques de la zone à afficher (sa bounding box), il peut aussi être défini interactivement grâce à la fonction locator().

J’utilise les packages sf (pour la gestion des objets spatiaux), cartography (pour l’ajout d’éléments d’habillage) et rnaturalearth (pour acceder aux fonds de cartes libres de Natural Earth).

Import et affichage des données

# load libraries
library(sf)
library(cartography)
library(rnaturalearth)

# import world countries and coastlines from Natural Earth
country <- ne_countries(scale = 50, returnclass = "sf", 
                        type="sovereignty")
coastline <- ne_coastline(scale = 50, returnclass = "sf")

# Change the projection to Natural Earth II projection 
# (http://www.shadedrelief.com/NE2_proj/)
country <- st_transform(country, "+proj=natearth +wktext")
coastline <- st_transform(coastline, "+proj=natearth +wktext")

# Define a palette of pastel colors
cols <- carto.pal("pastel.pal",20)

# Plot the countries
plot(st_geometry(country), col=cols, border="grey50", lwd=0.5)

Zoom sur une zone en connaissant sa bounding box

Nous souhaitons faire une carte centrée sur la Corée du Sud et nous connaissons les coordonnées de la bounding box du pays dans la projection de notre fond de carte (xmin = 11405000, xmax = 11831000, ymin = 3736000, ymax = 4347000). Il suffit alors d’utiliser les arguments xlim et ylim de la fonction plot().

# Plot countries using the South Korean bounding box
plot(st_geometry(country), 
     xlim = c(11405000,  11831000), 
     ylim = c(3736000, 4347000), 
     col = cols, border="#BB954E", lwd=0.5, bg="#1CB2E7")
# Add the coastline
plot(st_geometry(coastline), col="lightblue", add=T, lwd=1)
# Add label
labelLayer(x = country, txt = 'sovereignt', halo=TRUE)
# Add layout elements
layoutLayer(title = "Zoom on South Korea", 
            author = "Made with Natural Earth. Free vector and raster map data @ naturalearthdata.com.", 
            sources = "cartography 2.0.2", 
            tabtitle = TRUE, frame=FALSE, scale = NULL)

Zoom sur une zone avec une sélection interactive

Il est aussi possible de définir un zoom en sélectionnant interactivement une emprise dans la fenêtre graphique. La fonction locator() permet de cliquer sur un graphique et d’enregistrer les coordonnées du clic dans le système de coordonnées du graphique. Pour définir une emprise de zoom nous avons besoin de définir les coordonnées min et max de sa bounding box, nous avons donc besoin d’enregistrer la position de deux clics, les points extrêmes sud-ouest et nord-est.

Nous affichons d’abord la carte dans son emprise globale, puis nous cliquons deux fois pour définir la fenêtre de zoom.

# Plot the countries
plot(st_geometry(country), col=cols, border="grey50", lwd=0.5)

# Get a bounding box interactively
loc <- locator(n = 2)

> loc
$x
[1] -1861350  1763385
$y
[1]  349129.6 2161497.1

Nous pouvons ensuite afficher les pays en utilisant encore les arguments xlim et ylim.

# Plot countries using the interactively defined bounding box
plot(st_geometry(country), col=cols, 
     border="#BB954E", lwd=0.5, bg="#1CB2E7", 
     xlim=loc[[1]], ylim=loc[[2]])
# Add the coastline
plot(st_geometry(coastline), col="lightblue", add=T, lwd=1)
# Add labels
labelLayer(x = country, txt = 'name', halo=TRUE)
# Add layout elements
layoutLayer(title = "Zoom on Western Arica", 
            author = "Made with Natural Earth. Free vector and raster map data @ naturalearthdata.com.", 
            sources = "cartography 2.0.2", 
            tabtitle = TRUE, frame=FALSE, scale = NULL)
 

Les fonctions zoom() et drawExtent() du package raster permettent d’effectuer le même genre d’opérations.

Le code de ce post est disponible ici.


Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.