ADR-009 — Serving-Schicht: Modularer Ansatz¶
Status: ✅ Entschieden (Ansatz) · 🔄 teilweise offen (Komponentenwahl)
Kontext¶
Verschiedene Konsumenten benötigen verschiedene Zugriffsarten. Ein einzelner Serving-Dienst kann diese Anforderungen nicht optimal erfüllen.
Entscheidung¶
Modulare Serving-Schicht mit spezialisierten Komponenten je Zugriffsart — keine monolithische Serving-Lösung.
| Zugriffsart | Empfohlene Komponente | Status |
|---|---|---|
| Analytisches SQL | DuckDB (lokal) / Athena-kompatible Engine | ✅ |
| OGC API — Tiles | Martin (PMTiles) | ✅ |
| OGC API — Features | TiPG (DevelopmentSeed) | ✅ |
| Legacy WMS / WFS | (ggf. Shim für legacy GIS systems, sonst entfällt) | ⏳ |
| Vektorkacheln (MVT) | Martin | ✅ |
| Raster / COG-Tiles | TiTiler | ✅ |
| Punktwolken (3D) | deck.gl + 3D Tiles (py3dtiles) | ✅ |
| STAC-API | stac-fastapi | ✅ |
| Programmatische API | REST-API über Objektspeicher-Direktzugriff | ⏳ |
Update — 2026-04-25 — Modernisierung der OGC-Strategie¶
GeoServer und MapServer sind beide aus den frühen 2000ern. Wir wechseln auf den modernen OGC-API-Stack:
- WMS → OGC API – Tiles (Martin liefert beides aus einer Quelle)
- WFS → OGC API – Features (TiPG / pygeoapi, geplant für die nächste Iteration)
- WMTS → OGC API – Tiles
Entscheidungen getroffen:
- Vektorkacheln + OGC API – Tiles: Martin (Rust, MapLibre-Org, multi-arch, performant). Liest PMTiles direkt; ein Prefect-getriggertes Tippecanoe-Pipeline produziert PMTiles aus GeoParquet in
s3://curated/tiles/. - Tile-Format: PMTiles (Protomaps) — single-file, HTTP-Range-Request-fähig, zukunftssicherer als MBTiles. Martin lädt PMTiles aus RustFS via initContainer-Mirror in
/tiles(Workaround für Martin v1.6, da derendpoint-Knopf für RustFS-style S3 nicht öffentlich konfigurierbar ist; sobald Martin den Patch akzeptiert oder ein S3-Sidecar-Pattern eingeführt wird, fällt das Mirror-Stage weg). - OGC API – Features: TiPG empfohlen (DevelopmentSeed, FastAPI, gleiche Familie wie unser stac-fastapi + TiTiler). Deployment in der nächsten Iteration zusammen mit dem PostGIS-Promotion-Flow aus
processed/GeoParquet. - GeoServer und MapServer: verworfen. Beide bleiben als Optionen für eine Phase-3 Legacy-Shim, falls legacy GIS systems oder ein anderer Konsument zwingend WMS 1.3.0 in XML braucht. Default-Pfad ist OGC API.
Update — 2026-04-25 — Punktwolken-Serving¶
Martin und TiTiler decken 2D-Vektor und Raster ab. Punktwolken (LAS/LAZ/COPC) brauchen einen anderen Container — sie lassen sich nicht sinnvoll als MVT oder Raster-Tile ausliefern.
Entscheidung:
- PoC-Tier: deck.gl +
@loaders.gl/lasliest COPC LAZ direkt aus RustFS via HTTP-Range-Request. Kein zusätzlicher Server. Demo-Viewer:docs/viewer/pointcloud.html. Limit: ~10⁷ Punkte, hängt am Browser-Speicher. - Production-Tier: 3D Tiles Tilesets (
tileset.json+.pntsChunks). Ein Prefect-getriggerter Job (dashi/py3dtiles:dev, siehepoc/py3dtiles/) konvertiert COPC → 3D Tiles und schreibt nachs3://curated/3dtiles/<item_id>/. Konsumiert vondeck.gl Tile3DLayer, CesiumJS oder iTowns — gleiche Operations-Story wie PMTiles. - STAC-Integration: Punktwolken-Items bekommen
assets.viewer3d(direkter COPC-Link) und nach 3D-Tiles-Generierung zusätzlichassets.tileset3dmitmedia_type: application/jsonundroles: ["visualization", "3d-tiles"]. - Verworfen: Potree (eigenes Octree-Format, redundant mit COPC), Entwine/Greyhound (deprecated).
Offene Entscheidungen¶
- OGC API – Features Backend: TiPG vs. pygeoapi — Entscheidung mit Phase-2 K-Strang (Domain-Onboarding) wenn der erste Nicht-Tile-Konsument die Anforderung präzisiert.
- Programmatische API: Design und Framework-Wahl ausstehend.
- Legacy-WMS-Shim: nur falls ein legacy GIS systems-Equivalent Phase-3 zwingt; aktuell offen.
Konsequenzen¶
- Höhere Komplexität im Betrieb durch mehrere Komponenten
- Jede Komponente kann unabhängig skaliert und ausgetauscht werden
- Klare Zuordnung: jeder Zugriffstyp hat genau eine verantwortliche Komponente