Cartographie avec R

Niveau 1 - Des cartes simples à partir de données en ligne ou d'un fond de carte

1- Charger des données en ligne à partir d'une simple commande R

install.packages("raster");library(raster)

adm_fr <- getData('GADM', country='FRA', level=2)

# GADM indique que je veux des contours administratifs

# FRA est le code de la France*

# level est le niveau de résolution  (1 : carte des régions - 2 : départements - 3 : communes)

plot(adm_fr)

bbox(adm_fr) # Dimensions de la carte

Niveau 0

library(raster) 

adm_fr <- getData('GADM', country='FRA', level=0)

plot(adm_fr)

Niveau 1

library(raster) 

adm_fr <- getData('GADM', country='FRA', level=1)

plot(adm_fr)

Niveau 2

library(raster) 

adm_fr <- getData('GADM', country='FRA', level=2)

plot(adm_fr)

Réduire la zone affichée avec des limites de longitude et latitude

library(raster) 

adm_fr <- getData('GADM', country='FRA', level=1)

plot(adm_fr,xlim=c(-0.5,0),ylim=c(42.7,45.7));box()

N'afficher qu'une aire en l'appelant par son nom

library(raster)

adm_fr <- getData('GADM', country='FRA', level=1)

cat("Liste des régions : \n")

adm_fr$NAME_1

plot(adm_fr[adm_fr$NAME_1=="Aquitaine",], lwd=2,border="#900C3F");box()

Sélectionner les zones à afficher et colorer

library(raster)

adm_fr <- getData('GADM', country='FRA', level=2)

cat("Liste des départements : \n")

adm_fr$NAME_2 

plot(adm_fr[adm_fr$NAME_1=="Aquitaine",],lwd=2);box()

plot(adm_fr[adm_fr$NAME_2=="Dordogne",],add=T,col="#FCFC9C");box()

Remarque : si je veux plusieurs régions, je peux utiliser l'écriture %in%.

library(raster)

adm <- getData('GADM', country='FRA', level=1)

carte1 <- adm[adm$NAME_1 %in% c("Bretagne","Pays de la Loire"),]

plot(carte1)

Étape 1 - Tracer un fond bleu "marin"

Étape 2 - Tracer un contours littoral

Étape 3 - Remplir les terres

# ETAPE 0 - Chargement des données

library(raster)

adm_gr <- getData('GADM', country='GRC', level=1)

# Limiter la région chargée pour réduire le temps d'affichage

adm <- adm_gr[match(toupper(adm_gr$NAME_1[7]),toupper(adm_gr$NAME_1)),]# Péloponnèse

# Étape 1 - Tracer un fond bleu "marin"

plot.new()

par(mar=c(4,4,3,4),bg="transparent") # définition des marges

# on pré-trace la carte pour programmer ses limites d'affichage automatiquement

plot(adm,xlim=c(23.05,23.20),ylim=c(36.422,36.53),col="white",border="white",lwd=50) ; box()

# FOND DE MER : tracé simple d'un polygone

polygon(x = c(20, 30, 30, 20, 20), y = c(-10, -10, 50, 50, -10), col = "#bbe6fb", border = "transparent")

# Étape 2 - Tracer un contours littoral

plot(adm,col="white",border="#34bdf2",lwd=7,add=T)

Étape 3 - Remplir les terres

plot(adm, col="#FAFAB1", border="grey", lwd=1,add=T) 

Un exemple simple de carte d'un pays du monde

Carte de l'UK conforme à la règle TOLE (Titre, Orientation, Légende, Echelle)

Mots clefs : cartographique - carte R project - monde- contours des départements - longitude - latitude - points - trajet - légende - texte - rosace- ville

Et pour réaliser une carte complète du monde ?

library(raster)

WorldMap <- getData('countries')

plot(WorldMap)

La carte ainsi est de très haute définition... donc longue à produire.

Il est aussi possible de faire vite-fait des cartes de qualité moindre mais plus rapides à afficher...

2- Indiquer un point sur la carte en précisant sa longueur et sa latitude

Indiquer un point par un couple de valeurs longitude/latitude

library(raster) 

adm_fr <- getData('GADM', country='FRA', level=1)

plot(adm_fr,lwd=0.5, border="grey", col="#DFFAB1", bg="black");box()

points(0,44, col="red", pch=16, cex=2)

Pleins de types de points, de tailles et de couleurs

plot(adm_fr,lwd=0.5, border="yellow", col="#FFFAB1", bg="#00000000",box=F)

# On va générer 15 points aléatoire

nb_pt = 15

longitudes = rnorm(nb_pt,2,2)

latitudes = rnorm(nb_pt,46,2)

#  et 15 couleurs

liste_colors <- c("blue","green","red")

colfunc<-colorRampPalette(liste_colors,interpolate="spline")

colors <- colfunc(nb_pt)

# On trace

points(longitudes,latitudes, col=colors, pch=c(8:18), cex=c((1:10)/2),lwd=2)

Des sphères de tailles variables

plot(adm_fr,lwd=0.5, border="green", col="#AAAAFF", bg="#00000000",box=F)

latitude = rnorm(10,44,3)

longitude = rnorm(10,1,3)

lat <- latitude[order(rayons, decreasing = TRUE)]

long <- longitude[order(rayons, decreasing = TRUE)]

ray <- rayons[order(rayons, decreasing = TRUE)]

# Tracer les disques rouges transparents

couleur =rgb(red=(243/255), green=(105/255), blue=0, alpha=0.8)

symbols(long,lat, circles = ray, add = TRUE, bg = couleur, inches = FALSE)

text(longitude,latitude,correspondants,cex=(rayons*1.5))

Coloriser les points selon une variable (3ème dimension)

adm <- getData("GADM",country="FRA",level=1)

# Simuler des points sur la carte

bbox(adm)-> xy1

x <- rnorm(100,mean(xy1[1,]),2)

y <- rnorm(100,mean(xy1[2,]))

dim <- round(x+y,0) # Dim serait une valeur associée à chaque point (ici on additionne long et lat, ce qui n'a pas de sens...

# Découper les

cut(dim,breaks=10)->niveau

colfunc <- colorRampPalette(c("white","red","black"))

colors<- colfunc(10) %>% .[as.numeric(niveau)]

plot(adm)

points(x,y,col=colors,pch=16,cex=2)

legend(x="topleft",legend = levels(niveau), cex=0.8,fill=colfunc(10),bty="n")


3- Indiquer quelques informations de base en cartographie

Lorsqu'on réalise une carte, il faut toujours respecter la règle TOLE (Titre, Orientation, Légende, Échelle)

1- Afficher le nord géographique

La fonction northarrow() récupérée sur le web (source inconnue) permet d'ajouter le nord géographique. Il faut la copier-coller.

# FONCTION POUR LA ROSACE DU NORD

northarrow <- function(loc, size, bearing = 0, cex = 1) {

  # =========================================

 cols <- rep(c("white", "black"), 8)

 # Coordonnees des polygones de la rose des vents

 radii <- rep(size/c(1, 4, 2, 4), 4) ;  x <- radii[(0:15) + 1] * cos((0:15) * pi/8 + bearing) + loc[1]

 y <- radii[(0:15) + 1] * sin((0:15) * pi/8 + bearing) + loc[2]

 # Trace des polygones

 for (i in 1:15) {

  x1 <- c(x[i], x[i + 1], loc[1])  ;   y1 <- c(y[i], y[i + 1], loc[2])  ;   polygon(x1, y1, col = cols[i])

 }

 # Trace du dernier polygone

 x1 <- c(x[16], x[1], loc[1])  ;  y1 <- c(y[16], y[1], loc[2]) ;  polygon(x1, y1, col = cols[16])

 # Rajout des lettres

 b <- c("E", "N", "O", "S")

 for (i in 0:3) {

 text((size + par("cxy")[1]) * cos(bearing + i * pi/2) + loc[1], (size + par("cxy")[2]) * sin(bearing + i * pi/2) + loc[2],

 b[i + 1], cex = cex)

 } }

library(raster) 

adm_fr <- getData('GADM', country='FRA', level=1)

plot(adm_fr,lwd=0.5, border="grey", col="#AAAAAA", bg="white",box=F)

points(0,44, col="red", pch=16, cex=2)

northarrow(loc = c(-3, 45), size = 1, cex = 2)

Et pour l'afficher manuellement en cliquant sur la carte ?

# NORD GEOGRAPHIQUE

# loc = c(longitude, latitude)

# size = la taille de l'indication

cat("Cliquer là où vous voulez la rosace du nord");l = locator(n=1)

northarrow(loc = c(l$x,l$y), size = 1, cex =2)

2- Afficher la barre d'échelle

La librairie raster contient une fonction pour afficher des barres d'échelle : scalebar().

plot(adm_fr,lwd=0.5, border="grey", col="#AAAAAA", bg="white",box=F)

points(0,44, col="red", pch=16, cex=2)

scalebar(d = 200, xy = c(5,42), type = "bar", below = "km",lwd = 5, divs = 2, col = "black", cex = 1, lonlat = T)

3- Afficher la légende


library(raster) 

adm_fr <- getData('GADM', country='FRA', level=1)

plot(adm_fr,xlim=c(-0.5,0),ylim=c(42.7,45.7));box()

adm_fr$NAME_1

plot(adm_fr[adm_fr$NAME_1=="Nouvelle-Aquitaine",], lwd=2,border="#900C3F",col="orange",add=T);box()

plot(adm_fr[adm_fr$NAME_1=="Occitanie",], lwd=2,border="#900C3F",col="#900C3F",add=T);box()

legend(x="topleft", legend=c("Nouvelle-Aquitaine","Occitanie"), cex=0.8,fill=c("orange","#900C3F"),bty="n")

4- Décrire un fond de carte afin d'en extraire les noms de lieux pour une coloration sélective

Si je charge un fond de carte, la commande names() va me permettre de le décrire et de récupérer les noms de lieux pour les sélectionner les colorer différemment.


Voici un exemple qui permet d'extraire sélectivement une partie d'une carte et de la recoloriser ou de la retracer.


5- Tracer des traits, des réseaux (exemple)

Tracer des lignes

library(raster)

adm_fr <- getData('GADM', country='FRA', level=2)

plot(adm_fr)

x <- locator(n=2) 

# Là, je clique deux fois sur la carte pour faire un segment

lines(x,col="red",lwd=3)

# Là, je clique 5 fois sur la carte pour faire la ligne bleue

x <- locator(n=5)

lines(x,col="blue",lwd=4)

Carte de Dordogne avec villes et trajectoires - fait avec le logiciel R project R CRAN

Voici un exemple simple ou l'on trace une ligne manuellement (ce pourrait être une route ou une rivière)


Carte des sous-départements de Dordogne avec un trajet entre deux villes (Périgueux & Sarlat)

Mots clefs : cartographique - carte R project - France - contours des départements - longitude - latitude - points - trajet - légende - texte - route - trajectoire - ville

6- Tracer un cercle de dimensions connues

Visualiser la superficie que représente un disque (très utile dans l'application des GWmodels).

library(GWmodel)

data(LondonBorough)

plot(londonborough)

# Définissons le centre du cercle : ici on va utiliser le milieu de la carte

xy <- bbox(londonborough) ; x <- mean(xy[1,]) ; y <- mean(xy[2,])

# Compiler le point où apparaît le cercle

library(sf)

pts <- st_as_sf(data.frame(x=x,y=y), coords = c("x", "y"),crs=st_crs(londonborough))

# Créer le cercle

st_buffer(pts,dist=4000)-> obj # st_buffer a un défaut : il n'accepte par les longitudes/latitudes

plot(londonborough)

plot(obj,col="red",add=T)

Remarque, on peut aussi utiliser l'argument border pour ne colorer que le bord du cercle.

st_buffer R cartography

On voit ici ce que représente sur Londres un cercle de diamètre de 4000 unités.

7- D'autres fonctions sf très utiles pour remanier des cartes