Feature #51
Von Julius Haman vor 10 Tagen aktualisiert
## Überblick Strava-artige 3D-Kartenansicht für topographische Trainings: Schwenken, Kippen und Höhenrelief direkt im Trainingsfenster und in der Profilansicht. Ersetzt die reine 2D-Karte (GMap.NET, `TopographicMapControl`) in diesen Ansichten. Trainingsfenster. Aktuell wird GMap.NET WinPresentation (reines 2D, OpenStreetMap) verwendet (TopographicMapControl). ## Vorgeschlagener Stack | Baustein | Lösung | Lizenz | |------------------|------------------------------------------|------------| |-----------------|------------------------|----------| | Renderer | MapLibre GL JS 5.24.0 (lokal gebündelt) | BSD-3 | | Einbettung Kartenmaterial | WebView2 (`TrackMapControl`, `Maps/map.html`) | - | | Standardkarte | OpenStreetMap | ODbL | | Topografiekarte | OpenTopoMap | CC-BY-SA | | Satellitenkarte | Esri World Imagery (0,3-1 m, Zoom bis ~19) | Attribution nötig, für kommerzielle Nutzung Esri-Bedingungen prüfen | | Höhentopographie | Höhentopographie| AWS Terrain-Tiles (Terrarium, DEM) | Public Domain PD/ODbL | Kein **Kosten:** 0 € (kein API-Key, keine Nutzungsgebühren. Die Kacheln werden online geladen; ein lokaler Cache bzw. Self-Hosting der DEM-Kacheln ist nicht umgesetzt. Nutzungsgebühren) **Offline:** Ja (Tiles können gecacht/self-hosted werden) **Zugang DEM:** `https://s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png` EU-Replik: `s3://elevation-tiles-prod-eu` (eu-central-1) ## Umsetzung Vorgehen (Proof-of-Concept) **Karte 1. MapLibre GL JS + CSS als lokale Assets in der Profilansicht** WPF einbinden - 3D-Geländeansicht oberhalb des Profils (nur bei topographischen Profilen): OSM-Raster, Terrain aus den AWS-Kacheln, Track 2. WebView2 in TopographicMapControl einrichten (oder separates 3D-Fenster) 3. OSM-Kartentiles als Linie Raster-Source einbinden 4. AWS Terrain-Tiles als `raster-dem`-Source mit Start-/Zielpunkt, Attribution hinter einem eingeklappten (i). Terrarium-Encoding konfigurieren - Umschalter für die Basiskarte (Standard / Satellit / Topografie) und Neigung (2D / 45° / 60°); die Wahl wird im WebView2-localStorage gemerkt. 5. `map.setTerrain({ source: "terrarium", exaggeration: 1.5 })` aktivieren - Anvisieren: Mausbewegung über dem Höhenprofil zeigt eine Hilfslinie und einen Tooltip (km, Höhe, geglättete Steigung); der zugehörige Punkt erscheint 6. Bestehenden GPX-Track (LatLonBackfill-Koordinaten) als Marker Polyline-Overlay auf der die Karte (linear zwischen den GPS-Punkten interpoliert), Klick pinnt ihn. zeichnen - Play-Button fährt das Profil automatisch in 2 Minuten ab (längere Profile schneller), Marker folgt auch in der Fahrersicht. **Fahrersicht** - Kamera kippt (Pitch 55°) auf die Strecke und folgt der 7. Aktuelle Position in Fahrtrichtung. Der Fahrer steht fest bei ca. 78 % der Bildhöhe (wie bei Google-Maps-Navigation, umgesetzt über MapLibre-Padding, bei Fenstergrößenänderung neu berechnet). Gelände in der Fahrersicht auf 0,8 abgeflacht, damit Bergkämme die Strecke nicht verdecken. - Eigener Kamera-Loop statt MapLibre-Animationen: gleichmäßig und ruckelfrei (auch bei langsamem 1-Hz-Positionsstrom), Start deterministisch und identisch in Profilübersicht und Trainingsfenster, Höhen-Anker der Kamera wird pro Bild aktualisiert. - Fahrersicht ist nicht verschiebbar, Kompass-Schaltfläche ausgeblendet, der Kurs kommt ausschließlich aus der Strecke. Profilwechsel und Profile ohne GPS werden sauber zurückgesetzt; beim Verlassen kehrt die Übersicht zur Vogelperspektive zurück. - Fahrer-Abstand (Zoom 12-16 in 0,5-Schritten) liegt als Einstellung in der Registry (`MapDriverZoom`), im Trainingsfenster per Regler oder NumPad 1/2/3 (näher / Standard 14 / weiter) steuerbar. **3D-Trainingsfenster** - Paralleles 3D-Trainingsfenster mit großer Fahrersicht und Vogelperspektive der ganzen Strecke rechts (dieselbe 3D-Karte im Übersichtsmodus); Wahl Marker animiert entlang des Fensters beim Start bzw. Fortsetzen eines Trainings. - Position der GridSplitter und Zoomstufe der linken Profilansicht (NumPad 4/6) werden Tracks bewegen (wie heute in der Registry gemerkt. GMap) **Robustheit** - Kachel-Ladefehler ("Failed to fetch", Serverlimits) werden nur mit Quelle, Kachelkoordinaten und HTTP-Status ins Log geschrieben (max. einmal je Quelle und 5 s) statt als dauerhaftes rotes Banner; echte Init- und Style-Fehler zeigen weiterhin das Banner. - MapLibre 4.7.1 warf bei schnellen Kamerawechseln mit Terrain `Cannot read properties of undefined (reading 'clearFadeHold')` (Upstream-Bug, in 5.x behoben). Deshalb Update auf 5.24.0 samt Anpassung des Höhen-Ankers an die v5-API. ## Akzeptanzkriterien - Karte zeigt 3D-Geländerelief (Berge, Täler) anstatt flacher 2D-Kacheln - Karte ist schwenkbar (Pan), rotierbar (Rotate) und kippbar (Pitch) - Bestehender Track wird korrekt angezeigt und Position läuft live entlang - Lizenzfrei: alle Quellen haben freie/Open-Source-Lizenz, kein API-Key nötig - Kein API-Key nötig; kein ToS-Risiko (kein Bing/unofficial Tile-Endpoint). Beim Satelliten gelten die Esri-Bedingungen (Attribution, Tile-Endpoint) ## Offene Fragen - GMap.NET komplett ersetzen oder 2D + 3D als Umschalter nebeneinander? - Umschalter Available (z.B. Button "3D") oder automatisch nur bei kommerzieller Nutzung prüfen). topographischen Profilen? - Self-hosted DEM-Tiles (lokaler Cache) für vollständigen Offline-Betrieb nötig? - Attribution-Konzept (Namensnennung: OpenStreetMap + AWS Terrain-Tiles/SRTM) ## Quellen - https://maplibre.org - https://registry.opendata.aws/terrain-tiles/ - https://github.com/tilezen/joerd/blob/master/docs/attribution.md