Browse Source

Liiklussageduse kaudne hindamine: OSM-hooned rahvastiku proksina

ardo 3 weeks ago
parent
commit
cc2e5de509

+ 21 - 4
Doktoritöö/Liiklussageduse kaudne hindamine/02_Metoodika/01 Andmeallikad.md

@@ -26,15 +26,32 @@ Kõik andmed on **avalikud ja tasuta** — see on metoodika oluline eelis (kaudn
 
 `exit_nodes = local_nodes ∩ major_nodes` — kohaliku võrgustiku sõlmed, mis on ühtlasi riigiteede sõlmed. Need on piirid, kus kohalik liiklus "voolab" riigimaanteele.
 
-## 2. WorldPop (rahvastik)
+## 2. OpenStreetMap hooned (rahvastik — PEAMINE)
+
+**Kasutus:** rahvastiku hinnang tee sõlmedele (alates 2026-08).
+
+- Laetakse kõik `building` tunnusega hooned valla piiris (`osmnx.features_from_polygon`)
+- **Aadressiga hooned** (`addr:housenumber`) = tegelikud eluruumid (hõreasustuses on palju suvilaid/abihooneid ilma aadressita)
+- Iga hoone omistatakse **lähimale tee sõlmele** (max 300 m)
+- Elanikud = hoonete arv × 2.2 (Eesti keskmine leibkond); korterelamu = 12
+- Eelis WorldPop-i ees: kajastab TEGELIKKE maju, ei "ime" linna rahvastikku kaugematele põlluteede sõlmedele
+- Skript: `pipeline/building_population.py` → `{prefix}_pop_node_population.csv`
+
+**Võrdlus tegeliku rahvaarvuga (2026-08):**
+| Vald | Hinnang (aadressiga hooned) | Tegelik |
+|------|---------------------------|---------|
+| Valga | 17 348 | ~16 000 |
+| Otepää | 6 607 | ~6 700 |
+| Võru | 9 622 | ~10 000 |
+
+## 3. WorldPop (rahvastik — varuversioon, EI OLE enam peamine)
 
 - **Allikas:** `https://data.worldpop.org/GIS/Population/Global_2000_2020/2020/EST/est_ppp_2020.tif`
 - **Formaat:** 100 m ruumiline raster, rahvaarv ruudustiku kohta
-- **Kasutus:** igale teede sõlmele lähima rahvastiku määramine
 - **Cache:** `liiklussagedus/data/est_ppp_2020.tif` (~47 MB)
-- **Filtreerimine:** hõreda asustusega alad `< 10 inimest/km²` (`SPARSE_THRESHOLD`)
+- **Puudus:** omistab rahvastiku lähimale sõlmele kuni 5 km kaugusel — linnaservas olevad põlluteed "imevad" linna rahvastikku (näide: Otepää sõlm 281707587 sai 40.5 elanikku, kuigi küljes on põllutee). **Asendatud hoonepõhise hinnanguga.**
 
-## 3. Transpordiamet / riiklikud registrid (tulevik)
+## 4. Transpordiamet / riiklikud registrid (tulevik)
 
 - Riigimaanteede liiklusloendused — avalikud (maanteede registri liiklusandmed)
 - Maanteeandmed, teekatte klassid — teeregister

+ 30 - 43
Doktoritöö/Liiklussageduse kaudne hindamine/02_Metoodika/04 Rahvastiku jaotamine.md

@@ -1,73 +1,60 @@
-# Rahvastiku jaotamine (WorldPop)
+# 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.
 
-## Andmeallikas
+## Meetod (alates 2026-08: OSM-hooned)
 
-**WorldPop** 100 m rahvastikuruudustik:
-```
-https://data.worldpop.org/GIS/Population/Global_2000_2020/2020/EST/est_ppp_2020.tif
-```
-Iga 100 m × 100 m ruudustiku lahtris on hinnanguline rahvaarv. Cache: `liiklussagedus/data/est_ppp_2020.tif`.
-
-## Meetod
-
-### 1. Rasteri kärpimine valla piirile
+### 1. Hoonete laadimine
 
 ```python
-with rasterio.open(POP_TIF) as src:
-    pop_clipped, pop_transform = mask(src, geom, crop=True, nodata=-99999)
+bld = ox.features_from_polygon(boundary, {"building": True})
+bld = bld[bld["addr:housenumber"].notna()]   # ainult aadressiga = eluruumid
 ```
 
-Raster lõigatakse valla piiriga (`rasterio.mask`), et töötada ainult piirkonna andmetega.
-
-### 2. Teede sõlmede kaugus rasterist
-
-Iga sõlme kohta määratakse lähedal asuv rahvastik (100 m raadiuses) kas:
-- puhvri abil (`geometry_mask` vms), või
-- lähima lahtri väärtusena
-
-### 3. Rahvastiku liitmine väljapääsupunkti teenindusalale
+- **Aadressiga hooned** = tegelikud eluruumid. Hõreasustuses on palju suvilaid/abihooneid (greenhouse, shed, garage...) ilma aadressita — need välistatakse.
+- Skript: `pipeline/building_population.py`
 
-Kasutades teenindusala jaotust ([[Liiklussageduse kaudne hindamine/02_Metoodika/03 Väljapääsupunktid ja teenindusalad]]), summeeritakse iga väljapääsupunkti teenindusala rahvastik:
+### 2. Hoonete omistamine sõlmedele
 
 ```python
-catchment_df   # exit_node, population_catchment, nodes_served, ...
+dists, idxs = node_tree.query(bld_xy, k=1)   # iga hoone lähim sõlm
+if dist <= 300: node_population[node] += persons
 ```
 
-### 4. Trippide genereerimine (trip generation)
+Iga hoone → **lähim tee sõlm** (max 300 m). Ei loeta hoonet mitu korda.
+
+### 3. Elanike arv hoone kohta
 
 ```python
-TRIPS_PER_PERSON = 2.0
-daily_trips_to_exit = population_catchment * TRIPS_PER_PERSON
+PERSONS_PER_BUILDING = 2.2    # Eesti keskmine leibkond
+PERSONS_PER_APARTMENT = 12.0  # korterelamu
 ```
 
-Iga inimene teeb eeldatavalt 2 päevast liikumist (kodust välja + tagasi) → päevane trippide arv väljapääsupunkti.
+### 4. Rahvastiku liitmine väljapääsupunkti teenindusalale
+
+Kasutades teenindusala jaotust, summeeritakse iga väljapääsupunkti teenindusala rahvastik.
 
-### 5. Hõreda asustuse analüüs
+### 5. Trippide genereerimine (trip generation)
 
 ```python
-SPARSE_THRESHOLD = 10  # inimest/km²
+TRIPS_PER_PERSON = 2.0
+daily_trips_to_exit = population_catchment * TRIPS_PER_PERSON
 ```
 
-Piirkonnad alla tihedusläve määratletakse "hõreda asustusega" (`sparse_*` väljundid) — nendes on liiklusnõudlus minimaalne.
-
 ## Väljundid
 
-- `{prefix}_catchment.csv` — `exit_node, population_catchment, nodes_served, avg_distance_m, daily_trips_to_exit, edge_length_km, trips_per_km`
-- `{prefix}_pop_vulnerability.csv` — rahvastikupõhine haavatavus (ümbersõit, inim-km detour)
-- `{prefix}_critical_edges.csv` — kriitilised lõigud (`trapped_nodes`, `trapped_population`)
-- `{prefix}_sparse_*.csv` — hõreda asustusega alad
-- PNG-kaardid: rahvastikujaotus, kriitilised lõigud
+- `{prefix}_pop_node_population.csv` — sõlme-taseme rahvastik (node, population)
+- `{prefix}_catchment.csv` — `exit_node, population_catchment, nodes_served, ...`
+- `{prefix}_pop_vulnerability.csv` — rahvastikupõhine haavatavus
+- `{prefix}_critical_edges.csv` — kriitilised lõigud
 
-## Kriitiliste lõikude tuvastamine
+## Miks mitte WorldPop?
 
-Lõigud, mille eemaldamisel jäävad sõlmed (ja rahvastik) ilma ühenduseta väljapääsupunktini — "bridge" analüüs + teisejärgulised (suur ümbersõit).
+WorldPop-i 100 m raster omistab rahvastiku **lähimale sõlmele kuni 5 km** kaugusel. Otepääl sai põllutee sõlm 281707587 (Otepää linna serv, Kanepi tee ristmik) 40.5 elanikku, kuigi teedegrupil OTE_0141 pole maju. Hoonepõhine hinnang annab sellele 0 elanikku — täpselt nagu tegelikkuses.
 
-## Täpsuspiirangud
+## Täpsus
 
-- WorldPop on **modelleeritud** rahvastik, mitte loendus — võib erineda tegelikust kuni märkimisväärselt väikestes külades
-- `TRIPS_PER_PERSON = 2.0` on lihtsustus (ei arvesta kaubavedu, läbisõitu, turismi)
-- Need on metoodika peamised täpsusallikad
+- Aadressiga hoonete arv × 2.2 annab valla kogurahvastiku lähedase hinnangu (Valga 17 348 vs ~16k, Otepää 6 607 vs ~6.7k, Võru 9 622 vs ~10k)
+- Piirangud: OSM-i hõlmatus (mitte kõik majad on kaardistatud), korterelamute suurus hinnanguline

+ 4 - 0
Doktoritöö/Liiklussageduse kaudne hindamine/06_Logid/Tehtud töö ajalugu.md

@@ -34,6 +34,10 @@
   - `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
 
 ## Tehtud otsused ja õppetunnid