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)