R pour les cartographes : le package cartography

R

  • R est un langage et un environnement permettant de réaliser une variété de traitements statistiques et de représentations graphiques.

  • R est un logiciel libre sous license GNU General Public License.

  • R est multiplateforme (GNU/Linux, Windows, OS X…).

































Environment

Popularité et vitalité

































Les fonctionnalités spatiales

Trois packages sont incontournables.

Le package rgdal, import/export d’objets spatiaux et gestion des projections cartographiques

rgdal est une interface entre R et les librairies GDAL (Geospatial Data Abstraction Library) et PROJ4.

Import du shapefile des régions européennes (NUTS3) :

library("rgdal")
nuts3 <- readOGR(dsn = "data", layer = "nuts3", verbose = TRUE)
OGR data source with driver: ESRI Shapefile 
Source: "data", layer: "nuts3"
with 1448 features
It has 7 fields

































Le package sp, manipulation et affichage d’objets spatiaux

sp fournit des classes et des methodes pour les données spatiales dans R.

Affichage des NUTS3 :

library("sp")
class(nuts3)
[1] "SpatialPolygonsDataFrame"
attr(,"package")
[1] "sp"
nuts3@proj4string
CRS arguments:
 +proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000
+ellps=GRS80 +units=m +no_defs 
nuts3@bbox
      min     max
x 2641758 7313157
y 1427614 5411284
head(nuts3@data)
     id birth_2008 death_2008 gdppps1999 gdppps2008   pop1999 pop2008
0 AT111        272        445        509        641  39148.91   37452
1 AT112       1195       1480       2262       3272 137469.46  146383
2 AT113        748       1142       1368       1783 100113.63   97350
3 AT121       2480       2119       4091       5807 238591.26  241083
4 AT122       2266       2577       4130       5774 244959.00  251838
5 AT123       1363       1392       3098       4504 144269.11  147468
plot(nuts3)

plot(nuts3, col = "#DAE3E6", border = "#8A0641", lwd = 0.5)

































Le package rgeos, géotraitements

rgeos donne accès à la librairie d’opérations spatiales GEOS (Geometry Engine - Open Source) qui permet notamment d’effectuer les géotraitements suivants :

  • Area / Perimeter
  • Distances
  • Buffer
  • Overlap / intersect / difference
  • Contains / within
  • Union
  • Dissolve

Agrégation des polygones / dissolve

library("rgeos")
europe <- gUnaryUnion(spgeom = nuts3)
plot(nuts3, lwd = 0.5)
plot(europe, lwd = 2, border = "red", add = T)

Création de zones tampons / buffer

library("rgeos")
europeBuffer <- gBuffer(spgeom = europe, width = 50000)
plot(europe, col = "#92C5D6")
plot(europeBuffer, add = T, border = "red")

































Mais aussi…

Des liens sont possibles avec des SIG ou des bases de données spatiales :

  • GRASS (spgrass6, rgrass7)
  • QGIS (via Processing, anciennement sextante)
  • ArcGis (RPyGeo via Python)
  • PostGis / PostGreSQl (RPostgreSQL)

































Le package cartography

Conçu comme une boite à outil dédiée à la cartographie thématique, le package cartography est développé au sein de l’UMS RIATE (CNRS, CGET, Université Paris Diderot) par Nicolas Lambert et Timothée Giraud.

































Installation

La version stable est sur le CRAN.

install.packages("cartography")

La version de développement est hébergée sur GitHub.

require(devtools)
devtools::install_github("Groupe-ElementR/cartography")

Vous pouvez nous faire remonter d’éventuels bugs ici.

































Les données

Les exemples utilisent les jeux de données fournis avec le package. Ces données portent sur les maillages régionaux européens NUTS.

# Chargement de la librairie
library(cartography)

# Import de données dans la session
data(nuts2006)

ls()
 [1] "coasts.spdf"    "countries.spdf" "frame.spdf"     "graticule.spdf"
 [5] "nuts0.df"       "nuts0.spdf"     "nuts1.df"       "nuts1.spdf"    
 [9] "nuts2.df"       "nuts2.spdf"     "nuts3.df"       "nuts3.spdf"    
[13] "twincities"     "world.spdf"    

Les objets terminant par “.spdf”" sont des objets spatiaux et ceux terminant par “.df” sont des data frames.

































Carte Choroplethes

# Calcul du taux de croissance annuel moyen
nuts2.df$cagr <- 100 * (((nuts2.df$pop2008/nuts2.df$pop1999)^(1/9)) - 1)

# Cartographie
choroLayer(spdf = nuts2.spdf, df = nuts2.df, var = "cagr")
title("Taux de croissance en Europe")

Après ce premier jet, il est ensuite possible de paramétrer très finement la carte : palette de couleurs, discrétisation, légende, couches d’habillage…

# Construire une palette de couleurs
cols <- carto.pal(pal1 = "green.pal", n1 = 2, 
                  pal2 = "red.pal", n2 = 4) 

# Affichage de couches d'habillage
plot(nuts0.spdf, border = NA, col = NA, bg = "#A6CAE0")
plot(world.spdf, col  = "#E3DEBF", border=NA, add=TRUE)

# Cartographie du taux de croissance annuel moyen
choroLayer(spdf = nuts2.spdf, df = nuts2.df, var = "cagr",#
           breaks = c(-2.43,-1.0,0.0,0.5,1.0,2.0,3.1), 
           col = cols,
           border = "grey40",
           lwd = 0.5, 
           legend.pos = "right",
           legend.title.txt = "taux de croissance\nannuel moyen", 
           legend.values.rnd = 2, 
           add = TRUE) 

# Affichage de couches d'habillage
plot(nuts0.spdf,border = "grey20", lwd=0.75, add=TRUE)

# Ajout des titres, légende, sources, etc.
layoutLayer(title = "Taux de croissance en Europe", 
            author = "cartography", 
            sources = "Eurostat, 2008", frame = TRUE, col = NA, 
            scale = NULL,coltitle = "black",
            south = TRUE) 

































Cartes en symboles proportionnels

# Affichage de couches d'habillage
plot(nuts0.spdf, border = NA, col = NA, bg = "#A6CAE0")
plot(world.spdf, col  = "#E3DEBF", border=NA, add=TRUE)
plot(nuts0.spdf, col = "#D1914D",border = "grey80", add=TRUE)

# Cartographie de la population des pays en cercles proportionnels
propSymbolsLayer(spdf = nuts0.spdf, df = nuts0.df,#
                 var = "pop2008", 
                 symbols = "circle", col =  "#920000",
                 legend.pos = "right",
                 legend.title.txt = "Total\npopulation (2008)",
                 legend.style = "c")

# Ajout des titres, légende, sources, etc.
layoutLayer(title = "Countries Population in Europe",
            author = "cartography",
            sources = "Eurostat, 2008",
            scale = NULL,
            south = TRUE)

































Cartes de flux

Il s’agit de représenter des données, agrégées à un niveau régional, sur les jumelages entre villes.

# Données sur les jumelages
head(twincities)
     i    j fij
1 DE14 AT11   1
2 DE21 AT11   1
3 DE23 AT11   1
4 DE26 AT11   2
5 DE91 AT11   1
6 DEB3 AT11   1
# Creation d'une couche de liens
twincities.spdf <- getLinkLayer(spdf = nuts2.spdf, df = twincities) 

# Affichage des liens créés
plot(twincities.spdf, lwd = 0.2)

# Affichage de couches d'habillage
plot(nuts0.spdf, border = NA, col = NA, bg = "#A6CAE0")
plot(world.spdf, col  = "#E3DEBF", border=NA, add=TRUE)
plot(nuts2.spdf, col = "#D1914D",border = "grey80", add=TRUE)

# Cartographie des liens
gradLinkLayer(spdf = twincities.spdf, df = twincities,   #
              spdfids = "i", spdfide = "j", dfids = "i", dfide = "j", 
              var = "fij", 
              breaks = c(2,5,15,20,30), 
              lwd = c(0.1,1,4,10), 
              col = "#92000090",
              legend.pos = "right", legend.frame = TRUE,
              legend.title.txt = "Number of Agreements\n(regional level)",
              add = TRUE)

# Ajout des titres, légende, sources, etc.
layoutLayer(title = "International Twinning Agreements Between Cities", 
            author = "cartography", 
            sources = "Sources: Adam Ploszaj & Wikipedia, 2011",
            scale = NULL, south = TRUE, frame = TRUE, col = NA, 
            coltitle = "black")

































Discontinuités

# Construction les polylignes des frontières inter-étatiques
nuts0.contig.spdf <- getBorders(nuts0.spdf)

plot(nuts0.spdf, bg = "#A6CAE0", col = "#D1914D",border = "grey80")
plot(nuts0.contig.spdf, col = 1:nrow(nuts0.contig.spdf), lwd = 2, add=TRUE)

head(nuts0.contig.spdf@data)
         id id1 id2
AT_CH AT_CH  AT  CH
AT_CZ AT_CZ  AT  CZ
AT_DE AT_DE  AT  DE
AT_HU AT_HU  AT  HU
AT_IT AT_IT  AT  IT
AT_LI AT_LI  AT  LI
# Calcul du PIB/habitant
nuts0.df$gdpcap <- nuts0.df$gdppps2008/nuts0.df$pop2008*1000000

# Affichage de couches d'habillage
plot(nuts0.spdf, border = NA, col = NA, bg = "#A6CAE0")
plot(world.spdf, col  = "#E3DEBF", border=NA, add=TRUE)

# Cartographie du PIB/habitants
choroLayer(spdf = nuts0.spdf, df = nuts0.df, var = "gdpcap", #
           border = "grey80",
           col = carto.pal(pal1 = "kaki.pal", n1 = 6), 
           method = "quantile",
           nclass = 6, add=TRUE, 
           legend.pos = "right", 
           legend.values.rnd = -2,
           legend.title.txt = "GDP per Capita\n(in euros)")

# Plot discontinuities
discLayer(spdf = nuts0.contig.spdf, df = nuts0.df, var = "gdpcap", 
          type = "rel", 
          method = "equal", 
          nclass = 4, 
          threshold = 0.5, 
          sizemin = 0.5, 
          sizemax = 6, 
          col="red",
          legend.values.rnd = 1,
          legend.title.txt = "Discontinuities in \nGDP per Capita\n(relative)",
          legend.pos = "topright", 
          add=TRUE)

# Ajout des titres, légende, sources, etc.
layoutLayer(title = "Wealth Disparities in Europe",
            coltitle = "black", col = NA,
            sources = "Eurostat, 2011", 
            scale = NULL,
            author = "cartography", 
            frame = FALSE)

































Carroyages

# Creation d'une grille régulière
mygrid <- getGridLayer(spdf=nuts2.spdf, cellsize = 200000)

# Affichage de la grille
plot(mygrid$spdf)

# Adaptation des données à la grille
datagrid.df <- getGridData(x = mygrid, df = nuts2.df, var = "pop2008") 
datagrid.df$densitykm <- datagrid.df$pop2008_density*1000*1000

# Affichage de couches d'habillage
plot(nuts0.spdf, border = NA, col = NA, bg = "#A6CAE0")
plot(world.spdf, col  = "#E3DEBF", border=NA, add=TRUE)

# Cartographie de la densité de population 
choroLayer(spdf = mygrid$spdf,                         #
           df = datagrid.df,
           var = "densitykm", 
           border = "grey80", 
           col = carto.pal(pal1 = "wine.pal", n1 = 6), 
           legend.pos = "topright",
           method = "q6", add = TRUE,
           legend.title.txt = "Population Density\n(inhabitant/km²)")

# Ajout des titres, légende, sources, etc.
layoutLayer(title = "Population Density", 
            coltitle = "black", col = NA,
            sources = "Eurostat, 2011", scale = NULL, 
            author = "cartography", frame = FALSE)

































Cartes lissées

# Affichage de couches d'habillage
plot(nuts0.spdf, border = NA, col = NA, bg = "#A6CAE0")  #
plot(world.spdf, col = "#E3DEBF", border = NA, add = TRUE)

nuts3.df$gdppps2008 <- nuts3.df$gdppps2008 * 1e+06

# Cartographie des potentiels de PIB/Hab
smoothLayer(spdf = nuts3.spdf, df = nuts3.df, var = "gdppps2008", var2 = "pop2008", 
    span = 75000, beta = 2, mask = nuts0.spdf, legend.title.txt = "Potential\nGDP per capita", 
    add = TRUE, legend.pos = "topright", legend.values.rnd = -2)

# Ajouter un court text sur la carte
text(x = 6271272, y = 3743765, labels = "Distance function:\n- type = exponential\n- beta = 2\n- span = 75 km", 
    cex = 0.8, adj = 0, font = 3)

# Ajout des titres, légende, sources, etc.
layoutLayer(title = "Wealth Inequality in Europe", sources = "Basemap: UMS RIATE, 2015 - Data: Eurostat, 2008", 
    author = "T. Giraud, 2015")

































Fonds de carte OpenStreetMap

data("nuts2006")
# extract Denmark
spdf <- nuts0.spdf[nuts0.spdf$id == "DK", ]
# Download the tiles, extent = Denmark
den <- getTiles(spdf = spdf, type = "osmtransport", crop = TRUE, zoom = 7)
class(den)
[1] "RasterBrick"
attr(,"package")
[1] "raster"
# Plot the tiles
tilesLayer(den)
# Plot countries
plot(spdf, border = "red", lwd = 2, add = TRUE)
# Map tiles sources
mtext(text = "Map data © OpenStreetMap contributors, under CC BY SA.", side = 1, 
    adj = 0, cex = 0.7, font = 3, line = -2)

































Quelques ressources en ligne

































Merci de votre attention!

Le package sur GitHub : https://github.com/Groupe-ElementR/cartography/

Carnet de recherche R Géomatique : http://rgeomatic.hypotheses.org/

Cette présentation : http://wukan.ums-riate.fr/FOSS4G-fr-2016/FOSS4G-fr-2016.html































Timothée Giraud - CNRS
e-mail : mjsh GitHub : Blog :

FOSS4G Paris - 2016