GET /v1/terrain/elevation

Geländehöhe an einem WGS84-Punkt aus DGM1

stable seit v0.1.0 terrain auth: none

GET /v1/terrain/elevation — Punktabfrage Geländehöhe

Liefert die Geländehöhe (DHHN2016, m über NHN) an einem WGS84-Punkt. Die API routet die Anfrage über einen PostGIS-Spatial-Index auf den zuständigen DGM1-Tile und sampelt das Pixel via GDAL/rasterio mit HTTP-Range-Request auf dem Cloud-Optimized GeoTIFF. Kein Bundesland ist hartcodiert — Punkte überall in Deutschland funktionieren, sofern Lodapi den DGM1-Layer für die zuständige Region ingested hat.

Wann verwenden

Wenn du viele Punkte entlang einer Linie sampeln willst → /v1/terrain/profile. Wenn du eine Fläche als Mesh brauchst → /v1/terrain-mesh/datasets (3D-Tiles-Mesh-Tilesets).

Examples

curl — Brandenburger Tor

curl -s 'https://api.lodapi.de/v1/terrain/elevation?lat=52.5163&lon=13.3777' | jq
{
  "elevation_m": 34.95,
  "datum": "DHHN2016",
  "source_bl": "bb",
  "snapshot": "2025-12-18",
  "license": "dl-de-zero-2.0",
  "attribution": "© SenStadt Berlin (DL-DE/Zero 2.0)",
  "tile_id": "bb_33_388_5818"
}

Python — Adresse → Höhe

import httpx

def elevation_at(lat: float, lon: float) -> float | None:
    r = httpx.get(
        "https://api.lodapi.de/v1/terrain/elevation",
        params={"lat": lat, "lon": lon},
    )
    if r.status_code == 404:
        return None  # außerhalb der Coverage oder NoData (Wasserfläche)
    r.raise_for_status()
    return r.json()["elevation_m"]

print(elevation_at(52.5163, 13.3777))  # → 34.95

TypeScript — Cesium-Integration

async function clampToGround(lon: number, lat: number) {
  const url = new URL("https://api.lodapi.de/v1/terrain/elevation");
  url.searchParams.set("lat", String(lat));
  url.searchParams.set("lon", String(lon));
  const r = await fetch(url);
  if (r.status === 404) return null;
  const { elevation_m } = await r.json();
  return Cesium.Cartesian3.fromDegrees(lon, lat, elevation_m);
}

Parameters

ParameterInTypeRequiredDefaultRangeBeschreibung
latqueryfloatyes−90..90WGS84-Breite (Grad)
lonqueryfloatyes−180..180WGS84-Länge (Grad)
srsquerystringnoEPSG:4326Räumlicher Bezug. Aktuell nur EPSG:4326.

Response

200 OK · application/json — Schema-Quelle openapi.json (#/components/schemas/ElevationResponse).

Felder:

FeldBeschreibung
elevation_mHöhe in Metern, DHHN2016, gerundet auf 3 Nachkommastellen
datumVertikales Datum (immer DHHN2016 in Phase 1)
source_bl2-Buchstaben-BL-Code des zuständigen Tile
snapshotSnapshot-Datum des DGM1-Quelldatensatzes (ISO 8601)
licenseLizenz-ID (dl-de-zero-2.0, cc-by-4.0, dl-de-by-2.0)
attributionPflicht-Attribution-String für UI-Anzeige
tile_idEindeutige Tile-Kennung (Cache-Key oder Audit-Pfad)

Fehler

StatusBedeutungBedingung
422Unprocessable Entitylat/lon außerhalb Range, srs nicht EPSG:4326 (FastAPI/Pydantic-Validation)
404Not Found, kein TilePunkt außerhalb aller ingested Terrain-Coverages
404Not Found, NoDataTile gefunden, aber Pixel ist NoData (Wasser, Tile-Rand)
502Bad GatewayCOG-Quelle nicht erreichbar (Pass-Through-Modus auf Behörden-Server)
503Service Unavailablerasterio nicht installiert (deploy issue)

Alle Fehler sind im RFC-7807-Format (application/problem+json).

Stolperdrähte

Live-Coverage

Stand 2026-06: alle 16 Bundesländer (16/16) via /v1/terrain/elevation. Aktuelles Inventar via /v1/terrain/datasets.

Verwandte Endpoints

Verwandt

Bereit?

Hol dir deinen API-Key.

1.000 Calls und 1 GB Tile-Daten kostenlos pro Monat — ohne Kreditkarte, ohne Ablaufdatum.