# Veebirakendus (Liiklusatlas)

## Eesmärk

Interaktiivne kaardirakendus, mis kuvab analüüsi tulemusi omavalitsustele (KOV) — müügidemo ja edaspidi iseteenindustööriist.

## Tehnoloogia

- **Tagala:** FastAPI (Python), serveerib GeoJSON-e ja PDF-raportit
- **Esitlus:** MapLibre GL (JS) + OpenStreetMap taustakaart
- **Raport:** reportlab (A4 PDF)

## Funktsionaalsus

- Valla valija (dropdown, 79 KOV-i; valmis vallad aktiivsed, teised "tulekul")
- **Avalik/kaistud:** Valga avalik; Otepää/Võru/Tõrva `(kaitstud)`, lukus — **Demo-kood** sidebar-is avab need (token localStorage-s)
- Kihid sisse/välja: riigiteed, kohalikud teed, liiklus (AKÖL/kaudne), väljapääsupunktid, rühmad, katastriüksused, teede omandivärv
- Hüpikaknad (popup) kihi atribuutidega
- Legend ja KOV-sõbralikud selgitused
- PDF-raport allalaadimine valitud vallale
- Referentsileht `/tutvustus` (4 demo valda, Valga avalik, teised 🔒)

## API

| Endpoint | Kirjeldus |
|----------|-----------|
| `GET /` | kaart |
| `GET /tutvustus` | referentsileht |
| `GET /api/municipalities` | 79 KOV-i + staatus + access (public/protected) + kihid |
| `GET /api/maps/{vald}` | valla kihtide nimekiri |
| `GET /api/maps/{vald}/{layer}` | GeoJSON kiht (kaitstud vald → vajab koodi) |
| `GET /api/report.pdf?vald={vald}` | PDF-raport (kaitstud vald → vajab koodi) |
| `GET /api/offer.pdf` | hinnapakkumine |
| `GET /health` | tervisekontroll |

**Demo-kood:** `?token=` või `X-Access-Token` päis. Keskkonnamuutuja `ATLAS_ACCESS_TOKEN`.

## Kaardikihid (GeoJSON)

- `boundary` — valla piir
- `major_roads` — riigiteed (värvitud klassi järgi + liikluse AKÖL overlay)
- `local_roads` — kohalikud teed (ühtne klassivärv + liikluse overlay)
- `exit_points` — väljapääsupunktid (suurus = trips, värv = haavatavus)
- `local_groups` — kohalike teede rühmad
- `katastriuksused` — katastriüksused (omandipõhine värv)

## local_roads atribuudid

| Atribuut | Tähendus |
|----------|----------|
| `group` | kohalike teede rühm (VAL_/OTE_/TOR_/VOR_) |
| `exit` | parim väljapääs (gravity) |
| `trips`, `trips_ads`, `trips_per_km` | päeva sõidud (kaudne + ADS) |
| `omand`, `omand_kat` | omand (teeregister + kataster) |
| `kasutus` | teekasutusleping (avalik/metsatee/mitteavalik) |
| `is_deadend` | tupiktee (otspunkti aste = 1) |
| `is_exit` | väljapääsu lõik (otspunkt riigiteel) |
| `trip_length_m` | reisi pikkus väljapääsuni (BFS-puu ahel) |
| `trip_kasutus` | kas reis läbib metsateed/mitteavalikku |
| `is_agreement` | lepingulõike läbiv reis |

## Kihistuste loogika

- **Kohalikud teed:** ühtne klassivärv `#7c8ea0`; liiklus overlay (kaudne trips)
- **Riigiteed:** klassi värv; liiklus overlay (loenduse AKÖL)
- **Väljapääsupunktid:** radius = trips; värv = haavatav (detour > 0 või isoleeritud + elanikud)
- **Omandivärv:** eratee punane / riigitee sinine / munitsipaal roheline (katastri omand, fallback teeregister)

## Arendus

```bash
PYTHONPATH=. ATLAS_ACCESS_TOKEN=<kood> .venv/bin/uvicorn liiklusatlas.server:app --port 8074 --reload
```

## Logimine

Iga `/api/maps/{vald}/{layer}` ja `/api/report.pdf` päring logitakse `data/logs/access.log`
(JSONL): aeg, IP (X-Forwarded-For), vald, kiht, staatus, UA, kas koodiga. Tokenit ei logita.

## Vahemälu (cache)

- **Serveripoolne:** kõik lehed/kihid/raportid saavad `Cache-Control: no-cache, no-store,
  must-revalidate` — brauser kontrollib iga kord uuesti, vana vahemälu ei kasutata.
  (Lisa: `server.py` NO_CACHE päised; rakendatud 2026-08.)
- **Kasutajapoolne (kui ikka vana):**
  - **Ctrl+F5** / **Ctrl+Shift+R** — sunnitud värskendamine (tabaline brauser)
  - Private/inkognito aken — alati uus
  - Chrome/Edge: DevTools (F12) → Network → märgi "Disable cache" → F5
  - Või: Chrome aadressiribale `chrome://settings/clearBrowserData` → "Vahemällu salvestatud pildid ja failid"

## Seos

[[Liiklussageduse kaudne hindamine/04_Tehniline/Repo ja töövoog]]
[[Liiklussageduse kaudne hindamine/04_Tehniline/Deploy ja infrastruktuur]]
