Tehtud töö ajalugu.md 10.0 KB

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.