KI-Vision-Model, Breed-Scraper, Karte/Routen + Release v1292
Parallele Arbeit (auf Staging mitgetestet): KI-Vision-Model (VISION_MODEL in ki.py/routes, im KI-Status sichtbar), Breed-Scraper-Anpassungen (breed_enricher/breed_evaluator, evaluate_enrichment mit user_id), Karten-/Routen-Änderungen (map.js, routes.js), kleinere UI-Anpassungen (admin.js, components.css), docker-compose, MARKETING, nav-loop-Test. Version-Bump auf 1292 (VERSION, sw.js, app.js, index.html, landing.html).
This commit is contained in:
parent
51aad6cf1b
commit
f7370028da
17 changed files with 322 additions and 100 deletions
|
|
@ -1996,6 +1996,15 @@ window.Page_routes = (() => {
|
|||
// alles grün, 99 % ab Start (Praxistest René 2026-06-07, Gassirunde Siegenhofen).
|
||||
// Global nur beim ersten Fix oder wenn verloren (Fenster-Treffer > 300 m entfernt).
|
||||
let _navIdxInit = false;
|
||||
// Runde erkennen: Start ≈ Ende (< 60 m). An einem solchen Start/Ende-Knoten ist der
|
||||
// ENDPUNKT oft ein paar Meter näher als der Startpunkt — die globale Erst-Suche sprang
|
||||
// dann sofort ans Track-ENDE → 100 % / 0 km ab Sekunde 1, kein Bellen, alles grün, und
|
||||
// der gelaufene-Weg-Eintrag wurde fälschlich als komplett gespeichert. Der alte 25-m-
|
||||
// Gleichstand reichte nicht, wenn der Start >28 m weg lag (Siegenhofen René 2026-06-07,
|
||||
// Deining Angie 2026-06-09).
|
||||
const _navIsLoop = track.length > 2 &&
|
||||
_haversineKm(track[0].lat, track[0].lon,
|
||||
track[track.length - 1].lat, track[track.length - 1].lon) < 0.06;
|
||||
const _closestIdx = (lat, lon) => {
|
||||
const search = (from, to) => {
|
||||
let best = from, bestD = Infinity;
|
||||
|
|
@ -2007,8 +2016,16 @@ window.Page_routes = (() => {
|
|||
};
|
||||
if (!_navIdxInit) {
|
||||
_navIdxInit = true;
|
||||
// Erster Fix: global, aber bei Quasi-Gleichstand (< 25 m) den START bevorzugen (Loop!)
|
||||
const g = search(0, track.length - 1);
|
||||
if (_navIsLoop) {
|
||||
// Runde: steht man irgendwo in Startnähe (< 150 m), bei 0 % beginnen statt ans
|
||||
// nahe Track-Ende zu springen. Erst wer weit vom Start steht, ist mitten in die
|
||||
// Runde eingestiegen → globaler Treffer. Startfenster = erste 15 % (mind. 30 Pkt.).
|
||||
const win = Math.min(track.length - 1, Math.max(30, Math.floor(track.length * 0.15)));
|
||||
const s = search(0, win);
|
||||
return s.bestD < 0.15 ? s.best : g.best;
|
||||
}
|
||||
// Punkt-zu-Punkt: bei Quasi-Gleichstand (< 25 m) den START bevorzugen.
|
||||
const s = search(0, Math.min(track.length - 1, 30));
|
||||
return (s.bestD - g.bestD) * 1000 < 25 ? s.best : g.best;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue