Archives par mot-clé : sf

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.

New version of the cartography package

A new version of the cartography package (v2.0.1) has arrived on CRAN.

cartography allows various cartographic representations such as proportional symbols, chroropleth, typology, flows or discontinuities maps. It also offers several features enhancing the graphic presentation of maps like cartographic palettes, layout elements (scale, north arrow, title…), labels, legends or access to some cartographic APIs.

Up to version 1.4.2 cartography was mainly based on sp and rgeos for its spatial data management and geoprocessing operations. These dependencies have been as much as possible replaced by sf functions since version 2.0.0.
Most functions are kept unchanged except for the addition of an x argument used to take sf objects as inputs.
See the NEWS file for the full list of changes and see sf README in case of installation problems with sf.
Continuer la lecture de New version of the cartography package

sf & cartography v2.0.0

Ce billet évoque les évolutions récentes du traitement des données spatiales avec R ainsi que la mise à jour du package cartography pour prendre en compte ces changements.

Le package sf

Le 31 octobre 2016 le package sf a été mis à disposition sur le CRAN par Edzer Pebesma (déjà maintainer de sp et contributeur actif à rgeos et rgdal).
Le package sf est une implémentation du standard Simple Features de l’OGC.

Jusqu’à présent l’import, l’export, la gestion, le traitement des données spatiales dans R se faisaient grâce à 3 packages principaux : rgdal (pour l’import/export des données et les opérations de projections), sp (pour la gestion et l’affichage des données) et rgeos (pour les géotraitements). sf rassemble en un seul package la plupart des fonctionnalités de ces trois packages.

Le nouveau format fourni par sf et visant a remplacer les formats Spatial*DataFrame est le data.frame enrichi d’une « colonne-liste » de géométries :

Simple Features for R – Edzer Pebesma

Ce format est considéré comme tidy et les fonctions de sf sont compatibles avec l’opérateur pipe.
Vous trouverez à la fin du billet une liste de ressources sur le package sf.

Le package cartography

L’avenir du spatial dans R s’oriente à plus ou moins court terme vers l’utilisation de sf en lieu et place du trio rgdal/sp/rgeos.
Nous avons donc décidé de rendre le package cartography compatible avec les objets de type sf, nous utilisons également les fonctions et formats sf dans les fonctions du package.

La plupart des fonctions restent inchangées, mis à part l’ajout d’un argument x en première place, destiné à l’utilisation des objets sf.
Avant :

choroLayer(spdf, spdfid, df, dfid, var, ...)

Après :

choroLayer(x, spdf, spdfid, df, dfid, var, ...)

Les objets sf contiennent les données attributaires et les géométries d’une manière beaucoup plus pratique que les Spatial*DataFrame. Si l’argument x est utilisé les données attributaires doivent être contenues dans l’objet sf et les arguments spdf, spdfid, df, dfid ne sont pas pris en compte.

Certaines fonctions ont changé plus profondément d’input et d’output (getBorders, getLinkLayer, getGridLayer, discLayer…), l’ensemble des changement est visible ici : NEWS.

La version de cartography prenant en compte sf est pour l’instant disponible sur GitHub et sera bientôt sur le CRAN.

require(devtools)
install_github("riatelab/cartography")

Ressources sur le package sf

La page GitHub du package sf
C’est dans ce dépôt GitHub que se déroule le développement du package et que se tiennent les discussions à son sujet.

Ressources publiées par Edzer Pebesma

Billets de blogs / tutoriels