Offline-Karten Runde 7: 'Alles loeschen' selektiv — Standort + Routen-Korridore bleiben
Idee Rene (spart Vorladezeit + Daten): statt loeschen-und-neu-laden bleiben
- Standort-Gebiete (Regionen type 'standort')
- Korridore der gespeicherten Routen (clear({keepTracks}) aus preview_track)
- 5-km-Umkreis der aktuellen Position + Basis-Zooms 0-9
- Marker/Warnungen (p/) + Glyphs (f/)
Geloescht: manuelle Gebiete/Ausschnitte + Funkloch-Kacheln (Zonen bleiben
gemerkt, Nahe laden automatisch neu). Ohne Keep-Kandidaten: Komplett-Wipe.
Batch-Delete in einer Transaktion. Tests r7 neu, r6 angepasst, Regression gruen.
Bump v1235
This commit is contained in:
parent
94a6ce49ba
commit
29cd489287
11 changed files with 193 additions and 39 deletions
|
|
@ -39,6 +39,16 @@ window.MapOffline = (function () {
|
|||
var _put = function (k, v) { return _req(STORE, 'readwrite', function (os) { os.put(v, k); }); };
|
||||
var _del = function (k) { return _req(STORE, 'readwrite', function (os) { os.delete(k); }); };
|
||||
var _count = function () { return _req(STORE, 'readonly', function (os) { return os.count(); }); };
|
||||
// Viele Keys in EINER Transaktion löschen (einzelne _del-Transaktionen wären zu langsam).
|
||||
function _delMany(keys) {
|
||||
if (!keys.length) return Promise.resolve();
|
||||
return _open().then(function (d) { return new Promise(function (res, rej) {
|
||||
var tx = d.transaction(STORE, 'readwrite'), os = tx.objectStore(STORE);
|
||||
keys.forEach(function (k) { os.delete(k); });
|
||||
tx.oncomplete = function () { res(); };
|
||||
tx.onerror = function () { rej(tx.error); };
|
||||
}); });
|
||||
}
|
||||
var _metaGet = function (k) { return _req(META, 'readonly', function (os) { return os.get(k); }); };
|
||||
var _metaPut = function (k, v) { return _req(META, 'readwrite', function (os) { os.put(v, k); }); };
|
||||
|
||||
|
|
@ -750,20 +760,78 @@ window.MapOffline = (function () {
|
|||
});
|
||||
}
|
||||
function hasRegion() { return stats().then(function (s) { return s.count > 0; }).catch(function () { return false; }); }
|
||||
// „Alles löschen" entfernt Kacheln/Marker/Regionen — das FUNKLOCH-GEDÄCHTNIS bleibt
|
||||
// (Quelle der Wahrheit, Modell René 2026-06-08): Zonen werden auf filled:false gesetzt
|
||||
// und beim nächsten Online-Start in Positionsnähe automatisch neu geladen.
|
||||
function clear() {
|
||||
return _req(STORE, 'readwrite', function (os) { os.clear(); })
|
||||
.then(function () { return _metaGet('deadzones'); })
|
||||
.then(function (zones) {
|
||||
return _req(META, 'readwrite', function (os) { os.clear(); }).then(function () {
|
||||
if (zones && zones.length) {
|
||||
zones.forEach(function (z) { z.filled = false; });
|
||||
return _metaPut('deadzones', zones);
|
||||
}
|
||||
});
|
||||
// Kachel-Keys eines Umkreises (alle Zooms) ins Keep-Set legen.
|
||||
function _keepRegionKeys(lat, lon, radiusKm, keep) {
|
||||
var bb = _bboxAround(lat, lon, radiusKm);
|
||||
for (var z = 10; z <= MAXZOOM; z++) {
|
||||
var x0 = _x(bb.west, z), x1 = _x(bb.east, z), y0 = _y(bb.north, z), y1 = _y(bb.south, z);
|
||||
for (var x = x0; x <= x1; x++) for (var y = y0; y <= y1; y++) keep[z + '/' + x + '/' + y] = 1;
|
||||
}
|
||||
}
|
||||
// Korridor-Keys eines Tracks (±bufferKm, z10–14) ins Keep-Set legen.
|
||||
function _keepCorridorKeys(track, bufferKm, keep) {
|
||||
track.forEach(function (p) {
|
||||
var d = Math.ceil(bufferKm / _tileKm(MAXZOOM, p.lat));
|
||||
var cx = _x(p.lon, MAXZOOM), cy = _y(p.lat, MAXZOOM);
|
||||
for (var x = cx - d; x <= cx + d; x++) for (var y = cy - d; y <= cy + d; y++) {
|
||||
keep[MAXZOOM + '/' + x + '/' + y] = 1;
|
||||
for (var pz = 13; pz >= 10; pz--) {
|
||||
keep[pz + '/' + (x >> (MAXZOOM - pz)) + '/' + (y >> (MAXZOOM - pz))] = 1;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// „Alles löschen" — SELEKTIV (René 2026-06-08, spart Vorladezeit):
|
||||
// BLEIBEN: Standort-Gebiete (Regionen type 'standort'), Korridore der übergebenen
|
||||
// Routen-Tracks (opts.keepTracks), der Umkreis von opts.center (5 km), Basis-Zooms 0–9
|
||||
// (winzig, von allem gebraucht), Marker/Warnungen ('p/') + Glyphs ('f/').
|
||||
// GEHEN: manuelle Gebiete/Ausschnitte + Funkloch-Kacheln (Zonen bleiben gemerkt,
|
||||
// filled:false → Start-Check lädt Nahe automatisch neu).
|
||||
// Ohne Keep-Kandidaten (alte Signatur/Tests): kompletter Wipe inkl. Basis-Zooms.
|
||||
function clear(opts) {
|
||||
opts = opts || {};
|
||||
var keep = {};
|
||||
return _metaGet('regions').then(function (regions) {
|
||||
regions = regions || [];
|
||||
var keptRegions = regions.filter(function (r) { return r.type === 'standort' || r.type === 'korridor'; });
|
||||
regions.forEach(function (r) {
|
||||
if (r.type === 'standort' && r.radiusKm) _keepRegionKeys(r.lat, r.lon, r.radiusKm, keep);
|
||||
});
|
||||
if (opts.center) _keepRegionKeys(opts.center.lat, opts.center.lon, 5, keep);
|
||||
(opts.keepTracks || []).forEach(function (t) {
|
||||
if (t && t.length >= 2) _keepCorridorKeys(t, 1, keep);
|
||||
});
|
||||
var keepBase = Object.keys(keep).length > 0;
|
||||
if (!keepBase) keptRegions = []; // nichts zu behalten → echter Komplett-Wipe
|
||||
|
||||
return _req(STORE, 'readonly', function (os) { return os.getAllKeys(); }).then(function (keys) {
|
||||
// Komplett-Wipe (nichts zu behalten): alles inkl. Marker/Glyphs (altes Verhalten).
|
||||
if (!keepBase) return _delMany((keys || []).slice());
|
||||
var doomed = (keys || []).filter(function (k) {
|
||||
var m = /^(\d+)\//.exec(k);
|
||||
if (!m) return false; // 'p/' + 'f/' bleiben
|
||||
if (+m[1] <= 9) return false; // Basis-Zooms behalten
|
||||
return !keep[k];
|
||||
});
|
||||
return _delMany(doomed);
|
||||
}).then(function () { return _metaGet('deadzones'); })
|
||||
.then(function (zones) {
|
||||
return _req(META, 'readwrite', function (os) { os.clear(); }).then(function () {
|
||||
var jobs = [];
|
||||
if (zones && zones.length) {
|
||||
zones.forEach(function (z) { z.filled = false; });
|
||||
jobs.push(_metaPut('deadzones', zones));
|
||||
}
|
||||
if (keptRegions.length) {
|
||||
jobs.push(_metaPut('regions', keptRegions));
|
||||
jobs.push(_metaPut('region', keptRegions[keptRegions.length - 1]));
|
||||
jobs.push(_metaPut('totalBytes', keptRegions.reduce(function (a, r) { return a + (r.bytes || 0); }, 0)));
|
||||
}
|
||||
return Promise.all(jobs);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue