PENDENZEN.md: swissBUILDINGS3D-Recherche dokumentieren (STAC-API, Rhino-Referenz, render3d-Zielarchitektur)

This commit is contained in:
2026-07-12 16:46:42 +02:00
parent 7c3a6f3f35
commit 61313777da
+8 -2
View File
@@ -104,11 +104,17 @@
- [x] ~~**Ebene-Schraffur editierbar**~~**gelandet `dcb6ed5`**: Kategorie-Dialog (`App.tsx`, `editor.hatch`-Feld) hat `<select>` auf `cat.hatch` + `HatchSwatch`-Vorschau. Verifiziert vorhanden. - [x] ~~**Ebene-Schraffur editierbar**~~**gelandet `dcb6ed5`**: Kategorie-Dialog (`App.tsx`, `editor.hatch`-Feld) hat `<select>` auf `cat.hatch` + `HatchSwatch`-Vorschau. Verifiziert vorhanden.
- [ ] **GEO-BLOCK** (gemeinsame Dateien io/geoContext/swissTopo/terrain/ContextImportDialog/Viewport3D/siteSlice): - [ ] **GEO-BLOCK** (gemeinsame Dateien io/geoContext/swissTopo/terrain/ContextImportDialog/Viewport3D/siteSlice):
-**Research 2026-07-12 (Nutzer-Report „swissbuildings-Import stark vereinfacht, will 1:1 mit Höhe/Dach"):** Root Cause gefunden — `swissTopo.ts::fetchBuildings` nutzt `ch.swisstopo.vec25-gebaeude` (generalisierter **1:25'000-Kartografie-Layer**, NUR Grundriss, KEINE Höhe); `geoContext.ts::buildingsToMesh` extrudiert jeden Footprint pauschal mit `DEFAULT_BUILDING_HEIGHT=9` als flache Kiste. **Fix-Bausteine bereits im Repo vorhanden:**
- Echte Quelle: **STAC-API** `https://data.geo.admin.ch/api/stac/v1` (offen, kein Auth/Key) mit ZWEI echten Collections — `ch.swisstopo.swissbuildings3d_2` (stabil, 1-km-Tiles, ~50 MB) und `ch.swisstopo.swissbuildings3d_3_0` (Beta, Solid/Separated-Varianten, in Städten aber teils >700 MB/Tile, nicht 1-km-strukturiert). Assets als DXF/DWG/OBJ/IFC (teils `.zip`).
- **Vollständige Referenzimplementierung** im Rhino-Vorgänger-Plugin: `git.kgva.ch/karim/DOSSIER`, Datei `rhino/swisstopo.py` (STAC-Query, bbox LV95↔WGS84, Tile-Dedupe nach Jahr, Asset-Prio DXF/DWG>OBJ>IFC, v3→v2-Auto-Fallback bei leeren/zu grossen v3-Tiles, ZIP-Entpacken) — 1:1 als Blaupause für einen TS-Port nutzbar. Enthält auch Terrain (`swissalti3d`, GeoTIFF/XYZ→Grid→Mesh) und Orthofoto-Draping (`swissimage-dop10`), relevant für die zwei Punkte darunter.
- **Kein neuer Parser nötig:** `src/io/dxfParser.ts` kann `3DFACE`/`MESH`/Polyface-`POLYLINE`-Entities bereits verlustfrei zu `ImportedMesh` (positions/indices, echtes Z) parsen — genau das Format der swissBUILDINGS3D-DXF-Kacheln (Wände+Dachflächen als 3D-Mesh). Downloadete Kachel-DXF einfach durch `parseDxf()` schicken.
- **Nutzer-Entscheid 2026-07-12:** BEIDE Versionen (2.0 UND 3.0) als Wahlmöglichkeit anbieten (Collection-Parameter durchreichen, v3→v2-Fallback wie im Rhino-Plugin).
- **Ziel-Pipeline: render3d, NICHT Three.js** (Nutzer-Entscheid 2026-07-12: „scheiss auf three.js darstellung render3d ist fokus" — Three.js/`Viewport3D.tsx` ist nur Fallback ohne WASM/WebGPU, bekommt keine neuen Features mehr; sobald Terrain+Kontext über `projectToModel3d` laufen, ist Three.js komplett verzichtbar — Browser ohne WASM wäre dann reines 2D-CAD, akzeptiert). Das ist zugleich der Grund für den nächsten Punkt (Nordstern-Geo-Rendering wird damit zur Voraussetzung, nicht nur "nice to have").
- Reale Höhen + **Projekt-MüM** (EG-Referenzhöhe): Terrain georeferenziert bei realem z relativ dazu, Gebäude auf Terrain drapiert (heute alles z=0). - Reale Höhen + **Projekt-MüM** (EG-Referenzhöhe): Terrain georeferenziert bei realem z relativ dazu, Gebäude auf Terrain drapiert (heute alles z=0).
- **Luftbild/SWISSIMAGE**-Orthofoto als Textur aufs Terrain-Mesh. - **Luftbild/SWISSIMAGE**-Orthofoto als Textur aufs Terrain-Mesh.
- Importierte Geo-Elemente auf **aktives Geschoss** (`viewSlice.activeLevelId`) + Gelände-Ebene. - Importierte Geo-Elemente auf **aktives Geschoss** (`viewSlice.activeLevelId`) + Gelände-Ebene.
- **Nordstern-Geo-Rendering:** importierte Meshes (heute nur three.js `importedMesh`/`terrainMesh`) auch in `projectToModel3d` einspeisen. - **Nordstern-Geo-Rendering:** importierte Meshes (heute nur three.js `importedMesh`/`terrainMesh`) auch in `projectToModel3d` einspeisen — jetzt Voraussetzung für swissBUILDINGS3D-Fix oben, nicht mehr optional.
- **3D-Mesh-DXF/DWG-Import** (heute DXF nur 2D); Building-Draping; höhere DTM-Auflösung. - **3D-Mesh-DXF/DWG-Import** (heute DXF nur 2D bei manuellem Import — der Mesh-Pfad selbst ist über `dxfParser.ts` schon 3D-fähig, s. o.); Building-Draping; höhere DTM-Auflösung.
- [x] ~~**ResourceManager Bauteile-Tab** auf Master-Detail~~**bereits Master-Detail** (`ComponentsTab`/`ComponentDetail` in `src/ui/ResourceManager.tsx`, Liste links `res-md-list` / Detail rechts). Verifiziert vorhanden. - [x] ~~**ResourceManager Bauteile-Tab** auf Master-Detail~~**bereits Master-Detail** (`ComponentsTab`/`ComponentDetail` in `src/ui/ResourceManager.tsx`, Liste links `res-md-list` / Detail rechts). Verifiziert vorhanden.
- [x] ~~**Einstellungs-Fenster (Rest)**~~**erledigt:** Verdrahtung war schon **da** (`viewSlice.snapColor`/`marqueeColor` → PlanView `SnapMarker`/Marquee, Defaults aus `theme/accents.ts`, Projekt-MüM-Feld `referenceElevationMasl`); der einzig offene Punkt (Snap/Endpunkt-Default „aki") ist längst entschieden (2026-07-04: Sora #5FA1C9, s. „❓ Offene Rückfragen"). Zeile war stehen geblieben, obwohl die Frage schon geschlossen war. - [x] ~~**Einstellungs-Fenster (Rest)**~~**erledigt:** Verdrahtung war schon **da** (`viewSlice.snapColor`/`marqueeColor` → PlanView `SnapMarker`/Marquee, Defaults aus `theme/accents.ts`, Projekt-MüM-Feld `referenceElevationMasl`); der einzig offene Punkt (Snap/Endpunkt-Default „aki") ist längst entschieden (2026-07-04: Sora #5FA1C9, s. „❓ Offene Rückfragen"). Zeile war stehen geblieben, obwohl die Frage schon geschlossen war.
- [ ] **Bildschraffur:** ambientCG/CGI-Colorfiles als Quelle (Material-Lib WIP — erst nach Freigabe); Bild-Filter Sättigung/Helligkeit/Kontrast/SW (`image.filters`). - [ ] **Bildschraffur:** ambientCG/CGI-Colorfiles als Quelle (Material-Lib WIP — erst nach Freigabe); Bild-Filter Sättigung/Helligkeit/Kontrast/SW (`image.filters`).