cartographie avec r
Embed Size (px)
DESCRIPTION
Comment créer une carte avec R et le package RgoogleMaps ? Slides présentés lors du 7ème meetup R Addicts Paris par Hang Khuc, responsable pôle étude et statistiques chez Sensorly.TRANSCRIPT

© Sensorly Confiden.al
Hang Khuc Pôle études et statistiques
1
CaRtogRaphie avec R !
2014-06-18

© Sensorly Confiden.al2

© Sensorly Confiden.al3
1
Qu’est ce que la cartographie ? Les données spatiales ?

© Sensorly Confiden.al4
1 Cartographie et données spatiales
Selon Wikipédia « La cartographie désigne la réalisation et l’étude des cartes géographiques et géologiques. (…) Le principe majeur de la cartographie est la représentation de données (…). L’objectif de la carte est d’offrir une représentation concise et efficace permettant la simplification de phénomènes complexes pour une compréhension rapide et pertinente. » !Les données spatiales
• Célèbre jeu de données : emplacement où ont eu lieu les crimes et délits à Chicago ; • Répliques de tremblements de terre sont détectés et leur latitude, longitude et l'heure
de l'événement sont enregistrées ; • La localisation des personnes touchées par une maladie pour étudier la propagation
de la maladie et retrouver son origine : Légionellose à Québec en 2012. • Votre localisation lors d’un post sur Facebook ou Twitter ; • Le lieu public où vous vous trouvez lorsque vous faites un check-in dans Foursquare ; • Niveau de signal capté par votre smartphone lorsque vous contribuez à notre
application ; • Les données OSM : Prolifération des services de géolocalisation : trouver l’arrêt
de métro le plus proche, afficher un itinéraire, chercher une pharmacie, un magasin, etc.
!! Les données spatiales sont partout !

© Sensorly Confiden.al5
!1. Création du fond de carte !!2. Sélection de l’information !!3. Choix du type de représentation !!4. Définition des éléments à faire apparaître sur la carte !!But : Proposer une lecture spatialisée du phénomène pour mieux comprendre son mécanisme !
2 Data visualisation

© Sensorly Confiden.al6
2
Les données spatiales à la loupe

© Sensorly Confiden.al7
1 Coordonnées géographiques
Situer un point géographique sur le globe terrestre revient à attribuer des coordonnées à un objet dans un repère lié à la Terre :
• coordonnées polaires et ses variantes : N 43°51’45.6" E 03°48'28.3" • avec coordonnées latitude-longitude : latitude=48.84262 longitude=2.291257
• avec 3 dimensions x,y et z : x=718.260 y=174.690
!!!!!!!!!Une valeur de coordonnées est toujours situé dans un système géodésique de référence terrestre (Coordiante Reference System - CRS)

© Sensorly Confiden.al8
Les systèmes géodésiques/de projection les plus couramment utilisés reposent sur une représentation ellipsoïde de la Terre. Par exemple, pour représenter la Terre on utilise le système géodésique mondial dit WGS-84. !La représentation de la France que l’on utilise est celle du Lambert-93 qui utilise une projection conique de la Terre. !Chaque système a un code unique appelé code EPSG (European Petroleum Survey Group) : - WGS-84 : 4326 - Lambert-93 : 2154 - Lambert-92 étendu : 27572 !Attention, il peut exister des différences pouvant aller jusqu’à plusieurs centaines de mètres entre deux systèmes. !Transformation de la coordonnée : passer d’un système de référence à un autre. - En utilisant les formules mathématiques de transformation - Fonction spTransform du package rgdal spTransform(…,CRS(« +init=epsg:27572"))
2 Les projections

© Sensorly Confiden.al9
3
Un exemple de use case

© Sensorly Confiden.al10
Pour chaque restaurant que j’ai fréquenté : - Date - Nom - Coordonnées géographiques latitude/longitude - Le temps approximatif que j’ai passé dans ce restaurant - La note que j’ai attribué à la nourriture que j’ai pu gouter
1 Données
date nom la.tude longitude tps note02/01/2014 indien 48.842617 2.291257 00:45:00 313/01/2014 espagnol 48.846107 2.303054 03:00:00 502/02/2014 italien_1 48.861085 2.300355 01:30:00 408/02/2014 libanais 48.871137 2.334830 01:15:00 322/02/2014 sushi_1 48.860052 2.350237 00:50:00 3

© Sensorly Confiden.al11
« This package serves two purposes: "
" (i) Provide a comfortable R interface to query the Google server for static maps, "
" (ii) Use the map as a background image to overlay plots within R. "
This requires proper coordinate scaling. »"
!RgoogleMaps sert donc à faire des cartes statiques. Choix : - Type de fond de carte : roadmap, terrain, mobile, satellite - Couleur ou noir et blanc - Carte centrée : qbbox (quantile bounding box) et niveau de zoom - Tracer : - des points
- des pie charts - polygone - à partir d’un shape - une image raster - courbes de béziers - Ajouter - un texte - une légende - Et pleins d’autres choses !
2 Data visualisation avec RgoogleMaps

© Sensorly Confiden.al12
3 Chargement d’une carte (1/2)
# Chargement de la cartebbox<-qbbox(lat= meetup$latitude,lon= meetup$longitude)nzoom<-min(MaxZoom(bbox$latR,bbox$lonR,size=c(640,640)))-1MyMap1<-GetMap(center=c(mean(bbox$latR),mean(bbox$lonR)),zoom=nzoom,maptype="roadmap",destfile=paste("carte.png",sep=""))MyMap2<-GetMap(center=c(mean(bbox$latR),mean(bbox$lonR)),zoom=nzoom,maptype="terrain",destfile=paste("carte.png",sep=""))MyMap3<-GetMap(center=c(mean(bbox$latR),mean(bbox$lonR)),zoom=nzoom,maptype="satellite",destfile=paste("carte.png",sep=""))MyMapBW<-GetMap(center=c(mean(bbox$latR),mean(bbox$lonR)),zoom=nzoom,maptype="mobile",destfile=paste("carte.png",sep=""),GRAYSCALE=T)PlotOnStaticMap(MyMap1,mar=rep(1,4))title("Roadmap",cex.main=0.8)PlotOnStaticMap(MyMap2,mar=rep(1,4))title("Terrain",cex.main=0.8)PlotOnStaticMap(MyMap3,mar=rep(1,4))title("Satellite",cex.main=0.8) PlotOnStaticMap(MyMapBW,mar=rep(1,4))title("Mobile noir et blanc",cex.main=0.8)

© Sensorly Confiden.al13
3 Chargement d’une carte (2/2)Roadmap Terrain
Satellite Mobile noir et blanc

© Sensorly Confiden.al14
# Avec PlotOnStaticMapPlotOnStaticMap(MyMapBW,lat=meetup$latitude,lon=meetup$longitude,pch=21,bg="#8073ac80",col="#2d004b",cex=2)!# Avec les markersmmarkers<-NULLfor (i in 1:nrow(meetup)){mm<-paste0("&markers=color:green|label:",LETTERS[i],"|",meetup[i,"latitude"],",",meetup[i,"longitude"])mmarkers<-paste0(mmarkers,mm)}!> &markers=color:green|label:A|48.842617,2.291257&markers=color:green|label:B|48.846107,2.303054&markers=color:green|label:C|48.861085,2.300355 (…)!!MyMapMK<-GetMap(center=c(mean(bbox$latR),mean(bbox$lonR)),zoom=nzoom,maptype=« mobile",destfile=paste("carte.png",sep=""),markers=mmarkers)PlotOnStaticMap(MyMapMK)
4 Localiser les restaurants (1/2)

© Sensorly Confiden.al15
4 Localiser les restaurants (2/2)

© Sensorly Confiden.al16
Dessiner des piecharts (1/3)5
# Réorganiser les données! date nom latitude longitude tps note1 02/01/2014 indien 48.84262 2.291257 00:45:00 32 13/01/2014 espagnol 48.84611 2.303054 03:00:00 53 02/02/2014 italien_1 48.86109 2.300355 01:30:00 4 4 08/02/2014 libanais 48.87114 2.334830 01:15:00 3 5 22/02/2014 sushi_1 48.86005 2.350237 00:50:00 3 6 16/03/2014 francais_1 48.87097 2.334089 02:10:00 5 7 24/03/2014 espagnol 48.84611 2.303054 02:30:00 5 8 03/04/2014 coreen 48.86620 2.336010 02:20:00 5 9 11/04/2014 italien_2 48.87283 2.341554 01:15:00 1 10 18/04/2014 francais 48.86673 2.365907 02:30:00 4 11 19/04/2014 espagnol 48.84611 2.303054 02:10:00 3 12 04/05/2014 francais_2 48.83559 2.329515 03:15:00 5 13 09/05/2014 creperie 48.84358 2.321071 01:35:00 4 14 21/05/2014 coreen 48.86620 2.336010 01:05:00 4 15 29/02/2014 indien 48.84262 2.291257 00:30:00 3 !

© Sensorly Confiden.al17
# Choix des couleurscouleur<-paste0(brewer.pal(11,"Paired")!# Mise en forme du temps passétps<-hms(meetup$tps)meetup$tps_sec<-hour(tps)*3600+minute(tps)*60+seconds(tps)!# Temps moyen passé dans chaque restaurantaa<-melt(meetup[,c("nom","tps_sec")],id="nom")bb<-dcast(aa,nom~variable,value.var="value",mean)cc<-meetup[!duplicated(meetup$nom),c("nom","latitude","longitude")]dd<-merge(cc,bb,by=« nom")!# Représentation graphiquePlotOnStaticMap(MyMapBW)!for (n in 1:nrow(dd)){!!! newcoord<- LatLon2XY.centered(MyMapBW,lat=dd[n,"latitude"],lon=dd[n,"longitude"],zoom=nzoom)!!!! r<-dd[n,"tps_sec"]/500!! ! ! !! floating.pie(xpos=newcoord$newX,newcoord $newY,x=100,radius=r,col=paste0(couleur[n],"95"),border=couleur[n],lwd=2)!!! shadowtext(newcoord$newX,newcoord$newY-(6+r),paste(round(dd[n,"tps_sec"]/3600,0)," h",sep=""),cex=0.6,col="white",bg="blue")!!}!!# Rajout d’une légendelegend("topleft",legend=dd$nom,col=couleur,lwd=10,bg="white")
5 Dessiner des piecharts (2/3)

© Sensorly Confiden.al18
5 Dessiner des piecharts (3/3)
2 h2 h2 h2 h2 h2 h2 h2 h2 h
2 h2 h2 h2 h2 h2 h2 h2 h2 h3 h3 h3 h3 h3 h3 h3 h3 h3 h
2 h2 h2 h2 h2 h2 h2 h2 h2 h
2 h2 h2 h2 h2 h2 h2 h2 h2 h
3 h3 h3 h3 h3 h3 h3 h3 h3 h
1 h1 h1 h1 h1 h1 h1 h1 h1 h
2 h2 h2 h2 h2 h2 h2 h2 h2 h
1 h1 h1 h1 h1 h1 h1 h1 h1 h1 h1 h1 h1 h1 h1 h1 h1 h1 h
1 h1 h1 h1 h1 h1 h1 h1 h1 h
coreencreperieespagnolfrancaisfrancais_1francais_2indienitalien_1italien_2libanaissushi_1

© Sensorly Confiden.al19
# Enveloppe convexetr<-tri.mesh(cc[,"longitude"], cc[,"latitude"])trch<-convex.hull(tr)trch!> $x[1] 2.291257 2.329515 2.365907 2.341554 2.334089 2.300355!$y[1] 48.84262 48.83559 48.86673 48.87283 48.87097 48.86109!$i[1] 1 10 9 8 6 3!!# Mise en forme des donnéesmypolygon<-data.frame(trch$x,trch$y)colnames(mypolygon)<-c(« X","Y")!# Représentation graphiquePlotOnStaticMap(MyMapBW)PlotPolysOnStaticMap(MyMapBW, mypolygon,add=T,col=paste0("#66bd63","40"),lwd=.5, border="#a6d96a")
6 Polygones (1/2)

© Sensorly Confiden.al20
6 Polygones (1/2)

© Sensorly Confiden.al21
7 Image raster (1/2)# Importation des pngcontent<-readPNG("sticker-smiley-content.png")pascontent<-readPNG("smiley-pascontent.png")pouce<-readPNG("Smiley_pouce.png")!# Note moyenne pour chaque restaurantaa<-melt(meetup[,c("nom","note")],id="nom")bb<-dcast(aa,nom~variable,value.var="value",mean)cc<-meetup[!duplicated(meetup$nom),c("nom","latitude","longitude")]dd<-merge(cc,bb,by="nom")!# Représentation graphiquePlotOnStaticMap(MyMapBW)for (i in 1:nrow(dd)){ if (dd[i,"note"]<=3){ nomsmiley<-"pascontent" } else { if (dd[i,"note"]==5) { nomsmiley <-"pouce" } else { nomsmiley <-"content" } } Rcoords0<-LatLon2XY.centered(MyMapBW,dd[i,"latitude"],dd[i,"longitude"]) x<-Rcoords0$newX y<-Rcoords0$newY rasterImage(get(nomsmiley),x,y,x+60,y+60) }

© Sensorly Confiden.al22
7 Image raster (1/2)

© Sensorly Confiden.al
Hang Khuc Pôle études et statistiques
23
On recrute Java Platform Engineer
!
https://www.linkedin.com/jobs2/view/10976225 !!
Merci !!!!!