# 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) - **ADS-i täpsusparandused (2026-08, teine voor):** - **KÜ-tee otspunkti omistamine:** aadress omistatakse lõikuva tee otspunktile (u/v), mitte geomeetriliselt lähimale suvalisele sõlmele. Parandas 73 valet omistust — nt Loigu (KÜ 0740) läks ekslikult Kungla sõlmele 13645879022, väljapääs näitas 4.4. Nüüd läheb Loigu õigesse komponenti (846244516), Kungla väljapääs 13645879019 näitab 2.2 (1 talu). - **EE+ehr filter:** loendatakse AINULT ehitisregistris olevad elamud (adob_liik=EE JA ehr_kood olemas). Välistab mitteeluruumid (kirik, laut, ait, suvila) — Valga 1 289 aadressi. - Tulemused (ADS, EE+ehr + KÜ): Valga 8 978, Otepää 6 733, Võru 12 044 (varem 12 438 / 9 163 / 15 607) - **ADS-i topeltloenduse parandus (2026-08):** kasutaja märkas, et VAL_0193/VAL_0532 piirkonnas on ADS-arvud kahtlased. Uurimine: isoleeritud komponendi 2 väljapääsu (846244516, 846244647) poolitamine 5.5+5.5 on õige (kogusumma 11.0 = 5 aadressi, mõlemad legitiimsed väljapääsud). AGA leiti tõeline topeltloendus: `_unique_addrs` fallback luges ühte aadressi mitu korda, kui selle hooned olid eri sõlmede lähedal (nt Männi tn 5 4×). Parandus: üks aadress = lähim sõlm + globaalne dedup. Mõju: Valga 8 978→8 956, Otepää 6 733→6 720, Võru 12 044→12 039. - **Dev/prod andmelõhe parandus (2026-08):** ohmu dev-server näitas vanu andmeid (13645879019: pop_ads 4.4), prod uusi (2.2). Põhjus: andmed on image'i sees ja `docker-compose up -d` ilma `--build`-ita ei ehitanud uuesti. Lahendus: `data/` bind-mount mõlemas serveris (`./data:/app/liiklusatlas/data`) — uuendamisel piisab `git pull` + restart. README uuendatud. Kasutaja kinnitas, et 2.2 el + 4.4 sõitu (Kungla) on õige loogika (ei muudeta 1 sõiduks). - **Popup täiendus (2026-08):** väljapääsupunkti popup näitab nüüd eraldi "ADS aadresse" (aadresside arv = pop_ads/2.2) ja "ADS elanikke" (pop_ads, 1 kümnendkoht + sõidud). Varem näitas ühte ümardatud arvu ("ADS (aadressid): 2"), mis oli eksitav — 1 aadress andis 2 (ümardatud 2.2 elanikku). Nüüd: Kungla ID 13645879019 → "ADS aadresse: 1, ADS elanikke: 2.2 (4 sõitu)" — võimaldab kontrollida aadresside/eluruumide arvu. - **KOV presentatsioon: raport + hinnapakkumine (2026-08):** - **Kriitilised teelõigud uue meetodiga:** gravity_exit_analysis.py arvutab nüüd sild-servad (nx.bridges) ja lõksus jääva rahvastiku — eraldi veerud trapped_population (kalibreeritud) ja trapped_ads (ADS EE+ehr). CSV: {prefix}_pop_critical_edges.csv, joonis {prefix}_critical_edges.png (kaart + tulpdiagramm). Tulemused: Valga 194 lõiku (lõksus 1638 / ADS 557), Otepää 58 (458/147), Võru 159 (1127/730). - **report.py üldistamine:** prefiksipõhine, lisatud kokkuvõtteleht (rahvaarv kalibreeritud, väljapääsud, ADS, kriitilised lõigud) + ADS-veerg tabelis. Kokkuvõte kasutab kalibreeritud gravity_andmeid (14 814). - **Hinnapakkumise mall:** uus pipeline/offer.py → data/report/hinnapakkumine.pdf, serveeritakse /api/offer.pdf. 07_Müük uuendatud. - Kõik 3 valla raportid + hinnapakkumine saadaval atlas.see1.ee/api/report.pdf?vald=... ja /api/offer.pdf - **Raporti failinimed valla prefiksiga (2026-08):** data/report/{vald}/ kaustades olid kõik failid valga_* nimega (preprocess_web.py standardiseeris valga_* alla). Parandus: failid on nüüd {prefix}_* (nt otepaa_overview.png, voru_pop_critical_edges.csv), report.py tuletab prefiksi raporti kausta nimest (_prefix_for). Dev/prod ühtsed, kõik 3 valla raportid genereeruvad. - **Valideerimine 2025. aasta riigiteede loendustega (2026-08):** - Laeti Transpordiameti 2025. aasta liiklusloendus (4564 homogeenset lõiku, AKÖL) - Sidumine: väljapääsupunkt ↔ lähim riigitee serv (ref) + piki-tee kaugus → õige loenduslõik - Tulemused: kõrvalmaanteed Spearman 0.316 / log-log 0.337; tugimaanteed 0.302/0.322; teisaldatav loendus 0.379/0.387 - Põhimaanteed negatiivne (-0.587) — läbisõit/transit, mida kaudne meetod ei hõlma (piirang) - Järeldus: meetod hindab hästi **suhtelist lokaalset** koormust; absoluutne tase vajab kalibreerimist - Failid: `liiklussagedus/results/validation/loendus_2025.csv`, `validation_2025.csv`, joonis `validation_2025.png` - **Liiklussageduse visualiseerimine veebirakenduses (2026-08):** - **Kohalikud teed:** igale lõigule lisatud kaudne koormus (`exit_trips` = tema parima väljapääsu päeva sõidud, `trips_per_km`) — värv/laius trips järgi (hõre → tihe) - **Riigiteed:** igale lõigule lisatud loenduse AKÖL (`ref`-matching loendus_2025.csv-ga) — värv loenduse järgi (hõre → tihe), popup näitab sõidukit/ööp - Legend uuendatud: "Riigiteed (loendus)" + "Kohalikud teed (kaudne koormus)" - Teostus: export_qgis.py lisab `ref` major_roads'ile, `exit_trips`/`trips_per_km` local_roads'ile; preprocess_web.py ATTR_MAP; web/index.html STYLE + popup + legend - Katvus: Valga 5215/6779 local lõiku trips-iga, 2255/2477 major lõiku AKÖL-iga; Otepää/Võru analoogselt - **Liiklusvisualiseerimise parandus (2026-08):** kasutaja märkas, et uus värviskeem "kustutas" hõredad teed (helehall valgel taustal). Parandus: taastati algne tee-värviskeem (riigiteed klassi järgi, kohalikud teed impedantsi järgi) — teed jäävad alati nähtavaks. Liiklus kuvatakse nüüd **overlay-kihina** tee peal (local_traffic/major_traffic): riigiteedel loenduse AKÖL (sinine kate), kohalikel teedel kaudne trips (punane kate). Legend ja checkboxid uuendatud. Andmed (trips/akol atribuudid) on tee kihis olemas ja popup näitab neid. - **Teede omandisuhe teeregistrist (2026-08):** - Allikas: Teeregistri avalik WFS (https://teeregister.mnt.ee/290424/wfs), kiht ms:n_omand (teede omandisuhted) - Uus pipeline/teeregister_omand.py — laadib omandilõigud bbox-i kaupa (tee_number, om_omand_val, geomeetria) - export_qgis.py: spatial join (intersects) teeregistri omandilõikudest meie teedele → atribuut 'omand' (Riigiomand/Eraomand/Munitsipaalomand/Avalik-õiguslik/Segaomand) - Teedevõrku EI muudeta — ainult omand atribuut lisatud; popup näitab omandit - Katvus: Valga local 3762/6779, major 1907/2477; Otepää local 4242/7107, major 2037/2617; Võru local 7479/14999, major 3231/4539 - **Katastriüksused kaardil + teede omandivärv (2026-08):** - **Uurimistulemus:** Maa-ameti katastriüksused on **avaandmed** (litsents, uuenevad igal ööl), allalaaditavad maakonna kaupa GPKG/SHP/JSON (s3.pilw.io). Atribuudid: tunnus, l_aadress, **siht1 (sihtotstarve: TRANSPORDIMAA = teede maa)**, **omvorm (omandivorm: Eraomand/Riigiomand/Munitsipaalomand/Segaomand)**, pindala. - **Uurimisobjekt:** TRANSPORDIMAA + Eraomand = **erateed**. Valgas 169 KÜ eraomandis (nt "Roobe-Kimma tee"). Kataster on täielikum omandiallikas kui teeregister (Valga 4874 vs 3762 lõiku). - **Teostus:** uus pipeline/kataster_laadimine.py (maakonna GPKG laadimine, bbox-filter); export_qgis.py lisab teedele omand_kat (spatial join TRANSPORDIMAA) + katastriüksuste kiht gpkg-sse; preprocess_web ATTR_MAP; web/index.html uued linnukesed "Katastriüksused" ja "Teede omandivärv" (eratee punane, riigitee sinine, munitsipaal roheline) + popup. - **Erateed (lõigud/pikkus):** Valga 102/29.4 km, Otepää 194/53.1 km, Võru 278/86.0 km. - **Katastriüksuste omandipõhine värviskeem (2026-08):** katastriüksused värvitud omandivormi järgi — riigiomand sinine, KOV (munitsipaal) roheline, eraomand punane, segaomand lilla, kinnistamata eraomand oranž, avalik-õiguslik türkiis, teadmata/tühi hall. Läbipaistvad täidised (teed jäävad nähtavaks), legend uuendatud. Omandiväärtused: Eraomand, Riigiomand, Munitsipaalomand, Omandi ulatus selgitamisel, Segaomand, Kinnistamata eraomand, Avalik-õiguslik omand, Reformimata maal asuv.