GET /v1/terrain-mesh/datasets — Terrain-Mesh-Tilesets
Discovery-Endpoint für 3D-Tiles-1.1-Mesh-Tilesets, die das DGM1-Gelände als gerendertes Mesh ausliefern (statt als Raster-COG wie /v1/terrain/*). Format: b3dm + Draco-Compressed glTF. Konsumiert direkt von Cesium, three.js (3d-tiles-renderer), Blender (3D-Tiles-Addon).
Pro BL der jüngste Snapshot. Die Tilesets selbst werden statisch von Caddy unter tiles.lodapi.de/terrain-mesh/<bl>/<snapshot>/tileset.json ausgeliefert (Reverse-Proxy auf Hetzner-Storage-Box).
Status: beta. Phase-2a-Implementierung ist Single-Level — für große BL (NRW ~35k Tiles) lädt der Renderer alle Leaves auf einmal. Multi-Level-LoD-Pyramide ist Phase 2b.
Wann verwenden
- 3D-Visualizer, die LoD2-Gebäude + Geländerelief gleichzeitig zeigen sollen.
- Blender-Workflows für Architektur-Renderings mit Topographie-Kontext.
- Three.js-Apps ohne Cesium-Terrain-Provider-Lock-in.
Für API-Punkt-Höhe ist /v1/terrain/elevation der richtige Pfad. Mesh ist Visual, Raster ist Query.
Examples
curl
curl -s https://api.lodapi.de/v1/terrain-mesh/datasets | jq '.datasets[] | {bl: .bundesland_code, url: .tileset_url, tiles: .tile_count}'
Three.js — Drop-in mit 3d-tiles-renderer
import { TilesRenderer } from "3d-tiles-renderer";
const r = await fetch("https://api.lodapi.de/v1/terrain-mesh/datasets");
const { datasets } = await r.json();
const be = datasets.find(d => d.bundesland_code === "be");
const tiles = new TilesRenderer(be.tileset_url);
tiles.setCamera(camera);
tiles.setResolutionFromRenderer(camera, renderer);
scene.add(tiles.group);
Cesium — als generisches Tileset
const r = await fetch("https://api.lodapi.de/v1/terrain-mesh/datasets");
const { datasets } = await r.json();
for (const t of datasets) {
const ts = await Cesium.Cesium3DTileset.fromUrl(t.tileset_url);
viewer.scene.primitives.add(ts);
}
Hinweis: Cesium konsumiert Mesh-Tilesets als generische 3D-Tiles, nicht als Terrain-Provider. Building-Clamping muss self-managed sein — bei LoD2 ist das aber egal, weil Z absolut aus dem CityGML kommt.
Parameters
Keine.
Response
200 OK · application/json — Schema #/components/schemas/TerrainMeshDatasetListResponse.
{
"datasets": [
{
"bundesland_code": "be",
"snapshot_date": "2025-12-18",
"tileset_url": "https://tiles.lodapi.de/terrain-mesh/be/2025-12-18/tileset.json",
"tile_count": 297,
"rtin_tolerance_m": 0.5,
"tiling_scheme": "single-level-quadtree",
"license": "dl-de-zero-2.0",
"attribution": "© SenStadt Berlin (DL-DE/Zero 2.0)",
"built_at": "2026-05-13T22:14:00Z"
}
]
}
Antwort-Header
| Header | Wert |
|---|---|
Cache-Control | public, max-age=300 |
Build-Parameter
| Feld | Bedeutung |
|---|---|
rtin_tolerance_m | Maximal-Fehler der RTIN-Approximation (typ. 0,5 m für LoD2-Default) |
tiling_scheme | aktuell single-level-quadtree (Phase 2a); Phase 2b: multi-level-quadtree |
Stolperdrähte
- Blender-3D-Tiles-Addon braucht Draco-Decoder (
KHR_draco_mesh_compression). Verifikation steht noch aus (Phase-2a-Gate). - Single-Level-Tilesets sind teuer bei großen BL — Renderer-Frustum-Culling lädt potentiell alle Leaves. Workaround: bbox-Filter auf der Client-Seite, bis Phase 2b live ist.
- CRS in den Tiles: ECEF-Koordinaten (geozentrisches Erd-System) per
B3dm.from_numpy_arrays-Transform. Standard für 3D-Tiles 1.1.
Verwandte Endpoints
GET /v1/terrain/datasets— Raster-COG-Variante.GET /v1/tilesets— LoD2-Buildings-3D-Tiles.