Projekt

Allgemein

Profil

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 

Zurück