# Rahvastiku jaotamine (OSM-hooned)

## Eesmärk

Määrata igale teede sõlmele "rahvastikukoormus" — kui palju inimesi elab selle sõlme läheduses. See on liikumiste genereerimise (trip generation) aluseks.

## Meetod (alates 2026-08: OSM-hooned)

### 1. Hoonete laadimine

```python
bld = ox.features_from_polygon(boundary, {"building": True})
bld = bld[bld["addr:housenumber"].notna()]   # ainult aadressiga = eluruumid
```

- **Aadressiga hooned** = tegelikud eluruumid. Hõreasustuses on palju suvilaid/abihooneid (greenhouse, shed, garage...) ilma aadressita — need välistatakse.
- Skript: `pipeline/building_population.py`

### 2. Rahvastiku variandid

Kuna üks lävi ei tööta kõigis piirkondades, arvutatakse **mitu varianti**:

- **`population` (PEAMINE, kalibreeritud)** — OSM aadressiga hooned, skaleeritud **Rahvastikuregistri ametliku valla rahvaarvuga**:
  ```
  skaala = ametlik_rahvaarv / valla_OSM-addr_hoonete_arv
  ```
  Elanikud jaotatakse proportsionaalselt eluruumi aadressidele — valla kogusumma = ametlik arv. Valga 14 813, Otepää 6 225, Võru 10 310 (ametlikud).
- **`population_ads` (ADS, võrdluseks)** — riikliku aadressiregistri (ADS) hooned, **deduplikeeritud unikaalse aadressi järgi**. Mitu hoonet samal aadressil (taluõu: elamu + kuur + ait) = **üks eluruum** (leibkond). Näitab, kus on maju, mida OSM-il pole (nt VAL_0193: OSM-addr 0, ADS 4.4 = 2 aadressi). **Omistamine katastriüksuse (KÜ) kaudu** — vaata allpool.
- **`population_res` (kombineeritud)** — OSM aadressiga + ilma aadressita `building=yes` hooned 50–200 m², mis asuvad **asustuskontekstis** (≤300 m mõnest aadressiga elamust — küla/taluõu). Üksikult metsas asuvad suvilad välistatakse (D-parandus 2026-08, cKDTree kauguskontroll).
- **`population_all` (laiapõhjaline)** — kõik OSM elamutüübid + `building=yes`. Tugevalt ülehinnatud.

Iga hoone → **lähim tee sõlm** (max 300 m). Ei loeta hoonet mitu korda. ADS-i puhul loetakse **unikaalseid aadresse**, mitte hoonete arvu.

### ADS-i omistamine katastriüksuse (KÜ) kaudu

ADS-i hoonete omistamine teedevõrgule kasutab **katastriüksuse (KÜ) piiri** (`aks:ads_ky`, sama AKS-teenus):

1. Iga ADS-hoone → tema **katastriüksus** (ruumiline ühendus: hoone KÜ polügoonis).
2. Iga KÜ → **lõikumispunkt(id) kohaliku teedevõrguga** (spatial join).
3. KUI KÜ puutub teega kokku → omistatakse KÜ kõik unikaalsed aadressid **lõikumiskoha lähimale sõlmele** — juurdepääs maale on seal, kus KÜ teed kohtab.
4. MUIDU (KÜ ilma teekontaktita, hoone KÜ-st väljas) → kauguspõhine fallback (≤300 m).

**Miks:** talu on suur maa-ala — elamu võib olla teest 300+ m kaugusel, aga KÜ piir puutub teega kokku (juurdepääs). Varem jäi selline aadress (nt Loigu, 356 m) kauguspiiri taha. KÜ põhjal omistatakse see õigele teesõlmele. Samuti ei loeta ühte aadressi mitu korda (taluõue hooned eri sõlmede juures).

**Aadressi sõlme valik (2026-08 parandus):** aadress omistatakse **hoonele lähimale sõlmele, mis on ühendatud KÜ-tee kontaktisõlmedega** (samas kohaliku võrgustiku komponendis). MITTE lõikumispunkti (KÜ∩tee) lähim otspunkt — suur KÜ lõikub paljude teedega ja lõikumispunktid on hajutatud, mis viis aadressi valele (hoonele kaugemale) sõlmele (nt Marinurme → 846244561, Kungla → 13645879022). Kontaktkomponent garanteerib juurdepääsu (Loigu→Kungla parandus säilib).

**Andmeallikas:** `pipeline/ads_ky.py` (WFS `aks:ads_ky`, atribuudid `orig_tunnus`, `taisaadress`). Vajalik `{prefix}_ads_ky.gpkg`.

### 3. Elanike arv hoone kohta

```python
PERSONS_PER_BUILDING = 2.2    # Eesti keskmine leibkond
PERSONS_PER_APARTMENT = 12.0  # korterelamu
```

### 4. Variantide ülekandmine väljapääsupunktidesse

`gravity_exit_analysis.py` §9 arvutab gravity-jaotuse osakaalud (shares) **ühe korra** (ei sõltu rahvastiku suurusest) ja korrutab kõigi variantidega:
- `gravity_population` / `gravity_trips` — OSM aadressiga (peamine)
- `gravity_population_ads` / `gravity_trips_ads` — ADS (võrdluseks)
- `gravity_population_res` / `gravity_trips_res` — kombineeritud
- `gravity_population_all` / `gravity_trips_all` — laiapõhjaline

### 5. Trippide genereerimine (trip generation)

```python
TRIPS_PER_PERSON = 2.0
daily_trips_to_exit = population_catchment * TRIPS_PER_PERSON
```

## Väljundid

- `{prefix}_pop_node_population.csv` — sõlme-taseme rahvastik (node, population, population_addr, population_all)
- `{prefix}_gravity_exit_population.csv` — väljapääsupunkti taseme (addr + all)
- `{prefix}_catchment.csv` — `exit_node, population_catchment, nodes_served, ...`
- `{prefix}_pop_vulnerability.csv` — rahvastikupõhine haavatavus
- `{prefix}_critical_edges.csv` — kriitilised lõigud

## Veebiatlas

Popup näitab selget infot:
- "Elanikke" — peamine (kalibreeritud Rahvastikuregistriga)
- "Päeva sõidud" — trips (2× elanikud)
- "ADS (aadressid)" — riiklik register, unikaalsed aadressid (võrdluseks)
- "Detour" — haavatavus

**Teelõigu popup (2026-08):** "ADS aadresse" (`ads_addr`) — unikaalsete ADS-aadresside arv
lõigu valgalas (mitu aadressi liigub läbi selle lõigu väljapääsuni). Tuletatud BFS-puu
post-order'ist (`pop_ads / 2.2`, sama loogika nagu trips). Võimaldab tuvastada, millisele
teelõigule aadressandmed käivad.

## VAL_0193 näide (miks ADS-i võrrelda)

Valga grupp VAL_0193 — kohalikud teeharud riigitee "Puurina" küljes. Kungla talu on väljapääsu 13645879019 juures:
- `pop` (kalibreeritud) = 0 — OSM-i aadressikate puudulik, aadressid pole OSM-is
- `pop_ads` (ADS, EE+ehr) = 2.2 — **ainult Kungla (1 eluruum)**

**Kriitiline parandus (KÜ-tee otspunkt):** Loigu talu KÜ puutub teega kokku unclassified teel 846244516-846244594. Varasem "lähim sõlm" loogika omistas Loigu (2.2) ekslikult Kungla sõlmele 13645879022 → väljapääs näitas 4.4 (Kungla+Loigu). **Parandus:** aadress omistatakse LÕIKUVA TEE otspunktile — Loigu läheb nüüd väljapääsu 846244516 juurde (õigesse komponenti), Kungla jääb 13645879019-le (2.2 = 1 talu).

**ADS-i loenduse reegel (2026-08):** loendatakse AINULT ehitisregistris (EHR) olevad elamud — `adob_liik=="EE"` **ja** `ehr_kood` olemas. Välistab kirikud, laudad, aidad, suvilad jne (Valga: 1 289 mitteeluruumi-aadressi).

## Valla kogurahvastik (2026-08, kalibreeritud)

| Vald | Peamine (kalibreeritud) | Ametlik (RR) | ADS (EE+ehr, KÜ-omistatud) | res |
|------|------------------------|--------------|---------------------------|-----|
| Valga | 14 813 | 14 813 | 8 956 | 18 738 |
| Otepää | 6 225 | 6 225 | 6 720 | 9 383 |
| Võru | 10 310 | 10 310 | 12 039 | 14 845 |
| Tõrva | 5 777 | 5 777 | 4 679 | 7 386 |

**Asustuskonteksti parandus (2026-08):** enne loendati res-variandis kõik ilma aadressita
`yes`-hooned 50–200 m² — Otepääl/Võrus olid need peamiselt suvilad (res 15 309 / 26 311).
Nüüd loendatakse ilma aadressita hoone vaid siis, kui see asub **aadressiga elamu lähedal
(≤300 m)** — küla/taluõue majad säilivad, metsasuvilad välistatakse. Valga jääb kõrgemaks
kui addr (18 738 vs 17 346), sest seal on ilma aadressita elamuid (OSM-i aadressikate puudulik).

**ADS-i topeltloenduse parandus (2026-08):** üks aadress loetakse ALATI üks kord —
`_unique_addrs` omistab aadressi ainult lähimale sõlmele (mitte igale sõlmele, kus mõni
selle aadressi hoone on), ja `_assign_ads_unique` lõpus on globaalne dedup. Varem
loeti nt Männi tn 5 (4 hoonet) 4×. Mõju: Valga −22, Otepää −13, Võru −5.

**Põhimõte:** ametlik valla rahvaarv jaotatakse proportsionaalselt eluruumi aadressidele (`skaala = ametlik / OSM-addr hooned`). Nii on kogusumma täpne ja jaotus proportsionaalne aadressitihedusega.

**ADS-i parandus (2026-08):** katastriüksuse (KÜ) kaudu omistamine vähendas ADS-i arve (Valga 13 031→12 438, Otepää 9 910→9 163, Võru 17 304→15 607) — üks aadress loetakse nüüd üks kord ja suunatakse KÜ-tee lõikumiskohale, mitte iga hoone lähima sõlme järgi.

## Uurimismärkused

- **Rahvastikuregister** (Statistikaamet RV0291U) annab ametliku valla rahvaarvu 1.01 seisuga. Valga 14 813, Otepää 6 225, Tõrva 5 777 (2026), Võru 10 310 (2024)
- **Leibkonnad (tulevikuplaan):** 1 majas võib elada 4 inimest = 1 leibkond; liikumine võib olla leibkonna-põhine (kogu pere sõidab linna tööle/kooli). Statistikaametil on leibkonnaandmed (REL2021 "Leibkonnad ja perekonnad") — uurida, kas saab ruutstatistikana
- **Ruutstatistika (tulevikuplaan):** Statistikaameti rahvastiku ruutvõrk (1km/100m) võimaldaks veelgi täpsemat proportsionaalset jaotust — aga privaatsusläve tõttu ei ole detailne info alati avalik
