Open-Elevation und Open Topo Data: Limits und Alternativen
Open-Elevation und Open Topo Data sind Höhen-APIs mit offenem Quellcode, und beide betreiben einen öffentlichen Server, den Sie ohne Einrichtung ausprobieren können.
Open Topo Data
Open Topo Data ist ein Server für Höhendatensätze unter der MIT-Lizenz. Seine öffentliche API unter api.opentopodata.org ist kostenlos, mit diesen Limits:
- höchstens 100 Orte pro Anfrage,
- höchstens eine Anfrage pro Sekunde,
- höchstens 1'000 Anfragen pro Tag.
Das sind für ein Skript, das gut bündelt, bis 100'000 Orte am Tag, für eine App aber nur 1'000 Abfragen einzelner Punkte. Die Dokumentation beschreibt die öffentliche API als zum Testen verfügbar, ohne Garantie für den Dienst; das Projekt finanziert sich über bezahltes Hosting. Es bietet viele Datensätze, von 8 m in Neuseeland bis SRTM, ASTER und EU-DEM, die Sie in der URL wählen: /v1/srtm90m?locations=….
Open-Elevation
Open-Elevation ist ein Abfrageserver unter der GPL mit einer öffentlichen API unter api.open-elevation.com. Seine aktuellen Tarife laut Website im Oktober 2026:
- ohne Schlüssel: 500 Koordinaten im Monat pro IP-Adresse, aus SRTM-Daten mit 250 m;
- kostenloser Schlüssel: 1'000 Koordinaten im Monat;
- bezahlt: EUR 5.99 für 3'000, EUR 14.99 für 100'000 und EUR 59.99 für 400'000 Koordinaten im Monat, mit 90-m-Daten.
Seine Daten sind SRTM von der NASA, die die Erde zwischen 60° Nord und 56° Süd abdecken. Nordskandinavien, der grösste Teil Alaskas und die Antarktis liegen ausserhalb. Für Punkte ohne Daten lautet die Antwort Höhe 0 ohne Datensatz; prüfen Sie also das Feld dataset, bevor Sie einer Null trauen.
Ein eigener Server
Beide Projekte sind Open Source und laufen in Docker. Was es braucht:
- Daten. Die Höhenkacheln laden Sie selbst herunter. Für ein Land brauchen SRTM- oder Copernicus-Kacheln einige Gigabyte. Unser weltweiter Bestand, Copernicus GLO-90 (26'475 Kacheln) und das GEBCO-Raster für die Ozeane, hat 54 GB.
- Einen Server mit schnellem Speicher; Abfragen sind günstig, eine kleine Maschine bewältigt also viel Verkehr.
- Betrieb: Updates, Überwachung, Backups, TLS und eine Zugangskontrolle, wenn er aus dem Internet erreichbar ist.
Das lohnt sich, wenn Sie einen besonderen Datensatz brauchen (Lidar mit 1 m, ein nationales Modell) oder die Abfragen in Ihrem eigenen Netz bleiben müssen. Für weltweite 90-m-Daten ist es meist mehr Aufwand, als es wert ist.
Eine gehostete Alternative mit demselben Format
Die Höhen-API von overpass.ch antwortet im Format von Open Topo Data und der Google Elevation API, weltweit an Land und im Meer:
| Orte pro Anfrage | Anfragen pro Minute | Höhenabfragen pro Monat | Preis | |
|---|---|---|---|---|
| Kostenloser Tarif | 1'000 | 30 | 1 Million | kostenlos |
| Tarif Elevation | 10'000 | 120 | 50 Millionen | CHF 5 im Monat |
Die Höhen an Land stammen aus Copernicus GLO-90, einem 90-m-Raster, das die ganze Erde abdeckt, mit der Antarktis und dem hohen Norden. Im Meer ist die Antwort die Tiefe aus GEBCO. Auch jeder Overpass-Tarif enthält Höhenabfragen; siehe die Preise.
Ihren Code umstellen
Von Open Topo Data
Lassen Sie den Datensatz im Pfad weg, und setzen Sie Ihren Schlüssel ein. locations (mit enc:-Polylinien) und samples funktionieren gleich, und die Antwort hat dasselbe Format:
https://api.opentopodata.org/v1/srtm90m?locations=46.0207,7.7491
→ https://api.overpass.ch/v1/IHR_API_SCHLÜSSEL/elevation?locations=46.0207,7.7491
Einen Datensatz wählen Sie nicht: An Land antwortet Copernicus, im Meer GEBCO, und dataset sagt in jedem Ergebnis, welcher. Die Höhen werden immer bilinear interpoliert, der Standard bei Open Topo Data, und fehlende Daten sind null. Eine Ausgabe als GeoJSON (format=geojson) gibt es nicht.
Von Open-Elevation
Open-Elevation verwendet latitude und longitude; hier sind die Punkte Paare [lat, lon] oder Objekte mit lat und lon, und die Ergebnisse haben location.lat und location.lng:
import requests
points = [{"latitude": 46.0207, "longitude": 7.7491}, {"latitude": 69.65, "longitude": 18.96}]
r = requests.post("https://api.overpass.ch/v1/IHR_API_SCHLÜSSEL/elevation",
json={"locations": [[p["latitude"], p["longitude"]] for p in points]}, timeout=30)
r.raise_for_status()
results = [{"latitude": res["location"]["lat"], "longitude": res["location"]["lng"],
"elevation": res["elevation"]} for res in r.json()["results"]]
print(results)
Der zweite Punkt ist Tromsø auf 69,65° Nord: ausserhalb von SRTM, aber von Copernicus abgedeckt.