Beispiel für eine Overpass-Abfrage

Höhenprofil einer Wanderroute

Distanz, Aufstieg und Abstieg einer Wanderroute aus OpenStreetMap, mit ihrem Höhenprofil. Beispiel: der Matterhorn Trail in Zermatt.

Wanderrouten sind Relationen mit dem Tag route=hiking, die die Wege einer Route zusammenfassen. Zu einer Linie zusammengefügt und an den Endpunkt für Höhenprofile geschickt, ergeben sie Distanz, Aufstieg und Abstieg und ein Profil zum Zeichnen.

Der Matterhorn Trail führt vom Schwarzsee am Fuss des Matterhorns hinunter nach Furi oberhalb von Zermatt.

Die Abfrage

[out:json][timeout:25];
rel["route"="hiking"]["name"="Matterhorn-Trail"](45.95,7.65,46.05,7.80);
out geom;

Ausführen

Die Abfrage läuft…

Live-Ergebnis von overpass.ch, bis zu 12 Stunden zwischengespeichert. Kartendaten © OpenStreetMap-Mitwirkende (ODbL). Heights produced using Copernicus WorldDEM™-90 © DLR e.V. 2010-2014 and © Airbus Defence and Space GmbH 2014-2018 provided under COPERNICUS by the European Union and ESA; all rights reserved. Meerestiefen: GEBCO Compilation Group (2026) GEBCO 2026 Grid.

So funktioniert es

  1. Der Begrenzungsrahmen macht den Namen eindeutig: Viele Routen haben denselben Namen.
  2. out geom; liefert die Relation mit der Geometrie jedes Wegs.
  3. Fügen Sie die Mitglieder mit leerer Rolle, forward oder backward der Reihe nach zusammen. Lassen Sie Mitglieder alternative und excursion weg; das sind Abstecher.
  4. Der Profil-Endpunkt setzt alle 90 m einen Messpunkt und zählt Aufstieg und Abstieg zusammen. In diesen Daten ist die Route etwa 7,3 km lang und fällt etwa 750 m, vom Schwarzsee auf etwa 2'580 m nach Furi auf etwa 1'860 m.

Varianten

  • Das Zusammenfügen funktioniert nur, wenn die Mitglieder entlang der Route der Reihe nach aufgeführt sind. Bei manchen Relationen ist das nicht so: Prüfen Sie, ob die zusammengefügte Linie etwa so lang ist wie alle Ways zusammen, oder sortieren Sie die Ways zuerst nach ihren gemeinsamen Endpunkten.
  • Aufstieg und Abstieg übergehen Änderungen unter 2 m, um Rauschen herauszufiltern. Ein 90-m-Raster glättet auch kurze Auf und Ab; auf einem gewundenen Weg ist der wirkliche Aufstieg also etwas grösser.
  • Finden Sie zuerst die Routen eines Gebiets: Wanderrouten in einer Region listet sie mit ihren Namen auf. Wählen Sie dann eine nach Namen oder nach ihrer ID: rel(19448726); out geom;.

Aus Ihrem Code ausführen

Zwei Anfragen: Die Abfrage liefert die Route, und ihre zusammengesetzte Geometrie geht an /elevation/profile.

import math
import requests

API = "https://api.overpass.ch/v1/IHR_API_SCHLÜSSEL"
query = open("query.overpassql").read()
r = requests.post(f"{API}/interpreter", data={"data": query}, timeout=120)
r.raise_for_status()
route = r.json()["elements"][0]

def gap(a, b):  # Abstand in Grad, genügt zum Vergleichen
    return math.hypot(a[0] - b[0], (a[1] - b[1]) * math.cos(math.radians(a[0])))

ways = [[[p["lat"], p["lon"]] for p in m["geometry"]] for m in route["members"]
        if m["type"] == "way" and m["role"] in ("", "forward", "backward")]
path = list(ways[0])
for i, way in enumerate(ways[1:]):
    near = lambda p: min(gap(p, way[0]), gap(p, way[-1]))
    if i == 0 and near(path[0]) < near(path[-1]):
        path.reverse()      # der erste Weg zeigt rückwärts
    if gap(path[-1], way[-1]) < gap(path[-1], way[0]):
        way = way[::-1]     # dieser auch
    path += way

r = requests.post(f"{API}/elevation/profile", json={"path": path}, timeout=60)
r.raise_for_status()
answer = r.json()
print(answer["profile"])    # distance_m, ascent_m, descent_m, min_m, max_m, …
for p in answer["results"][:5]:
    print(p["distance"], p["elevation"])

Speichern Sie die Abfrage als query.overpassql. Sie funktioniert genauso in Overpass Turbo, QGIS und JOSM.

Weitere Beispiele

Alle Beispiele →