Cartographie avec R - Département de Mathématiques
Transcription
Cartographie avec R - Département de Mathématiques
Université de Caen Basse-Normandie 1 22 septembre 2015 Département de Mathématiques et Mécanique Cartographie avec R Sommaire 1.1 Description . . . . . . . . . . . . . . . . . . . . . . 1.1.1 Objectifs . . . . . . . . . . . . . . . . . . . . . . 1.1.2 Packages . . . . . . . . . . . . . . . . . . . . . . . 1.1.3 Les données . . . . . . . . . . . . . . . . . . . . . 1.1.4 Licences d’utilisation . . . . . . . . . . . . . . . . 1.2 Enoncé . . . . . . . . . . . . . . . . . . . . . . . . . 1.2.1 Les données . . . . . . . . . . . . . . . . . . . . . 1.2.2 Installation et chargement des packages . . . . . 1.2.3 Contours communes . . . . . . . . . . . . . . . . 1.2.4 Fusion avec d’autres bases de données . . . . . . 1.2.5 Géolocalisation . . . . . . . . . . . . . . . . . . . 1.2.6 Superposition de cartes vectorielles . . . . . . . . 1.2.7 Superposition image raster et cartes vectorielles . 1.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 1 2 2 2 2 3 3 5 6 7 8 Description 1.1.1 Objectifs Nous allons travailler au niveau communal, et utiliser des cartes ou nous tracerons 1. les contours de ces communes. 2. faire des cartes en indiquant un indicateur par communes : par exemple le taux de BAC+2 par communes. 3. des points dont on connaı̂t la longitude et la latitude 4. des fonds de cartes, 5. plusieurs couches 1.1.2 Packages rgdal [3] Ce package est le résultat de l’intégration de la bibliothèque de lecture et d’écriture de données cartographiques gdal. Cette interface permet de lire de nombreux formats de cartes : GeoTIFF, Erdas Imagine, SDTS, ECW, MrSID, JPEG2000, DTED, NITF. dismo [2] package orienté épidémiologie. raster [6] Ce package permet, lire, créer des images ou raster qui sont définies comme des fonctions constantes sur des carrés ( par exemple le pixel). sp[5, 1] C’est une bibliothèque graphique vectorielle. Elle gère par exemple des cartes définies par des contours. XML[4] Références [1] Roger S. Bivand, Edzer J. Pebesma, and Virgilio Gomez-Rubio. Applied spatial data analysis with R. Springer, NY, 2008. 1.1.2 [2] Robert J. Hijmans, Steven Phillips, John Leathwick, and Jane Elith. dismo: Species distribution modeling, 2012. R package version 0.7-17. 1.1.2, 2 [3] Timothy H. Keitt, Roger Bivand, Edzer Pebesma, and Barry Rowlingson. rgdal: Bindings for the Geospatial Data Abstraction Library, 2011. R package version 0.7-5. 1.1.2 [4] Duncan Temple Lang. XML: Tools for parsing and generating XML within R and S-Plus., 2011. R package version 3.4-3. 1.1.2 [5] Edzer J. Pebesma and Roger S. Bivand. Classes and methods for spatial data in R. R News, 5(2):9–13, November 2005. 1.1.2 [6] Jacob van Etten Robert J. Hijmans. raster: Geographic analysis and modeling with raster data, 2011. R package version 1.9-58. 1.1.2 http://www.math.unicaen.fr/~kauffman/cours 1 [email protected] Université de Caen Basse-Normandie 1.1.3 22 septembre 2015 Département de Mathématiques et Mécanique Les données IGN L’Institut Géographique National est l’acteur principal français pour tout la cartographie en France. Il propose certains produits en téléchargement libre. Nous allons utiliser l carte au format vectoriel des contours des communes de France métropolitaine au format shapefile GEOFLA©. INSEE Dans cet exercice nous prenons comme exemple la proportion de personnes de plus de 15 ans titulaires d’un BAC+2 au moins par communes ( ou infracommunales ) à l’aide du recensement de 2008 de l’INSEE. Cette base de données est accessible au format Excel et au format binaire Rdata. Google Nous allons utilisez Google pour extraire des cartes satellites ou routières, et son application Web de géocodage. Geofabrik Le site se définit par : At Geofabrik German for ”geo factory”, we extract, select, and process free geodata for you. We create shape files, maps, map tiles and full-blown web mapping solutions. We provide advice and training to our customers dealing with OpenStreetMap and keep them up to date. Nous allons utiliser des cartes vectorielles des réseaux routiers, fluviaux et de chemins de fer au format shapefile. Cette équipe travaille à partir du projet OpenStreetMap. 1.1.4 Licences d’utilisation Je ne suis pas du tout spécialiste, mais ici nous utilisons des données et des logiciels. Ces données et ces logiciels, bien que téléchargeable, ne sont pas dans le domaine totalement libre. EN cas d’utilisation professionelle, il faudra bien étudier les termes des licences si dessous. GEOFLA http://ddata.over-blog.com/xxxyyy/4/37/99/26/licence/Licence-Ouverte-Open-Licence.pdf INSEE http://www.insee.fr/fr/publications-et-services/default.asp?page=copyright.htm GOOGLE Vous devez avoir un Google Account et une clé est nécessaire pour certaines applications cartographiques Maps Api. Les descriptions des licences sont aux adresses suivantes : 1. http://code.google.com/apis/maps/terms.html 2. https://developers.google.com/maps/terms?hl=fr. 1.2 1.2.1 Enoncé Les données 1. Téléchargez GEOFLA© Communes France Métropolitaine. Puis décompressez ces données dans un répertoire nommé GEOFLA. Le contenu du sous répertoire GEOFLA/COMMUNES est drwxr-xr-x drwxr-xr-x -rw-r--r--rw-r--r--rw-r--r--rwxr-xr-x -rw-r--r--rw-r--r--rw-r--r--rw-r--r--rw-r--r--rwxr-xr-x -rw-r--r--rw-r--r-- 2 6 1 1 1 1 1 1 1 1 1 1 1 1 francois francois francois francois francois francois francois francois francois francois francois francois francois francois users 4096 déc. users 4096 déc. users 784 déc. users 7322609 déc. users 13312 déc. users 449 déc. users 10273208 déc. users 292980 déc. users 8325 déc. users 3819752 déc. users 14848 déc. users 449 déc. users 11720060 déc. users 873164 déc. 6 6 6 6 6 6 6 6 6 6 6 6 6 6 2011 2011 2011 2011 2011 2011 2011 2011 2011 2011 2011 2011 2011 2011 . .. COMMUNE.AVL COMMUNE.DBF COMMUNE.LYR COMMUNE.PRJ COMMUNE.SHP COMMUNE.SHX LIMITE_COMMUNE.AVL LIMITE_COMMUNE.DBF LIMITE_COMMUNE.LYR LIMITE_COMMUNE.PRJ LIMITE_COMMUNE.SHP LIMITE_COMMUNE.SHX 2. Téléchargez la carte vectorielle des routes, voies d’eau,... de la Basse-Normandie et décompressez ces données dans un répertoire GEOFABRIK. les fichiers commençant par roads sont : -rw-r--r--rw-r--r--rw-r--r--rw-r--r--rw-r--r-- 1 1 1 1 1 francois francois francois francois francois users 6 sept. users 6749614 sept. users 144 sept. users 16059228 sept. users 556748 sept. http://www.math.unicaen.fr/~kauffman/cours 12 12 12 12 12 06:17 06:18 06:17 06:18 06:18 2 roads.cpg roads.dbf roads.prj roads.shp roads.shx [email protected] Université de Caen Basse-Normandie 1.2.2 22 septembre 2015 Département de Mathématiques et Mécanique Installation et chargement des packages Installez si besoin et chargez les packages suivant : library(rgdal) library(raster) library(dismo) library(sp) library(XML) 1.2.3 Contours communes 1. Lire les contours des communes à l’aide de la fonction readOGR de la librairie rgdal. L’argument nommé layer est le nom de la couche, il doit contenir le nom exact des fichiers. dsn="/home/francois/labo-p/tex/stat/data-carto/ign/GEOFLA_1-1_SHP_LAMB93_FR-ED111/COMMUNES" communes=readOGR (dsn, layer="COMMUNE", stringsAsFactors=FALSE) ogrInfo(dsn,layer="COMMUNE") proj4string (communes) # affiche système projection #attention il faut changer COMMUNE.DBF en COMMUNE.dbf > dsn="/home/francois/labo-p/tex/stat/data-carto/ign/GEOFLA_1-1_SHP_LAMB93_FR-ED111/COMMUNES" > communes=readOGR (dsn, layer="COMMUNE", stringsAsFactors=FALSE) OGR data source with driver: ESRI Shapefile Source: "/home/francois/labo-p/tex/stat/data-carto/ign/GEOFLA_1-1_SHP_LAMB93_FR-ED111/COMMUNES", layer: "COMMUNE" with 36610 features and 18 fields Feature type: wkbPolygon with 2 dimensions > ogrInfo(dsn,layer="COMMUNE") Source: "/home/francois/labo-p/tex/stat/data-carto/ign/GEOFLA_1-1_SHP_LAMB93_FR-ED111/COMMUNES", layer: "COMMUNE" Driver: ESRI Shapefile number of rows 36610 Feature type: wkbPolygon with 2 dimensions +proj=lcc +lat_1=44 +lat_2=49 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +units=m +no_defs Number of fields: 18 name type length typeName 1 ID_GEOFLA 0 10 Integer 2 CODE_COMM 4 3 String 3 INSEE_COM 4 5 String 4 NOM_COMM 4 50 String 5 STATUT 4 20 String 6 X_CHF_LIEU 0 6 Integer 7 Y_CHF_LIEU 0 6 Integer 8 X_CENTROID 0 6 Integer 9 Y_CENTROID 0 6 Integer 10 Z_MOYEN 0 4 Integer 11 SUPERFICIE 0 10 Integer 12 POPULATION 2 6 Real 13 CODE_CANT 4 2 String 14 CODE_ARR 4 1 String 15 CODE_DEPT 4 2 String 16 NOM_DEPT 4 30 String 17 CODE_REG 4 2 String 18 NOM_REGION 4 30 String 2. Le type de l’objet communes est S4, sa classe est SpatialPolygonsDataFrame. Cet objet peut être décrit comme un multi-tableau. Les éléments de ce multi-tableau sont des slots, on y accède avec le caractère @. L’objet communes à 6 slots data, polygons, plotOrder,bbox,proj4string. str(communes,2) # afficher deux niveaux Formal class 'SpatialPolygonsDataFrame' [package "sp"] with 5 slots ..@ data :'data.frame': 36610 obs. of 18 variables: ..@ polygons :List of 36610 .. .. [list output truncated] ..@ plotOrder : int [1:36610] 2212 12649 6469 806 6872 15835 8807 619 4239 22195 ... ..@ bbox : num [1:2, 1:2] 99226 6049647 1242375 7110524 .. ..- attr(*, "dimnames")=List of 2 ..@ proj4string:Formal class 'CRS' [package "sp"] with 1 slots http://www.math.unicaen.fr/~kauffman/cours 3 [email protected] Université de Caen Basse-Normandie 22 septembre 2015 Département de Mathématiques et Mécanique str(communes@polygons[[1]],2) # liste str(communes@polygons[[1]]@Polygons,2) str(communes@polygons[[1]]@Polygons[[1]],2) communes@polygons[[1]]@Polygons[[1]]@coords # contour premère commune communes@data$NOM_COMM[1] # nom première commune communes@data$NOM_DEPT[1] # nom département première commune 3. En utilisant la même syntaxe que pour les extractions de ligne d’une data.frame extraire de communes les contours de CAEN et d’HEROUVILLE-SAINT-CLAIR, EPRON et SAINT-CONTEST. et les faire afficher dans un même graphique à l’aide de la fonction plot. Ajouter des points et les noms des communes. Attention les coordonnées dans le slot data sont divisées par 100. EPRON SAINT−CONTEST HEROUVILLE−SAINT−CLAIR CAEN Figure 1 – Première carte 4. Extraite la carte de basse normandie nommée bn. Puis ajouter à cet objet, la variable POPULATION découpée en classes. Puis afficher la carte. bn=communes[is.element(communes$CODE_DEPT, c(14,50,61)),] breaks=c(0,.1,.2,.4,1,4,20,110) bn$POPULATION.f<- factor(cut(bn$POPULATION,breaks,include.lowest=TRUE)) spplot(bn,"POPULATION.f") (20,110] (4,20] (1,4] (0.4,1] (0.2,0.4] (0.1,0.2] [0,0.1] Figure 2 – Population en millier habitants http://www.math.unicaen.fr/~kauffman/cours 4 [email protected] Université de Caen Basse-Normandie 1.2.4 22 septembre 2015 Département de Mathématiques et Mécanique Fusion avec d’autres bases de données Dans cette question, on va faire une cartographie d’une variable économique extraite du recensement 2008 de l’INSEE. 1. Chargez la table au format binaire R du recensement 2008 concernant les études. 2. On choisit comme clé de fusion des deux tables le numéro INSEE INSEE_COM des communes. Transformez cette clé en variable entière et vérifiez que les deux ensembles de clés des deux bases cartographiques et INSEE sont égales. 3. Effectuer la fusion en respectant absolument l’ordre initial de la base de données cartographique vectorielle. Utilisez la fonction match. fichier=url(paste(DATA,"insee-base-cc-diplomes-formation-08.RData",sep="")) (load(fichier)) close(fichier) X=insee$diplome rm(insee) bn$INSEE_COM=as.numeric(bn$INSEE_COM) X$INSEE_COM =as.numeric(as.character(X$INSEE_COM)) setdiff(X$INSEE_COM,bn$INSEE_COM) setdiff(bn$INSEE_COM,X$INSEE_COM) setequal(bn$INSEE_COM,X$INSEE_COM) # fusion ne pas du tout changer l'ordre tmp=merge(bn@data,X,by=c('INSEE_COM'),all.x=TRUE,all.y=FALSE,sort=FALSE) dim(tmp) # 1812 x 105 correct.ordering=match(bn@data$INSEE_COM, tmp$INSEE_COM) # id dans les bons cas all(bn@data$INSEE_COM==tmp$INSEE_COM[correct.ordering]) # TRUE ABSOLUMENT bn@data=tmp[correct.ordering,] all(bn@data$INSEE_COM==tmp$INSEE_COM[correct.ordering]) # TRUE ABSOLUMENT P08_NSCOL15P # proportion de personnes non scolarisées de 15 ans ou plus titulaires d'un dipl^ ome de niveau supérieur à bac bn$y=bn$P08_NSCOL15P_SUP/bn$P08_NSCOL15P breaks=c(0,.025,.05,.075,.10,.15,.50) bn$y.f<- factor(cut(bn$y,breaks,include.lowest=TRUE)) table(bn$y.f) spplot(bn,'y.f') http://www.math.unicaen.fr/~kauffman/cours 5 [email protected] Université de Caen Basse-Normandie 22 septembre 2015 Département de Mathématiques et Mécanique (0.15,0.5] (0.1,0.15] (0.075,0.1] (0.05,0.075] (0.025,0.05] [0,0.025] Figure 3 – RP 08 INSEE : proportion d’habitants de + 15 ans non scolariés BAC+2 ou plus 1.2.5 Géolocalisation Dans cette partie on essaye de positionner sur une carte des points connus par leurs adresses : on appelle ceci le géocodage. On va utiliser isi les coordonnées longitude/latitude. 1. Depuis https://maps.google.com/, positionner la carte à l’adresse suivante 10, Boulevard du maréchal Juin, 14000 CAEN France. A l’aide du bouton droit de la souris effectuer l’action What’s here?, et copier la latitude et la longitude. adresse="10, Boulevard du maréchal Juin, 14000 CAEN France" tmp=communes[is.element(communes$NOM_COMM, c("CAEN","HEROUVILLE-SAINT-CLAIR","EPRON","EPRON","SAINT-CONTEST","FLEURY-SUR-ORNE")),] # transformation coordonnées en longitude/latitude tmp=spTransform(tmp,CRS("+proj=longlat +ellps=WGS84")) summary(tmp) plot(tmp) # tjours longitude en premier points(x=-0.372809,y=49.209677,col="red",pch=20) text(x=-0.372809,y=49.209677,labels=adresse,pos=1,cex=0.5)#$ http://www.math.unicaen.fr/~kauffman/cours 6 [email protected] Université de Caen Basse-Normandie 22 septembre 2015 Département de Mathématiques et Mécanique 10, Boulevard du maréchal Juin, 14000 CAEN France Figure 4 – Géocodage manuel 2. Dans cette question, on va utiliser la fonction geocode du package dismo [2] R qui permet de faire un géocodage automatique à l’aide de google API. Dans un cadre professionel, De plus cette fonction ajoute un délai entre chaque requete. Ce délai est obligatoire. Pour le traitement de masse, le resultat ne sera pas immédiat. Il existe plusieurs site de géocodage gratuit. (a) Créez une table ayant deux variables de type chaine de caractères le nom et votre adresses (b) A l’aide de la fonction dismo::geocode géolocalisez les adresses. (c) Sélectionnez uniquement les adresses du calvados. (d) Puis affichez la carte en pointant vos domiciles. François KAUFFMANN Raphaël BUSSON Émilie HERBRECHT Yuwei HUANG Alpha Oumar DIOP Zhangyun TAN Fabien SAVARY Figure 5 – Géocodage par dismo::geocode 1.2.6 Superposition de cartes vectorielles Il faut que toutes les cartes adoptent le même système de projection. # transformation des coordonnées en longitude/latitude bn_longlat=spTransform(bn,CRS("+proj=longlat +ellps=WGS84")) # lectures des couches trains, routes cours d'eau dsn="/home/francois/labo-p/tex/stat/data-carto/geofabrik/basse-normandie.shp" routes=readOGR (dsn, layer="roads" , stringsAsFactors=FALSE) trains=readOGR (dsn, layer="railways", stringsAsFactors=FALSE) villes=readOGR (dsn, layer="places" , stringsAsFactors=FALSE) rivieres=readOGR (dsn, layer="waterways" , stringsAsFactors=FALSE) # autour de la fac http://www.math.unicaen.fr/~kauffman/cours 7 [email protected] Université de Caen Basse-Normandie 22 septembre 2015 Département de Mathématiques et Mécanique xlim=-0.372809+c(-0.1,0.1) ylim=49.209677+c(-0.1,0.1) plot(bn_longlat,xlim=xlim,ylim=ylim) plot(rivieres,add=TRUE,lwd=2,col="blue",xlim=xlim,ylim=ylim) Figure 6 – Rivières dans Caen Nord 1.2.7 Superposition image raster et cartes vectorielles Il faut que toutes les cartes adoptent le même système de projection. Créez un répertoire raster_tmp dans votre répertoire de travail de R. (x=geocode("Caen, France")) (e=extent(unlist(x[5:8]))) g.satellite= dismo::gmap(e, type = "satellite", filename='raster_tmp/gmap.satellite.gif') # transfation du sytème de coordonnées routes.Mercator=spTransform(routes, CRS(paste("+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0", "+k=1.0 +units=m +nadgrids=@null +no_defs"))) # tracé Boulevard Maréchal Juin assez bien selection=routes.Mercator$name=="Boulevard du Maréchal Juin" selection[is.na(selection)]=FALSE plot(g.satellite) plot(routes.Mercator[selection,],col="red",cex=3,add=TRUE) http://www.math.unicaen.fr/~kauffman/cours 8 [email protected] Université de Caen Basse-Normandie 22 septembre 2015 Département de Mathématiques et Mécanique Figure 7 – Superposition image satellite et Bd Marechal Juin http://www.math.unicaen.fr/~kauffman/cours 9 [email protected]