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)

Download of verander dit tech report!

Avatar
De DataStudio
Urban Analytics

Wij geven de gelegenheid om mensen van verschillende faculteiten en mensen van buiten de HvA op het gebied van data science met elkaar kennis te laten maken.