Anleitung

Höhen zu einer GPX-Datei hinzufügen

Routen, die in einem Planer gezeichnet wurden, haben oft keine Höhen, und GPS-Höhen sind ungenau. Eine Höhen-API ergänzt jeden Punkt aus einem Geländemodell. Distanz, Aufstieg und Abstieg erhalten Sie mit einem curl-Befehl, oder Sie schreiben die Höhen mit einem kurzen Python-Skript in die Datei.

Für Distanz, Aufstieg und Abstieg schicken Sie die Datei an den Profil-Endpunkt:
curl https://api.overpass.ch/v1/IHR_API_SCHLÜSSEL/elevation/profile --data-binary @track.gpx
Für eine GPX-Datei mit einem <ele> in jedem Punkt verwenden Sie das Skript unten.

Distanz, Aufstieg und Abstieg mit curl

/elevation/profile liest den Track einer GPX-Datei (oder ihre Route oder ihre Wegpunkte, wenn sie keinen Track hat), setzt alle 90 m einen Messpunkt und antwortet mit einer Zusammenfassung und den Höhen entlang des Wegs. Für den Matterhorn Trail vom Schwarzsee nach Furi:

"profile": { "distance_m": 7261.2, "ascent_m": 29.8, "descent_m": 745.5,
             "min_m": 1862.5, "max_m": 2579.5, "samples": 82, "interval_m": 89.6 },
"results": [
  { "elevation": 2579.5, "location": { "lat": 45.9910109, "lng": 7.7097862 }, "distance": 0, … },
  { "elevation": 2572.2, "location": { "lat": 45.9909652, "lng": 7.7086596 }, "distance": 90, … },
  …
  • Die Messpunkte sind, was Sie zum Zeichnen eines Profils brauchen: distance auf der x-Achse, elevation auf der y-Achse.
  • Jeder Messpunkt ist eine Höhenabfrage, hier 82. Mit ?interval= (Meter, mindestens 10) oder ?samples= ändern Sie den Abstand.
  • Aufstieg und Abstieg übergehen Änderungen unter 2 m, um das Rauschen in den Daten herauszufiltern.

Die Höhen in die GPX-Datei schreiben

Dieses Skript liest die Datei mit gpxpy, fragt jede Position von Tracks, Routen und Wegpunkten ab und schreibt eine neue Datei mit einem <ele> für jeden Punkt:

import os
import sys

import gpxpy
import requests

URL = f"https://api.overpass.ch/v1/{os.environ['OVERPASS_CH_KEY']}/elevation"
BATCH = 1000   # Orte pro Anfrage: 1'000 im kostenlosen Tarif, 10'000 in den bezahlten

with open(sys.argv[1]) as f:
    gpx = gpxpy.parse(f)

points = [p for t in gpx.tracks for s in t.segments for p in s.points]
points += [p for r in gpx.routes for p in r.points] + gpx.waypoints

for i in range(0, len(points), BATCH):
    batch = points[i:i + BATCH]
    r = requests.post(URL, json={"locations": [[p.latitude, p.longitude] for p in batch]}, timeout=60)
    r.raise_for_status()
    for p, res in zip(batch, r.json()["results"]):
        p.elevation = res["elevation"]

with open(sys.argv[2], "w") as f:
    f.write(gpx.to_xml())
print(f"{len(points)} Punkte mit Höhen")
pip install gpxpy requests
OVERPASS_CH_KEY=IHR_API_SCHLÜSSEL python add_elevation.py track.gpx track-mit-ele.gpx
  • Jeder Punkt ist eine Höhenabfrage. Ein Track, der auf einer vierstündigen Wanderung jede Sekunde aufgezeichnet wurde, hat etwa 14'400 Punkte; der kostenlose Tarif enthält 1 Million Höhenabfragen im Monat.
  • Vorhandene Höhen werden überschrieben. Um sie zu behalten, überspringen Sie Punkte, bei denen p.elevation schon gesetzt ist.
  • Die Antwort behält die Reihenfolge der Anfrage, die Ergebnisse passen also zu den Punkten.

GPS-Höhen oder Geländehöhen?

  • GPS-Höhen sind ungenauer als GPS-Positionen, oft 10 m oder mehr daneben, und sie springen, was den gesamten Aufstieg aufbläht. Barometrische Höhenmesser sind ruhiger, driften aber mit dem Wetter.
  • Geländehöhen aus einem Höhenmodell sind einheitlich und brauchen kein Gerät, deshalb passen sie zu geplanten Routen. Diese API verwendet das Copernicus-Modell mit 90 m Auflösung: Dörfer, Täler und Wege liegen meist wenige Meter daneben, aber Gipfel und schmale Grate erscheinen zu tief, und kurze Auf und Ab werden geglättet. Auf ruppigen Wegen ist der wirkliche Aufstieg deshalb etwas grösser.
  • Für Zusammenfassungen vieler Tracks machen Geländehöhen die Zahlen vergleichbar, weil jeder Track auf dieselbe Weise gemessen wird.

Mehr über die Daten und ihre Genauigkeit steht auf der Seite Höhen-API. Wie Sie Profile aus Routen von OpenStreetMap statt aus GPX-Dateien erstellen, zeigt das Beispiel zum Profil einer Wanderroute.