La librairie sp permet de jongler avec des données spatiales au format rectangulaire (dataframe : juste des colonnes).
Elle présente des fonctions intéressantes que l'on peut relier à d'autres librairies (rgeos, cartography) pour réaliser tous les types de cartes.
Charger des données qui caractérisent différents points : exemple de la Meuse
library("sp")data("meuse.grid")colnames(meuse.grid)plot(meuse.grid$x,meuse.grid$y,pch=3)Pour l'instant, on ne dispose que d'un ensemble de points qui couvre l'ensemble de la Meuse.
Il faudrait remplacer ces points par des pixels pour avoir un raster.
On notera aussi des coordonnées étranges qui justifient de changer de système géodésique si on désire des longitudes/latitudes classiques.
# just 9 points on a grid:x <- c(1,1,1,2,2,2,3,3,3)y <- c(1,2,3,1,2,3,1,2,3)xy <- cbind(x,y)S <- SpatialPoints(xy)class(S)plot(S)gridded(S) <- TRUEgridded(S)class(S)summary(S)plot(S)# Conversion en objet spatialcoordinates(meuse.grid) <- ~x+yis(meuse.grid) ; class(meuse.grid)plot(meuse.grid)# Création d'un pixel pour chaque point# Faire un grilllage... gridded()gridded(meuse.grid) <- TRUE plot(meuse.grid["dist"]) # Il faut indiquer une dimension qui servira à la coloration, ici le paramètre distChargeons maintenant des données avec des points ponctuels : ici des analyses sur des prélèvement géolocalisés dans la Meuse :
data("meuse")# meuse# ce jeu de données donne des différents résultats d'analyse pour # différents endroits de la Meusecolnames(meuse)meuse$cadmium# La fonction coordinates va convertir la dataframe Meuse# en "SpatialPointsDataFrame" avec regroupement des coordonnées x, y# dans une colonne coordinatescoordinates(meuse) <- ~x+yis(meuse)Pour ces différents points, les présences de certains éléments (cadmium, zinc, etc) ont été analysées.
Segmenter une carte en régions en fonction de valeurs ou d'indice.
Ici, on pourrait découper la Meuse en 4 zones selon les valeurs du paramètres dist.
On va d'abord trier les valeurs de dist en 4 catégories.
# Utiliser la fonction cut pour classer les valeurs du paramètres dist dans les# différents intervalles de 0 à 0,25 - 0,25 à 0,5 - 0,5 à 0,75... etc.i = cut(meuse.grid$dist, c(0,.25,.5,.75,1), include.lowest = TRUE)library("rgeos")# Découper la Meuse en fonction des valeurs de iab = gUnaryUnion(as(meuse.grid, "SpatialPolygons"), i) # On peut essayer aussi meuse.grid$part.a à la place de iplot(ab)Combiner maintenant les résultats d'analyse des éléments avec la carte découpé que j'ai...
plot(ab)plot(meuse,add=T,lwd=2,col="red")Il serait bien d'avoir la composition moyenne de chacune de ces 4 régions. Problème : j'ai plusieurs mesure par aire. Il va falloir que je calcule donc automatiquement la moyenne pour chaque secteur. C'est le rôle de la fonction aggregate().
x = aggregate(meuse[c("zinc")], ab, mean)x = aggregate(meuse[c("zinc", "copper","cadmium")], ab, mean)spplot(x)On indique à aggregate() 3 paramètres : la donnée à agréger, la segmentation correspondant et la méthode (ici, on fait la moyenne par secteur : mean).
On voit ici un petit problème... Automatiquement, la barre de coloration utilise la même échelle...
Un code qui récapitule ce qui a été fait ci-dessus en un simple copier-coller :
library("sp")data("meuse.grid")coordinates(meuse.grid) <- ~x+ygridded(meuse.grid) <- TRUEdata("meuse")coordinates(meuse) <- ~x+yi = cut(meuse.grid$dist, c(0,.25,.5,.75,1), include.lowest = TRUE)library("rgeos")# Découper la Meuse en fonction des valeurs de iab = gUnaryUnion(as(meuse.grid, "SpatialPolygons"), i) # On peut essayer aussi meuse.grid$part.a à la place de ix = aggregate(meuse[c("cadmium")], ab, mean)spplot(x)spplot(x, "cadmium", cuts=10, xlim=c(175000,185000), ylim=c(327000,335000))# définit le nombre d'intervalles de colorationlibrary(RColorBrewer) # pour brewer.pal( )mypalette <- brewer.pal(8, 'Reds') # définit des gammes de couleursspplot(x, "cadmium", cuts=7,# définit le nombre d'intervalles de coloration col.regions = mypalette)scale = list("SpatialPolygonsRescale", layout.scale.bar(), offset = c(178600,332490), scale = 500, fill=c("transparent","black"))text1 = list("sp.text", c(178600,332590), "0")text2 = list("sp.text", c(179100,332590), "500 m")arrow = list("SpatialPolygonsRescale", layout.north.arrow(), offset = c(178750,332000), scale = 400)couches = list(scale,text1,text2,arrow)mypalette <- brewer.pal(8, 'RdYlBu') # dé nit des gammes de couleursspplot(x, "cadmium", do.log=T, key.space=list(x=0.1,y=0.93,corner=c(0,1)), sp.layout=couches, main = "Zinc (top soil)", col.regions = mypalette)spplot(x, "cadmium", #do.log=T, cut=7, sp.layout=couches, main = "Cadmium)", col.regions = mypalette)Il est possible de réaliser des plans spatiaux avec R project. Le pack "sp" (cf. librairie sp ou package sp) permet en effet d'ajouter des fonctions de gestion de l'espace à R.
1- Installer la librairie sp qui permet de gérer les données spatiales
install.packages("sp") ; library("sp")2- Dessiner des polygones
x1 <- c(0, 72,72,0) ; y1 <- c(0,0,16.2,16.2) # Coordonnées x et y d'une salle carréec1 <- data.frame(x1, y1)p1 <- Polygon(coords = c1, hole = F);P1 <- Polygons(srl = list(p1), ID = "Aile de batiment") # Conversion en polygone3- Combiner les polygones
Dans le cas où on aurait un deuxième polygone P2.
SP <- SpatialPolygons(Srl = list(P1,P2))4. Tracer les polygones
plot(SP,col=temperatures,border = "white")Cet exemple permet de visualiser les températures moyennes relevées en hiver dans un bâtiment universitaire.
(Réalisé avec la participation de D. Paretour, L. Blois et R. Legleau)
install.packages("sp")library("sp")#############################################################################################Compiler toutes les salles d'un bâtiment sous formes de polygones.
############################################################################################## Aile de Génie Biologiquex1 <- c(0, 72,72,0) ; y1 <- c(0,0,16.2,16.2) ; (c1 <- data.frame(x1, y1));p1 <- Polygon(coords = c1, hole = F);P1 <- Polygons(srl = list(p1), ID = "Aile de génie biologique")# Couloir de génie biologiquex2 <- c(0, 72,72,0) ; y2 <- c(6.8,6.8,8.5,8.5) ; (c2 <- data.frame(x2, y2)) ;p2 <- Polygon(coords = c2, hole = F);P2 <- Polygons(srl = list(p2), ID = "Couloir de génie biologique")# Toilettes 1x3 <- c(0,1.5,1.5,0) ; y3 <- c(0,0,6.8,6.8) ; (c3 <- data.frame(x3, y3)) ;p3 <- Polygon(coords = c3, hole = F);P3 <- Polygons(srl = list(p3), ID = "Toilettes 1")# cage escalier 1x4 <- c(1.5,5,5,1.5) ; y4 <- c(0,0,6.8,6.8) ; (c4 <- data.frame(x4, y4));p4 <- Polygon(coords = c4, hole = F);P4 <- Polygons(srl = list(p4), ID = "cage escalier 1")# prof 4x5 <- c(5,8,8,5) ; y5 <- c(0,0,6.8,6.8) ; (c5 <- data.frame(x5, y5)) ;p5 <- Polygon(coords = c5, hole = F);P5 <- Polygons(srl = list(p5), ID = "prof 4")# salle informatique 1x6 <- c(8,11.3,11.3,8) ; y6 <- c(0,0,6.8,6.8) ; (c6 <- data.frame(x6, y6)) ;p6 <- Polygon(coords = c6, hole = F);P6 <- Polygons(srl = list(p6), ID = "salle informatique 1")# salle informatique 2x7 <- c(11.3,17.5,17.5,11.3) ; y7 <- c(0,0,6.8,6.8) ; (c7 <- data.frame(x7, y7));p7 <- Polygon(coords = c7, hole = F);P7 <- Polygons(srl = list(p7), ID = "salle informatique 2")# couloir sortie 1 x8 <- c(17.5,20.7,20.7,17.5) ; y8 <- c(0,0,6.8,6.8) ; (c8 <- data.frame(x8, y8)) ;p8 <- Polygon(coords = c8, hole = F);P8 <- Polygons(srl = list(p8), ID = "couloir sortie 1")# reunions professeursx9 <- c(20.7,24,24,20.7) ; y9 <- c(0,0,6.8,6.8) ; (c9 <- data.frame(x9, y9)) ;p9 <- Polygon(coords = c9, hole = F);P9 <- Polygons(srl = list(p9), ID = "reunions professeurs")# biochimiex10 <- c(24,33.5,33.5,24) ; y10 <- c(0,0,6.8,6.8) ; (c10 <- data.frame(x7, y7));p10 <- Polygon(coords = c10, hole = F);P10 <- Polygons(srl = list(p10), ID = "biochimie")# reserves 1x11 <- c(33.5,36.8,36.8,33.5) ; y11 <- c(0,0,6.8,6.8) ; (c11 <- data.frame(x11, y11)) ;p11 <- Polygon(coords = c11, hole = F);P11 <- Polygons(srl = list(p11), ID = "reserves 1")# travaux 1x12 <- c(36.8,43,43,36.8) ; y12 <- c(0,0,6.8,6.8) ; (c12 <- data.frame(x12, y12)) ;p12 <- Polygon(coords = c12, hole = F);P12 <- Polygons(srl = list(p12), ID = "travaux 1")# microbiologie 1x13 <- c(43,52.7,52.7,43) ; y13 <- c(0,0,6.8,6.8) ; (c13 <- data.frame(x13, y13));p13 <- Polygon(coords = c13, hole = F);P13 <- Polygons(srl = list(p13), ID = "microbiologie 1")# laveriex14 <- c(54.3,57.5,57.5,54.3) ; y14 <- c(0,0,2.3,2.3) ; (c14 <- data.frame(x14, y14)) ;p14 <- Polygon(coords = c14, hole = F);P14 <- Polygons(srl = list(p14), ID = "laverie")# preparation microbiox15 <- c(52.7,57.5,57.5,52.7) ; y15 <- c(0,0,4.5,4.5) ; (c15 <- data.frame(x15, y15)) ;p15 <- Polygon(coords = c15, hole = F);P15 <- Polygons(srl = list(p15), ID = "preparation microbio")# vestiaire microbiox16 <- c(52.7,57.5,57.5,52.7) ; y16 <- c(4.5,4.5,6.8,6.8) ; (c16 <- data.frame(x16, y16));p16 <- Polygon(coords = c16, hole = F);P16 <- Polygons(srl = list(p16), ID = "vestiaire microbio")# microbiologie 2x17 <- c(57.5,67,67,57.5) ; y17 <- c(0,0,6.8,6.8) ; (c17 <- data.frame(x17, y17)) ;p17 <- Polygon(coords = c17, hole = F);P17 <- Polygons(srl = list(p17), ID = "microbiologie 2")# cage escalier 2x18 <- c(67,70,70,67) ; y18 <- c(0,0,6.8,6.8) ; (c18 <- data.frame(x18, y18)) ;p18 <- Polygon(coords = c18, hole = F);P18 <- Polygons(srl = list(p18), ID = "cage escalier 2")# toilettes 2x19 <- c(70,72,72,70) ; y19 <- c(0,0,6.8,6.8) ; (c19 <- data.frame(x19, y19));p19 <- Polygon(coords = c19, hole = F);P19 <- Polygons(srl = list(p19), ID = "toilettes 2")# prof 1x20 <- c(0,3.2,3.2,0) ; y20 <- c(8.5,8.5,16.2,16.2) ; (c20 <- data.frame(x20, y20)) ;p20 <- Polygon(coords = c20, hole = F);P20 <- Polygons(srl = list(p20), ID = "prof 1")# prof 2x21 <- c(3.2,6.5,6.5,3.2) ; y21 <- c(8.5,8.5,16.2,16.2) ; (c21 <- data.frame(x21, y21)) ;p21 <- Polygon(coords = c21, hole = F);P21 <- Polygons(srl = list(p21), ID = "prof 2")# prof 3x22 <- c(6.5,9.8,9.8,6.5) ; y22 <- c(8.5,8.5,16.2,16.2) ; (c22 <- data.frame(x22, y22));p22 <- Polygon(coords = c22, hole = F);P22 <- Polygons(srl = list(p22), ID = "prof 3")# secretariatx23 <- c(9.8,14.5,14.5,9.8) ; y23 <- c(8.5,8.5,16.2,16.2) ; (c23 <- data.frame(x23, y23)) ;p23 <- Polygon(coords = c23, hole = F);P23 <- Polygons(srl = list(p23), ID = "secretariat")# directionx24 <- c(14.5,17.5,17.5,14.5) ; y24 <- c(8.5,8.5,16.2,16.2) ; (c24 <- data.frame(x24, y24)) ;p24 <- Polygon(coords = c24, hole = F);P24 <- Polygons(srl = list(p24), ID = "direction")# couloir sortie 2x25 <- c(17.5,22.5,22.5,17.5) ; y25 <- c(8.5,8.5,16.2,16.2) ; (c25 <- data.frame(x25, y25));p25 <- Polygon(coords = c25, hole = F);P25 <- Polygons(srl = list(p25), ID = "couloir sortie 2")# chimie 1x26 <- c(22.5,32,32,22.5) ; y26 <- c(8.5,8.5,16.2,16.2) ; (c26 <- data.frame(x26, y26)) ;p26 <- Polygon(coords = c26, hole = F);P26 <- Polygons(srl = list(p26), ID = "chimie 1")# reserves 2x27 <- c(32,35,35,32) ; y27 <- c(8.5,8.5,16.2,16.2) ; (c27 <- data.frame(x27, y27)) ;p27 <- Polygon(coords = c27, hole = F);P27 <- Polygons(srl = list(p27), ID = "reserves 2")# chimie 2x28 <- c(35,44.5,44.5,35) ; y28 <- c(8.5,8.5,16.2,16.2) ; (c28 <- data.frame(x28, y28));p28 <- Polygon(coords = c28, hole = F);P28 <- Polygons(srl = list(p28), ID = "chimie 2")# travaux dirigésx29 <- c(44.5,49.5,49.5,44.5) ; y29 <- c(8.5,8.5,16.2,16.2) ; (c29 <- data.frame(x29, y29)) ;p29 <- Polygon(coords = c29, hole = F);P29 <- Polygons(srl = list(p29), ID = "travaux dirigés")# biologie animalex30 <- c(49.5,59,59,49.5) ; y30 <- c(8.5,8.5,16.2,16.2) ; (c30 <- data.frame(x30, y30)) ;p30 <- Polygon(coords = c30, hole = F);P30 <- Polygons(srl = list(p30), ID = "biologie animale")# reserves 3x31 <- c(59,62,62,59) ; y31 <- c(8.5,8.5,16.2,16.2) ; (c31 <- data.frame(x31, y31));p31 <- Polygon(coords = c31, hole = F);P31 <- Polygons(srl = list(p31), ID = "reserves 3")# biologie végétalex32 <- c(62,72,72,62) ; y32 <- c(8.5,8.5,16.2,16.2) ; (c32 <- data.frame(x32, y32)) ;p32 <- Polygon(coords = c32, hole = F);P32 <- Polygons(srl = list(p32), ID = "biologie végétale")# Conversion en polygone spatialSP <- SpatialPolygons(Srl = list(P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32))Définir des températures pour les différentes salles P1 à P32.
temperatures = c(rep(20,20),21,26,25,24,rep(20,5),18,22,18)temperatures[temperatures<19.5] <- "#0080FF"temperatures[temperatures>=19.5&temperatures<=20.5] <- "#2EFE9A"temperatures[temperatures>20.5&temperatures<=22] <- "#F5D0A9"temperatures[temperatures>22] <- "#FE2E2E"# A explorer rampe <- colorRampPalette(c("#0080FF", "#2EFE9A", "#F5D0A9","#FE2E2E"))Tracer le plan
plot(SP,col=temperatures,border = "white")Légender
text(mean(x1),mean(y1),"Couloir",adj=c(0.5,0.5),cex=0.5)text(mean(x4),mean(y4),"Cage\nescalier",adj=c(0.5,0.5),cex=0.5)text(mean(x5),mean(y5),"Bureau\nenseignant",adj=c(0.5,0.5),cex=0.5)text(mean(x21),mean(y21),"Bureau\nenseignant",adj=c(0.5,0.5),cex=0.5)text(mean(x22),mean(y22),"Bureau\nenseignant",adj=c(0.5,0.5),cex=0.5)text(mean(x23),mean(y23),"Secrétariat",adj=c(0.5,0.5),cex=0.5)text(mean(x6),mean(y6),"Bureau\nenseignant",adj=c(0.5,0.5),cex=0.5)text(mean(x7),mean(y7),"Salle\ninformatique",adj=c(0.5,0.5),cex=0.5)text(mean(x10),mean(y10),"Biochimie",adj=c(0.5,0.5),cex=0.5)text(mean(x24),mean(y24),"Direction",adj=c(0.5,0.5),cex=0.5)Mise à jour de la page septembre 2020