Extraction de données OSM dans R via Overpass API

On commence par formatter notre requête overpass (en QL ici) :

node
  ["shop"="bakery"]
  (45.805230217706445,1.2158775329589844,45.86192259278889,1.3109779357910156);
out;

Ce qui passé en string, donne

myQuery <- "node[\"shop\"=\"bakery\"](45.805230217706445,1.2158775329589844,45.86192259278889,1.3109779357910156);out;"

On souhaite que nos données soient en JSON en sortie :

myJSONQuery <- paste("[out:json];", myQuery, sep = "")

On peut maintenant constituer notre URL de requête :

myURL <- paste("http://overpass-api.de/api/interpreter?data=", myJSONQuery, 
    sep = "")

On charge le package rjson qui permettra de traiter le json, et on execute la requête pour récupérer le fichier :

require(rjson)
## Loading required package: rjson
myJSON <- fromJSON(file = myURL)
summary(myJSON)
##           Length Class  Mode     
## version    1     -none- numeric  
## generator  1     -none- character
## osm3s      2     -none- list     
## elements  10     -none- list

Ce JSON est désormais une liste d'éléments, qu'on va traiter avec une fonction ad-hoc :

OverpassJsonToDataframe <- function(jsonstring) {
    myDF <- data.frame(type = "", id = "", lat = "", lon = "", stringsAsFactors = FALSE)
    myDF <- myDF[-1, ]
    for (node in jsonstring$elements) {
        myDF[nrow(myDF) + 1, ] <- c(node$type, node$id, node$lat, node$lon)
    }
    myDF$lat <- as.numeric(myDF$lat)
    myDF$lon <- as.numeric(myDF$lon)
    return(myDF)
}

dfBoulangeries <- OverpassJsonToDataframe(myJSON)
print(dfBoulangeries)
##    type         id   lat   lon
## 1  node  349008599 45.83 1.257
## 2  node  484718268 45.81 1.224
## 3  node  820927087 45.82 1.226
## 4  node 1796390940 45.84 1.251
## 5  node 1925388482 45.82 1.266
## 6  node 2100621743 45.84 1.307
## 7  node 2201604756 45.81 1.258
## 8  node 2401898499 45.83 1.227
## 9  node 2504084645 45.83 1.255
## 10 node 2504117851 45.83 1.256

On charge le package sp et on converti notre data.frame en SpatialPointsDataFrame :

require(sp)
## Loading required package: sp
## Warning: package 'sp' was built under R version 3.0.2
coordinates(dfBoulangeries) <- ~lon + lat

Et on peut maintenant cartographier nos boulangeries

plot(dfBoulangeries)

plot of chunk unnamed-chunk-7