How to: gebruik maken van open street maps API's
Introduction
In dit tech report gaan we gebruik maken van de Open street maps API, en zullen we verschillende API calls verkennen die mogelijk zijn voor het platform.
Wat zijn API calls
Een RESTful API is een methode voor het beschikbaarstellen van communicatie tussen een computer die aangesloten is op het internet en een server die zijn data beschikbaar stelt. Op Wikipedia kan je meer informatie over deze methoden vinden maar we gaan er in dit tech report niet veel verder op in dan dat we er gebruik van maken voor het gebruiken als introductie hoe jij het zou kunnen gebruiken.
Het aanroepen “calls” van API kan verschillende bestands formated terugsturen waaronder: HTTP, URI, JSON, or XML. OpenStreetMaps stuurt JSON terug. Afhankelijk van de API, zou je dus andere libraries moeten gebruiken voor het parsen van jou data.
De database van Open Street Maps
Sinds dat Google zijn maps API heeft verscholen achter een credit card betalingen voor vrijgebruik, moeten we naar andere methoden zoeken om vergelijkbare data ergens op te kunnen halen. Open Street maps biedt zijn data open aan, en er kan dus vrij gebruik van worden gemaakt zolang je er naar refereert. Nominatim API is een van de providers van de Open Street Maps data, bekijk de links voor verschillende API calls die je kan maken.
Je kan de data ook als geheel downloaden, dit heeft zijn voordelen. Zo kan je onbeperkt calls maken naar de API, providers die het online aanbieden willen dit namelijk wel is limiteren, door een paywall of door het maximale aantal calls in een bepaald tijdsbestek limiteren. Je hebt dan wel de ruimte nodig, omdit ergens te kunnen plaatsen. Bij Urban Analytics gebruiken we link: http://prdurbana0001.ict.hva.nl/nominatim/reverse?format=jsonv2
Stel dat je beschikbaarheid hier tot hebt, maak hier dan gebruik van tijdens het maken van je calls!
# Gebruikte libraries
library(jsonlite) # Wordt gebruikt voor het maken van API calls en parsen JSON
library(gepaf) # Coordinaten parsen in Google Polylines
library(leaflet) # Interactieve mappen voor het weergeven van maps data
## Warning: package 'leaflet' was built under R version 3.6.3
# URL link voor het maken van API calls
reverse_url = "https://nominatim.openstreetmap.org/reverse?format=jsonv2&"
search_url = "https://nominatim.openstreetmap.org/search.php?format=jsonv2&q="
routing_url = "http://router.project-osrm.org/route/v1/driving/polyline("
Ophalen data via de coordinaten
Stel je wilt weten welke plaats hoort van bepaalde locatie coordinaten die je tot je beschikking hebt. We zullen hiervoor gebruik maken van de Nominatim API om data op te halen van een willekeurige plek in Amsterdam
CoordinatesToLocation <- function(lon = NULL,lat=NULL) {
url <- paste0(reverse_url,"&lat=",lat,"&lon=",lon)
system.time({
d <- fromJSON(url)
})
return(d)
}
CoordinatesToLocation(4.8945, 52.3667)$display_name
## [1] "McDonald's, , Grachtengordel, Amsterdam, Noord-Holland, Nederland, 1017CK, Nederland"
We weergeven nu alleen het display\_name
attribuut van de data die we hebben terug gekregen. Maar in de volledige set aan data zit veel meer, afhankelijk van wat je nodig hebt zou je hierin moeten kijken.
Ophalen coordinaten via een locatie
We kunnen dit ook andersom doen, stel je hebt de coordinaten nodig van een specifieke locatie. Hiervoor maken we gebruik van de search_url
, dit geeft een lijst terug met gevonden plaatsen gesorteerd op meest waarschijnlijk. Hiervan pakken we van het eerste resultaat de coordinaten, nogmaals afhankelijk van je nodig hebt zou je je resultaat kunnen aanpassen.
LocationToCoordinates <- function(location) {
url <- paste0(search_url, location)
system.time({
d <- fromJSON(url)[1,]
})
return (data.frame(as.numeric(as.character(d['lat'])), as.numeric(as.character(d['lon']))))
}
LocationToCoordinates("Amsterdam")
## as.numeric.as.character.d..lat.... as.numeric.as.character.d..lon....
## 1 52.37454 4.897976
Auto route tussen locaties
In dit voorbeeld gebruiken we de function LocationToCoordinates
om de coordinaten te bepalen van Utrecht en Eindhoven Deze coordinaten kunnen we gebruiken met de Open Source Routing Machine (OSRM) API, die net iets anders is dan Nominatim en zijn eigen URL heeft routing_url
. Ook maken we gebruik van de library gepaf
, wat een encoder is om coordinated the vertalen naar Google’s Encoded Polyline Format. Helaas kan de API van OSRM niet heel vaak worden aangeroepen, hiervoor moet je de us oppassen.
We printen de afstand af tussen de locaties
GetCarRoute <- function(encpolied_position) {
url <- paste0(routing_url,encpolied_position,")")
system.time({
d <- fromJSON(url)
})
return(d)
}
location_utrecht <- LocationToCoordinates("Utrecht")
location_eindhoven <- LocationToCoordinates("Eindhoven")
coords <- data.frame(lat = c(location_utrecht[1,1], location_eindhoven[1,1]),
lon = c(location_utrecht[1,2], location_eindhoven[1,2]))
result <- GetCarRoute(encodePolyline(coords))
print(result[["routes"]][["distance"]])
## [1] 89582.2
Het in kaart brengen van de route
Het resultaat vanuit OSRM, bevat de data die de essentiele punten bevat voor het maken van een route tussen Utrecht en Eindhoven. Met de library leaflet
kunnen we dit weergeven.
route_df <- decodePolyline(result[["routes"]][["geometry"]])
leaflet(route_df) %>%
addTiles() %>%
addProviderTiles(providers$CartoDB.Positron) %>%
addCircles(lng = ~lon, lat = ~lat, weight = 2, fillOpacity = 0.5,
radius = 10)