Routen-Vorschau: echtes Karten-PNG (Basemap+Route) statt nackter SVG-Form

In der Routenliste fehlte der geografische Kontext — man sah nur die Routen-
form auf grünem Grund, nicht WO sie liegt oder wo sie entlangführt.

Lösung: UI.map.snapshot() rendert pro Track ein PNG aus EINEM geteilten
Offscreen-GL-Kontext (gleicher Style wie die echte Karte: Straßen, Orte,
Wald, Gewässer), zeichnet Route + Start/Ziel-Marker ein und cached das
Ergebnis. So bekommt jede Karte ihren Kontext, ohne bei vielen Listen-
einträgen das WebGL-Kontextlimit (iOS ~8) zu sprengen.

- ui.js: Offscreen-Singleton + serielle Render-Queue + Cache (_glSnapshot)
- routes.js: _buildMiniMap zeigt sofort SVG, upgradet dann aufs PNG
- GL aus → null → SVG-Platzhalter bleibt (Produktion/Flag aus unverändert)
This commit is contained in:
rene 2026-06-05 13:57:47 +02:00
parent a0d16ba800
commit 1defeec537
7 changed files with 115 additions and 18 deletions

View file

@ -1566,11 +1566,21 @@ window.Page_routes = (() => {
init();
}
// Mini-Vorschau: SVG-Routenform (keine eigene Karte → kein WebGL-Kontext-Limit bei vielen
// Listeneinträgen, kein OSM-Raster). Die Detail-/Navigations-Karten sind voll GL.
// Mini-Vorschau: zuerst sofort die SVG-Routenform (kein Warten), dann — sobald
// gerendert — auf ein echtes Karten-PNG (Basemap + Route) upgraden. Das PNG kommt
// aus EINEM geteilten Offscreen-GL-Kontext (UI.map.snapshot, mit Cache), damit viele
// Listeneinträge nicht das WebGL-Kontextlimit sprengen. Ist GL aus → SVG bleibt.
function _buildMiniMap(el) {
const track = JSON.parse(el.dataset.track || '[]');
el.innerHTML = _svgPreview(track);
if (track.length < 2 || !UI.map.snapshot) return;
UI.map.snapshot(track, { key: 'r' + (el.dataset.id || '') }).then(url => {
if (!url || !el.isConnected) return; // GL aus/Fehler → SVG-Platzhalter bleibt
el.style.backgroundImage = `url("${url}")`;
el.style.backgroundSize = 'cover';
el.style.backgroundPosition = 'center';
el.innerHTML = ''; // SVG-Platzhalter entfernen (PNG enthält die Route)
}).catch(() => {});
}
// ----------------------------------------------------------