# Tehtud töö ajalugu

## 2026-08-04 — Veebiatlas + esimesed vallad

- **F0:** Veebiatlase algversioon `liiklusatlas` (FastAPI + MapLibre GL + PDF-raport)
  - `preprocess_web.py` — gpkg → GeoJSON kihid
  - `server.py` — API `/api/maps/*`, `/api/report.pdf`
  - `report.py` — A4 PDF (reportlab)
  - `web/index.html` — MapLibre kaart
  - Gogs repo `ardo/liiklusatlas` loodud
  - Deploy: ohmu (dev, 8074) + hetzner (prod, `atlas.see1.ee`, traefik + Let's Encrypt)
  - DNS: A-kirje lisatud; AAAA eemaldatud (hetzner IPv6 katki)
- **F1:** Valla valija (79 KOV-i), legend, KOV-selgitused; mitme valla andmestruktuur
  - `municipalities.py` — 79 KOV-i register
  - API `/api/municipalities`, `/api/maps/{vald}/{layer}`
- **F2:** Üldistatud pipeline + Otepää vald
  - 4 analüüsiskripti üldistatud (`--place`/`--prefix`)
  - `run_municipality.py` — orkestreerija
  - Otepää vald analüüsitud (2. vald)
  - Raport valla parameetriga (`?vald=`)
- **F2b:** Võru vald (3. vald) + pipeline parandused
  - `--results-dir` — väljund `liiklussagedus/results/` (mitte pipeline/results)
  - gravity-le `--skip-plot` tugi
  - pipeline cache/data `.gitignore`-isse
- **Obsidian:** `Doktoritöö/Liiklussageduse kaudne hindamine/` loodud — struktureeritud märkmed metoodika ja tulemuste kohta
- **Parandused (veebiatlas):** valla-spetsiifilised rühmakoodid (`VAL_`, `OTE_`, `VOR_` — mitte `VLG_`), `_pop_` failinimede ühtlustamine (population kirjutas `{prefix}_catchment.csv`, tarbijad otsisid `{prefix}_pop_catchment.csv` → väljapääsupunktide andmed puudusid Otepääl/Võrus), popup-id näitavad õiget valla nime + null-kaitse
- **Ühtne gravitatsioonipõhine süsteem:** väljapääsupunktide rahvastik/liikumised arvutatakse nüüd gravitatsioonimudeliga (mitte ainult lähim-jaotusega):
  - `valga_population_analysis.py` kirjutab `{prefix}_pop_node_population.csv` (sõlme-taseme rahvastik)
  - `gravity_exit_analysis.py` §9 loeb selle, liidab iga sõlme rahvastiku selle gravitatsioonipõhise parima väljapääsupunkti alla → `{prefix}_gravity_exit_population.csv` (`gravity_population`, `gravity_trips`, `nearest_population` võrdluseks)
  - `export_qgis.py` määrab `pop_catch`/`daily_trips` gravitatsiooniväärtustega
  - Popup näitab "Elanikke (gravitatsioon)" + lähim-jaotuse võrdluse
  - Tulemus: suuremad keskused tõmbavad rahvastikku (nt Valga suurim väljapääs: gravity 1 682 vs nearest 83)
- **Pehme gravity-jaotus (nulli parandus):** hard-assignment (iga sõlm AINULT parimasse väljapääsu) jättis väiksed põhikomponendi punktid tühjaks (Valga 57/71, Otepää 27/28, Võru 28/36 pop=0). Asendatud probabilistliku jaotusega:
  - `weight(e) = (pop_e + 1) / (impédance/1000)²` — iga sõlme rahvastik jaotatakse kõigi väljapääsupunktide vahel proportsionaalselt
  - Nüüd kõik põhikomponendi punktid saavad mitte-null gravity-rahvastiku
- **ID-d popupides:** teedel `osm_u–osm_v`, väljapääsupunktidel `id` (exit_node) — vigade kontrollimiseks
- **OSM-hooned rahvastiku proksina (WorldPop asendus):** WorldPop-i 5 km omistamisraadius "imeb" linna rahvastikku põlluteede sõlmedesse (Otepää sõlm 281707587 sai 40.5 elanikku, kuigi teedegrupil OTE_0141 pole maju). Uus meetod:
  - `pipeline/building_population.py` — aadressiga hooned (eluruumid) → lähim tee sõlm (max 300 m), 2.2 inimest/hoone, korterelamu 12
  - Tulemus: OTE_0141 → 0 elanikku, OTE_0005 → 1 279 (Sihva, maju on), sõlm 281707587 → 0
  - Valla kogurahvastik realistlik: Valga 17 348, Otepää 6 607, Võru 9 622
- **Kahte rahvastiku varianti (VAL_0193 juhtum):** Valga grupp VAL_0193 (teeharud riigitee "Puurina" küljes) — sõlmede lähedal `building=yes` hooned ilma aadressita:
  - `pop` (aadressiga) = 0 — Valgas aadressikate puudulik
  - `pop_all` = 26.4 elanikku, 53 sõitu
  - Lahendus: arvutatakse mõlemad variandid läbi kogu ahela (building_population → gravity shares → export → veeb). Popup näitab mõlemat, kui erinevad.
  - Tulemused: Valga addr 17 348 / all 30 895; Otepää 6 607 / 22 714; Võru 9 622 / 40 579
  - **Kalibreerimine KOV tegelike andmetega on järgmine samm** (all ülehinnab suvilate tõttu, addr alahindab ilma aadressita maju)
- **Kombineeritud rahvastik (res):** aadressiga + ilma aadressita `building=yes` hooned 50–200m² (EPSG:3301 pindala). Kuna `all` on tugevalt ülehinnatud ja `addr` on valla tasandil täpseim:
  - Popup: "Elanikke (aadressiga)" peamine + "Elanikke (sh ilma aadressita)" (res) lisainfo
  - VAL_0193: addr=0, res=13.2 elanikku/26 sõitu — ilma aadressita elamud kaetud
  - Valla kogurahvastik: Valga addr 17 346 / res 23 716; Otepää 6 610 / 15 309; Võru 9 622 / 26 311
  - **Uurimismärkus:** privaatsuslävi (alla 4=0) EI ole põhjus — WorldPop on määritud, Statistikaamet kasutab cell key't. Otepääl on 7951 ilma aadressita hoonet (suvilad) — pindala üksi ei erista; asustuskonteksti kalibreerimine KOV andmetega on tuleviku samm
- **ADS-i (riiklik aadressiregister) integreerimine:** `pipeline/ads_buildings.py` laeb Maa- ja Ruumiameti ADS-i WFS-ist (`aks.geoportaal.ee/aks-ogc`, kiht `ads_hoone_a`) kõik valla hooned — **kõik aadressiga** (Valga 17 452 vs OSM 14 728):
  - `population_ads` = ADS-i hooned (võrdluseks, ülehinnatud — kõrvalhooned/suvilad)
  - Peamiseks jääb **OSM-addr** (valla tasandil täpne: Valga 17 346, Otepää 6 610, Võru 9 622)
  - VAL_0193: OSM-addr 0, **ADS 22** — riiklik register kinnitab maju; popup näitab "ADS (kõik hooned)" võrdluseks
  - Uurimine: 96% OSM aadressita hoonetest <100m ADS-hoonest; EHR-i sihtotstarve (`ehr_kood`) on tuleviku täpsustus eluhoonete eristamiseks
- **ADS-i parandus (unikaalsed aadressid):** VAL_0193 väljapääsupunktide ümber oli ADS-is 22 hoonet, aga ainult ~5 **unikaalset aadressi** (taluõus elamu + mitu kõrvalhoonet samal aadressil). **Aadress on liikumiste aluseks, mitte hoonete arv.** Parandus: `_assign_unique` loeb iga sõlme jaoks unikaalseid aadresse. Tulemus: VAL_0193 ADS 22 → 4.4 elanikku; Valga ADS 25 562 → 13 031; Otepää 20 165 → 9 910; Võru 37 450 → 17 304
- **Kalibreerimine Rahvastikuregistri ametliku rahvaarvuga:** kasutaja idee "elanikud proportsionaalselt eluruumi aadressidele" rakendatud:
  - `--official-pop` parameeter building_population.py-s; `skaala = ametlik / OSM-addr hooned`
  - Ametlikud arvud: Valga 14 813, Otepää 6 225, Tõrva 5 777 (2026), Võru 10 310 (2024)
  - Tulemus: valla kogurahvastik = ametlik arv, jaotus proportsionaalne aadressitihedusega
  - Popup korrastatud: "ADS (kõik hooned)" → "ADS (aadressid)", eemaldatud segav "Lähim-jaotus"
- **Uuritud ametlikku rahvastikuinfot:** Statistikaamet RV0291U (valla rahvaarv), REL2021 "Leibkonnad ja perekonnad". **Leibkonnad ja ruutstatistika (1km/100m) on tulevikuplaan** — leibkonna-põhine liikumine (kogu pere sõidab koos linna) on teaduslikult põhjendatud lähenemine
- **Arenduse töövoog:** kogu skriptide käitamine ja testimine toimub `ohmu`-l (võimas arvuti), chat käib lokaalselt; ohmu-l tehtud muudatused jõuavad Syncthing-iga tagasi lokaalsesse git-reposse

## Tehtud otsused ja õppetunnid

- **Väljundi asukoht:** pipeline skriptid peavad kirjutama `liiklussagedus/results/`, sest `preprocess_web.py` otsib sealt — kinnitada `--results-dir` igas etapis
- **Failinimede konventsioon:** `valga_population_analysis.py` kirjutab `{prefix}_pop_*.csv` (prefiks saab `_pop`-lõpu), gravity/export otsivad sama mustrit. Valga töötas juhuslikult (ajalooline prefiks `valga_pop`); ühtlustada uute valdadega
- **gpkg-otsing:** `preprocess_web.py` leidis `voru_qgis.gpkg` ka `voru-linn` jaoks — klapp ainult täpse nimega + `-vald` sufiksi erandiga, mitte `-linn` päisega
- **WorldPop alahindab hõreasustust:** elanike arv catchment'is on tunduvalt väiksem tegelikust — vajab validatsiooni/kalibreerimist
- **Gravitatsioon `switched` = 0:** madala tihedusega valdades ei muuda gravitatsioonikorrektsioon valikuid — tuleb uurida, kas alpha on liiga väike või on see geograafiline reaalsus
- **AAAA kirje:** ei tohi lisada, kui server kuulab ainult IPv4-l

## Tuleviku sammud

- [ ] Teaduskirjanduse kogumine (n8n)
- [ ] Valideerimine riigiteede loendustega
- [ ] Põhiartikli koostamine (3 valda)
- [ ] Müügipaketi ettevalmistus
- **Katastriüksuse (KÜ) põhine ADS-omistamine:** kasutaja idee aadress kanname sellele teedevõrgule, kus kataster teega kokku puutub, mitte kauguse järgi rakendatud:
  - Uus pipeline/ads_ky.py — AKS WFS kiht aks:ads_ky (KÜ tunnus orig_tunnus, taisaadress), sama teenus mis ADS-hooned
  - Iga ADS-hoone → KÜ (ruumiline); KÜ-tee lõikumiskoha lähim sõlm; fallback kauguspõhine
  - Lahendas Loigu juhtumi: elamu 356m teest, aga KÜ puutub teega → aadress jõuab õigele väljapääsule
  - Tulemused (üks aadress = üks kord): Valga 12 438, Otepää 9 163, Võru 15 607 (varem 13 031 / 9 910 / 17 304)
