2.1- Ouvrir un fond de carte vectoriel et colorer sélectivement des aires (régions, communes...)
Niveau 2 - Des cartes plus personnelles à partir d'un fond de carte vectoriel
1- Ouvrir un fond de carte au format vectoriel
1- Charger la librairie maptools
install.packages("maptools") ; library("maptools")
2- Ouvrir le fond de carte - dans cet exemple on ouvrira le fond de carte - rappel : où trouver les fonds de carte ?
library(rgdal)
dordogne<- readOGR(dsn = ".", layer = "l_commune_2017_s_24",p4s=CRS("+proj=longlat")) # DO NOT ADD ".shp" to your shapefile name
# ou alors ; library(sf) ; read_st()
Décrire le fond de carte : fonction str()
str(dordogne)
3- Obliger R à lire les caractères spéciaux avec la bonne police : la commune Vélines doit redevenir Vélines
sort(dordogne$nom_com) # On voit ici que les noms des communes sont mal affichés lorsqu'un caractère est accentué
# exemple :
Encoding(levels(dordogne$nom_com)) <- "latin1"
Encoding(levels(dordogne$nom_com)) <- "UTF-8" ;
sort(dordogne$nom_com)
2- Décrire un fond de carte afin d'en extraire le noms des lieux, de pouvoir envisager une coloration sélective
Si je reprends l'exemple précédédent où j'ai ouvert un fond de carte que j'ai nommé dordogne, il apparait que la commande head(dordogne) donne des résultats inexploitables.
Je dois faire appel à la commande names()
names(dordogne) # Affiche les noms des différentes rubriques
dordogne$code_insee # Permet d'afficher les codes insee des différentes communes de Dordogne
dordogne$nom_com[dordogne$code_insee==24256] # affiche le nom de la commune ayant le code INSEE 24256
coordinates(dordogne@polygons[[1]]@Polygons[[1]]) # Permet de récupérer les coordonnées du tracé de la première commune de Dordogne
3- Tracer la carte
plot(dordogne)
# Ajouter une coloration rouge pour la 516ème commune
plot (dordogne[516,],col="red",add=T) # add = T pour superposer à la carte précédente
# Ajouter une coloration verte pour la commune ayant le code_insee 24035
plot (dordogne[which(dordogne$code_insee==24035),],col="green",add=T)
plot(dordogne,col="#CCFFCC")
# Colorer la commune 01 de la liste en bleu
plot (dordogne[1,],col="blue",add=T)
# Récupérer les coordonnées moyennes de la commune colorée en bleu
x <- mean(coordinates(dordogne@polygons[[1]]@Polygons[[1]])[,1])
y <- mean(coordinates(dordogne@polygons[[1]]@Polygons[[1]])[,2])
x ; y
# Tracer le cercle autour du centre de gravité de la commune
points(x,y,col="red",cex=5,lwd=3)
4- Prendre en compte les caractéres spéciaux (noms des villes accentués, polices étrangères) pour les afficher correctement
Je télécharge une base de données qui contient plein de noms de villes avec des caractères spéciaux (é,ê en français - ou par exemple ici, des noms grecs). Cela va me poser tout de suite de nombreux problèmes (fichier lourd, caractères spéciaux qui s'affichent mal, données à trier...).
library("raster")
adm_gr <- getData('GADM', country='GRC', level=1)
J'affiche la carte :
plot(adm_gr,xlim=c(22.4,22.5),ylim=c(36.38,36.55),lwd=2,bg="#B6F3EC",col="#F2F3B6")
Je charge les noms de lieu :
install.packages(c("maps","maptools","rgdal"))
library("maptools");library("maps");library("rgdal")
# le fichier à télécharger des noms de ville se retrouve ici.
places <- readOGR(dsn = ".", layer = "places",p4s=CRS("+proj=longlat"))
# Décrire le fichier
names(places) # on voit que les noms des villes apparaissent dans la sous-rubrique name
On peut donc les ajouter avec text()
text(places,places$name)
Et là, les problèmes commencent ! C'est long à afficher et c'est moche !
Problème 1, les noms sont abherrants car caractères imbuvables.
Encoding(levels(places$name)) <- "latin1"
Encoding(levels(places$name)) <- "UTF-8"
plot(adm_gr,xlim=c(22.4,22.5),ylim=c(36.38,36.55),lwd=2,bg="#B6F3EC",col="#F2F3B6")
text(places,places$name)
Maintenant, ça marche mais c'est toujours lent à afficher (car il y a tous les noms du pays : il faut extraire ce qui nous intéresse)
Problème 2, alléger le fichier nom en n'affichant que ceux visibles sur la carte
Je dois extraire les coordonnées du fichier pour extraire les villes qui m'intérèssent, problème ici ce sont des id osm, autrement dit des identifiants Open Street Map. Je dois donc convertir ces id osm avec la fonction coordinates().
lon <- coordinates(places)[,1]
lat <- coordinates(places)[,2]
id <- which(lon>=22.4&lon<22.6&lat>=36.38&lat<=36.55)
noms_sur_carte <- places[id,]
plot(adm_gr,xlim=c(22.4,22.5),ylim=c(36.38,36.55),lwd=2,bg="#B6F3EC",col="#F2F3B6")
text(noms_sur_carte,noms_sur_carte$name)
Problème 3, n'afficher que les principaux patelins
names(noms_sur_cartes)
noms_sur_carte$type
plot(adm_gr,xlim=c(22.4,22.5),ylim=c(36.38,36.55),lwd=2,bg="#B6F3EC",col="#F2F3B6")
text(noms_sur_carte[which(noms_sur_carte$type=="village"),],noms_sur_carte$name[noms_sur_carte$type=="village"],cex=1.1,las=1)
# Et on peut même ajouter les rivières
riviere <- readOGR(dsn = ".", layer = "waterways", p4s=CRS("+proj=longlat")) # cliquer pour télécharger
plot(rivieres,add=T,col="#177CED") # et on ajoute le tracé des rivières
5- Récupérer les contours d'une zone spatiale pour supprimer les frontières internes
library("maptools");library(rgdal);library(maps)
library("rgeos") #pour gBuffer
Télécharger le fond de carte du monde (résolution à 10 m) sur : naturalearthdata.
# Ouverture de fond de carte
monde<- readOGR(dsn = ".", layer = "ne_10m_admin_0_countries_lakes", p4s=CRS("+proj=longlat"))
# Charger les pays de son choix : Turquie et Grèce
europe <- monde[which(monde$ISO_A3=="GRC"|monde$ISO_A3=="TUR"|monde$ISO_A3=="ALB"|monde$ISO_A3=="MKD"|monde$ISO_A3=="BGR"),]
# Affichage optionnel de ces pays
plot(europe,xlim=c(23,28),ylim=c(35,41),lwd=3,col=c("#FAFAFA"))
# Regroupement de ces pays
europe <- gUnaryUnion(spgeom = europe)
# Récupération des contours avec un lissage HD (valeur width basse)
europeBuffer <- gBuffer(spgeom = europe, width= 0.001, byid = FALSE)
# Affichage
plot(europeBuffer,xlim=c(23,28),ylim=c(35,41),lwd=4,col=c("#FFFF88"),bg="#88DDFF")
Carte de l'Europe illustrant le nombre de correspondants sur un sujet X à différentes époques
Cette carte R project affiche des annotations automatiques + les données essentielles (TOL Titre, Orientation Légende Echelle) - rosace - Carte de l'Europe - Carte du monde - points proportionnelle à la taille - maps - espace - longitude - latitude
Cliquer sur l'image pour voir comment la réaliser