Anleitung

osmdata (R): einen anderen Overpass-Server verwenden

Das R-Paket osmdata macht aus Overpass-Antworten sf-Objekte und Data Frames. Beim Laden wählt es einen der öffentlichen Overpass-Server. Sie können es auf einen anderen Server umstellen und Ihren API-Schlüssel aus Ihren Skripten heraushalten.

Rufen Sie nach library(osmdata) die Funktion set_overpass_url() mit der vollständigen URL auf, mit /interpreter:
library(osmdata)
set_overpass_url("https://api.overpass.ch/v1/IHR_API_SCHLÜSSEL/interpreter")

Ein vollständiges Beispiel

library(osmdata)

key <- Sys.getenv("OVERPASS_CH_KEY")
set_overpass_url(paste0("https://api.overpass.ch/v1/", key, "/interpreter"))

q <- opq(bbox = c(6.60, 46.50, 6.66, 46.54), timeout = 60) |>
  add_osm_feature(key = "amenity", value = "fountain")

fountains <- osmdata_sf(q)          # sf-Objekte: osm_points, osm_lines, osm_polygons, …
nrow(fountains$osm_points)

df <- osmdata_data_frame(q)         # oder ein einfacher Data Frame der Tags

Wir haben das mit osmdata 0.4.1 in R getestet: Etwa 1'160 Brunnen in Lausanne sind in weniger als einer halben Sekunde da.

Details, die zählen

  • Die URL muss interpreter enthalten. Alles andere lehnt set_overpass_url() ab, mit «overpass_url not valid - must end with /interpreter».
  • Es prüft den Server. osmdata leitet die Status-URL ab, indem es interpreter durch status ersetzt, und liest sie. Ist der Server nicht erreichbar, scheitert der Aufruf, und der bisherige Server bleibt gewählt. Ein Tippfehler im Schlüssel zeigt sich genau dort.
  • In jeder Sitzung setzen. osmdata wählt beim Laden einen Server (die Startmeldung sagt, welchen); setzen Sie set_overpass_url() also direkt nach library(osmdata). get_overpass_url() zeigt den aktuellen.
  • Ortsnamen in opq("Lausanne") werden wie bisher mit Nominatim gesucht. Für reproduzierbare Skripte geben Sie den Begrenzungsrahmen als Zahlen an, in der Reihenfolge West, Süd, Ost, Nord.
  • Timeouts: opq(timeout = …) setzt die Zeitgrenze der Abfrage, standardmässig 25 Sekunden. Auf overpass.ch werden Werte über dem Maximum des Tarifs auf dieses gesenkt.
  • Wiederholungen: osmdata wiederholt fehlgeschlagene Anfragen selbst, bis zu 10 Mal. Vor jeder Abfrage liest es ausserdem die Statusseite, was nicht als Overpass-Anfrage zählt.

Den Schlüssel aus Ihren Skripten heraushalten

Schreiben Sie den Schlüssel in die Datei .Renviron in Ihrem Home-Verzeichnis, zum Beispiel mit usethis::edit_r_environ(), und starten Sie R neu:

OVERPASS_CH_KEY=IHR_API_SCHLÜSSEL

Sys.getenv("OVERPASS_CH_KEY") liefert ihn dann, und das Skript lässt sich ohne Schlüssel teilen oder einchecken. Auf CI-Servern setzen Sie dieselbe Variable als Secret.

Höhen für Ihre Ergebnisse

osmdata baut seine Abfragen selbst; Höhen ergänzen Sie deshalb am einfachsten mit einem zweiten Aufruf mit den Koordinaten. Die Höhen-API nimmt in den bezahlten Tarifen bis 10'000 Orte pro Anfrage und im kostenlosen Tarif 1'000:

library(httr2)
library(sf)

elevation <- function(xy) {        # xy: eine Matrix mit den Spalten X (lon) und Y (lat)
  locations <- paste(sprintf("%.6f,%.6f", xy[, "Y"], xy[, "X"]), collapse = "|")
  resp <- request(paste0("https://api.overpass.ch/v1/", key, "/elevation")) |>
    req_body_json(list(locations = locations)) |>
    req_perform() |>
    resp_body_json()
  vapply(resp$results, \(r) if (is.null(r$elevation)) NA_real_ else r$elevation, numeric(1))
}

xy <- st_coordinates(fountains$osm_points)
chunks <- split(seq_len(nrow(xy)), ceiling(seq_len(nrow(xy)) / 1000))
fountains$osm_points$elevation <- unlist(lapply(chunks, \(i) elevation(xy[i, , drop = FALSE])))