OSMnx: eigener Overpass-Server und Höhen der Knoten
OSMnx lädt Strassennetze und Objekte von einem Overpass-Server, standardmässig von overpass-api.de. Eine Einstellung wechselt den Server, und Höhen der Knoten und Steigungen der Kanten funktionieren ohne Google-API-Schlüssel.
ox.settings.overpass_url auf die Basis-URL des Servers, ohne /interpreter. Auf overpass.ch können alle anderen Einstellungen ihren Standardwert behalten:
import osmnx as ox
ox.settings.overpass_url = "https://api.overpass.ch/v1/IHR_API_SCHLÜSSEL"
Auf einem Server, dessen Seite /status OSMnx nicht lesen kann, setzen Sie zusätzlich ox.settings.overpass_rate_limit = False; warum, steht weiter unten.
Einen anderen Overpass-Server verwenden
import os
import osmnx as ox
KEY = os.environ["OVERPASS_CH_KEY"] # den Schlüssel aus dem Code heraushalten
ox.settings.overpass_url = f"https://api.overpass.ch/v1/{KEY}"
G = ox.graph_from_place("Zermatt, Switzerland", network_type="walk")
water = ox.features_from_place("Zermatt, Switzerland", tags={"amenity": "drinking_water"})
- Kein
/interpreter: OSMnx hängt es selbst anoverpass_urlan. - Ortsnamen wie «Zermatt, Switzerland» sucht OSMnx mit Nominatim, nicht mit Overpass; sie sind also nicht betroffen.
- Grosse Gebiete werden in mehrere Overpass-Anfragen aufgeteilt (
max_query_area_size). Sie laufen nacheinander, was gut zu Limits pro Schlüssel passt.
Wir haben das mit OSMnx 2.1.1 getestet: Das Fusswegnetz von Zermatt (1'882 Knoten) ist in etwa 7 Sekunden da.
Was overpass_rate_limit tut
Mit eingeschaltetem overpass_rate_limit (dem Standard) liest OSMnx vor jeder Anfrage die Seite /status des Servers, um herauszufinden, wann der nächste Abfrage-Slot frei wird. Es erwartet das Textformat von overpass-api.de.
- Auf overpass.ch antwortet
/v1/IHR_API_SCHLÜSSEL/statusin diesem Format, mit den Slots Ihres Schlüssels: einen für jede Abfrage, die Ihr Tarif gleichzeitig ausführen darf. Wenn Sie die Anfragen pro Minute aufgebraucht haben, zeigt die Seite, wann die nächste Anfrage erlaubt ist, und OSMnx wartet bis dann, statt ein429zu erhalten. Das Lesen des Status zählt nicht zu den Anfragen pro Minute. Mit den Standardeinstellungen brauchten drei Abfragen nach Objekten in Zermatt zusammen 1,1 Sekunden. - Auf einem Server, der anders antwortet oder keine Statusseite hat, schreibt OSMnx «Unable to parse» oder «Unrecognized server status» ins Log und wartet vor jeder Anfrage 60 Sekunden, seinen Standardwert. Dort setzen Sie
ox.settings.overpass_rate_limit = False.
Höhen der Knoten ohne Google-Schlüssel
ox.elevation.add_node_elevations_google() funktioniert mit jeder API, die das Format der Google Elevation API spricht; ihre URL ist eine Einstellung. Die Höhen-API von overpass.ch tut das, mit demselben Schlüssel:
ox.settings.elevation_url_template = (
"https://api.overpass.ch/v1/{key}/elevation?locations={locations}"
)
G = ox.elevation.add_node_elevations_google(G, api_key=KEY, batch_size=512)
G = ox.elevation.add_edge_grades(G) # grade und grade_abs auf jeder Kante
# das steilste Strassenstück von mindestens 100 m
long_edges = [e for e in G.edges(data=True) if e[2]["length"] >= 100]
steepest = max(long_edges, key=lambda e: e[2]["grade_abs"])
print(steepest[2].get("name"), round(steepest[2]["grade_abs"] * 100), "%")
- Für die 1'882 Knoten in Zermatt braucht das vier Anfragen mit bis zu 512 Orten, zusammen etwa eine Zehntelsekunde.
- Jeder Knoten ist eine Höhenabfrage aus Ihrem Monatskontingent: Der kostenlose Tarif hat 1 Million im Monat, der Tarif Elevation 50 Millionen für $7 im Monat.
batch_sizedarf im kostenlosen Tarif bis 1'000 gehen. 512 ist ein sicherer Standardwert und hält die URLs kurz.- Die Höhen stammen aus dem Copernicus-Höhenmodell mit 90 m Auflösung. Das passt für Steigungen über Strassenabschnitte und längere Wege. Bei sehr kurzen Kanten ergeben wenige Meter Unterschied zwischen Rasterzellen grosse Steigungen: In Zermatt kommt eine Kante von 13 m auf 102%. Filtern Sie wie oben nach
length, bevor Sie die steilste Strasse suchen.
OSMnx hat auch add_node_elevations_raster() für lokale GeoTIFF-Dateien. Das kommt ohne API aus, aber Sie müssen die Kacheln für Ihr Gebiet zuerst finden, herunterladen und zusammenfügen.
Weitere nützliche Einstellungen
ox.settings.requests_timeout(Standard 180 s) setzt auch den[timeout:…]der Abfragen. Auf overpass.ch wird ein Wert über dem Maximum des Tarifs auf dieses gesenkt.ox.settings.use_cache = True(der Standard) speichert Antworten in./cache. Wiederholte Läufe kosten dann keine Anfragen.- Trotzdem Fehler? Siehe Fehler der Overpass API erklärt.