Archives de
Mois : août 2012

Une carte des stations Vélo’V avec R

Une carte des stations Vélo’V avec R

Je suis en train de lire (doucement) le livre de Bivand, Pebesma et Gómez-Rubio : Applied Spatial Data Analysis with R. Le livre est chouette, je le commenterai plus en détail dès que je l’aurai terminé. En attendant je me suis dit qu’il fallait que je pratique un peu le maniement de données spatiales. Et je suis parti je ne sais plus trop comment ni pourquoi sur les stations Vélo’v de Lyon. Ça me permet de jouer avec des données OpenStreetMap (mon péché mignon…). Ce billet explique comment extraire des données d’osm, les lire dans R et produire une carte.

La première étape consiste à récupérer les données d’osm. Je ne me suis pas encore penché sur l’extraction de données directement à partir de la base (est-ce seulement possible ?). Je pars donc d’une extraction de la région Rhône-Alpes qu’on peut trouver sur le site geofabrik au format XML .osm.

Une fois téléchargé, il n’est pas question d’ouvrir le fichier directement avec JOSM ou QGIS, il est bien trop lourd pour ça. On peut utiliser le logiciel Osmosis qui permet de faire les requêtes nécessaires en lignes de commandes. Ici en l’occurence je veux réduire ma bounding box :

osmosis --read-xml file="rhone-alpes.osm.bz2" --bounding-box top=45.8297562 left=4.7131348 bottom=45.6466883 right=5.0083923 --write-xml file="lyon_agglo.osm

et extraire les stations Vélo’v. On peux se contenter de sélectionner la valeur bicycle_rental sur la clé amenity car il n’y a que les Vélo’v qui propose ce service à Lyon.

osmosis --read-xml file="lyon_agglo.osm" --node-key-value keyValueList="amenity.bicycle_rental" --write-xml file="velov_stations.osm"

On a donc un fichier .osm qui contient les stations de Lyon. On peut le charger dans R avec le package osmar et le convertir en objet de la classe sp si on veut en faire une analyse plus poussée. Le truc qui me pose problème avec la fonction as_sp c’est qu’on perds toutes les métadonnées d’osm. Je fais donc tourner une petite fonction avant pour pouvoir retrouver ces informations dans le slot data de mon objet sp.

library(osmar)
library(sp)

stations <- get_osm(complete_file(), source = osmsource_file("velov_stations.osm"))

#Fonction qui ajoute les tags OSM au slot attrs d'un objet osmar pour conversion vers sp
 addtags <- function(obj){
 tag <- obj$nodes$tags
 tagf <- reshape(tag, idvar="id", timevar="k", direction="wide")
 colnames(tagf)[-1] <- substr(colnames(tagf)[-1], 3, 100000)
 obj$nodes$attrs <- merge(obj$nodes$attrs, tagf, by="id", all.x=TRUE)
 return(obj)
 }

stations <-addtags(stations)
stations <- as_sp(stations, what="points")

La classe sp a son lot de méthodes bien pratiques et permet de travailler avec beaucoup de packages. Un summary() nous donne un aperçu complet de l’objet et on peut afficher les positions relatives des points entre eux graphiquement avec la fonction plot().

Pour finir on peut afficher les points sur un fond de carte. J’ai utilisé le package ggmap qui fonctionne très bien et propose des tiles Google map, Osm, Stamen et CloudMade mais impose d’adopter la syntaxe ggplot2 et ne digère pas (encore?) les objets sp.

library(ggmap)
 lyonraster <- get_map("Lyon, France", zoom=13, source="osm")
 lyon <- ggmap(lyonraster, extent = "device")
 posist <- cbind(stations$lon,stations$lat, as.numeric(as.character(stations@data$capacity)))
 posist <- as.data.frame(posist)
 colnames(posist) <- c("lon","lat","capacity")
 lyon + geom_point(aes(x = lon, y = lat, size=capacity), data=posist, color=2)

Voilà ce que ça donne avec un rendu Stamen (toner). La taille des points est fonction de la taille de la station. Les stations de capacité nulle sont celles où l’info est manquante. Juste une question de temps 😉

Facebooktwitter