navi/frontend
malice 2453c20669
MVUM Layer 1: per-edge annotation + accurate closure counts (#23)
* MVUM Layer 1: per-edge annotation + accurate closure counts

Annotate each network-leg segment with its MVUM access status for the selected mode,
using the Layer-0 MVUMSpatialIndex. No routing-decision or Valhalla changes.

- mvum_annotate.py (new): annotate_network_edges(coords,(lat,lon)), mode, spatial_index,
  on_date) -> [EdgeAnnotation{coord_pair_index, matched_features, mvum_status}]. Walks
  consecutive pairs, queries the index (10m buffer), applies a parallelism filter (acute
  angle to the edge <=45deg, both directions), resolves per-mode access via the existing
  check_access/get_mode_field/symbol_to_access (worst/most-restrictive across matches).
  Mode map: foot->open (skip), 2w->e_bike_class1, 4w->atv, vehicle->highclearancevehicle;
  auto is already resolved to a concrete candidate upstream.
- router.py: _route_D_network_only and _build_response annotate the network leg using the
  injected self.spatial_index (getattr-guarded; skipped + debug-logged if None), attach
  edge_mvum to the network feature, and add summary.mvum_closed_crossings +
  summary.mvum_segments_annotated.
- offroute_route.py: inject app.config[MVUM_SPATIAL_INDEX] onto the router per request.
- DirectionsPanel.jsx: warning row when mvum_closed_crossings>0.
- tests/test_mvum_annotate.py: parallel match, perpendicular reject, seasonal closure,
  symbol fallback, summary count.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Fix seasonal date default + hoist annotation, single annotate for Auto

- Default mvum_on_date to datetime.now() at annotation time so seasonal MVUM
  openings/closings actually fire in production (was effectively None -> no seasonal).
- Hoist per-edge annotation out of _route_D_network_only and _build_response into a new
  central OffrouteRouter._annotate_network_segments(result, mode), invoked once at the end
  of route() (annotate_mvum=True). _route_auto probes with annotate_mvum=False and
  annotates only the winning candidate -> Auto runs annotation once instead of up to 4x.
  Removed the inline annotation/edge_mvum/summary blocks from both scenario handlers.

Note: the central pass filters network features on properties.segment_type == "network"
(the actual tag) rather than the spec-suggested "kind", which is not a field here.

1 new test: test_route_auto_annotates_only_winner.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Matt <mj@k7zvx.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 19:32:43 -06:00
..
docs docs: add traffic-intelligent routing and Idaho 511 planned features 2026-05-08 07:02:00 +00:00
public feat: initial scaffold — Vite + React + Tailwind + MapLibre 2026-04-20 04:47:44 +00:00
src MVUM Layer 1: per-edge annotation + accurate closure counts (#23) 2026-05-25 19:32:43 -06:00
.gitignore chore: add *.bak* to .gitignore 2026-04-27 02:50:54 +00:00
deploy.sh feat: search, multi-stop routing, and route display 2026-04-20 16:50:53 +00:00
eslint.config.js feat: initial scaffold — Vite + React + Tailwind + MapLibre 2026-04-20 04:47:44 +00:00
index.html feat(navi): GPS origin + place detail panel + basic actions 2026-04-20 20:59:18 +00:00
LICENSE Initial commit 2026-04-20 06:42:56 +02:00
package-lock.json fix: contour overlay with pmtiles fork, absolute URL, extended zoom range 2026-05-07 03:58:46 +00:00
package.json fix: contour overlay with pmtiles fork, absolute URL, extended zoom range 2026-05-07 03:58:46 +00:00
postcss.config.js feat: initial scaffold — Vite + React + Tailwind + MapLibre 2026-04-20 04:47:44 +00:00
README.md Initial commit 2026-04-20 06:42:56 +02:00
vite.config.js feat: search, multi-stop routing, and route display 2026-04-20 16:50:53 +00:00

navi

Navi — self-hosted navigation web frontend for Echo6