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
Des très nombreuses données pour être chargée dans R avec une simple commande grâce à la librairie raster.
Etape 01 - Charger/Installer la librairie raster
install.packages("raster");library(raster)
Etape 02 - Charger les données de son choix
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)
Etape 03 - Je trace la carte
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)
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.
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.
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 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.
On voit ici ce que représente sur Londres un cercle de diamètre de 4000 unités.