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.
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
interpreterenthalten. Alles andere lehntset_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
interpreterdurchstatusersetzt, 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 nachlibrary(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])))