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]