---
operation_id: list_terrain_mesh_datasets
method: GET
path: /v1/terrain-mesh/datasets
summary: 3D-Tiles-Mesh-Tilesets für DGM1 (b3dm + Draco)
tags: [terrain-mesh]
stability: beta
since_version: 0.1.0
auth: none
data_product: terrain-mesh
snapshot_aware: true
attribution_block: false
rate_limit_tier: public
related:
  - /v1/terrain/datasets
  - /v1/tilesets
---
# `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

```bash
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

```ts
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

```ts
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`.

```json
{
  "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`](./list-terrain-datasets.md) — Raster-COG-Variante.
- [`GET /v1/tilesets`](./list-tilesets-bbox.md) — LoD2-Buildings-3D-Tiles.