Et lisada teedelõikudele (servadele) igapäevaseid liikumisi geograafiliste koordinaatidega isoleeritud teedevõrgus, kus iga leibkond tekitab ühe liikumise koefitsiendi, võiks läheneda järgmiselt:

### 1. **Mudeli struktuur**

- **Graaf**: Teedevõrk on graaf, kus:
    - **Tipud (nodes)**: Teede ristumiskohad või olulised punktid (nt majade asukohad).
    - **Servad (edges)**: Teelõigud kahe tipu vahel.
- **Leibkonnad**: Iga leibkond on seotud kindla tipuga (nt maja asukoht).

### 2. **Liikumise koefitsiendi määramine**

- Iga leibkond genereerib ühe liikumise päevas.
- Liikumise sihtkoht võib olla:
    - juhuslik (uniformne jaotus üle teiste tippude),
    - määratud (nt töökoht, kool, pood),
    - või põhineda tõenäosusjaotusel (nt gravitatsioonimudel, Huffi mudel).

### 3. **Liikumiste jaotamine servadele**

- Kasuta **lühimat tee algoritmi** (nt Dijkstra või A*) iga leibkonna liikumise trajektoori leidmiseks.
- Iga serv, mis kuulub trajektoori hulka, saab juurde ühe ühiku liikumise koefitsiendi.
- Korrates seda kõigi leibkondade jaoks, saad igale servale kogunenud liikumiste arvu.

### 4. **Rakendusnäide**

Kui sul on olemas:

- Teedevõrgu graafi struktuur (tipud ja servad koos koordinaatidega),
- Leibkondade asukohad (tipud, kus nad paiknevad),

siis saame:

- Simuleerida liikumisi,
- Arvutada servadele liikumise koefitsiendid,
- Visualiseerida tulemusi (nt servade paksus vastavalt koefitsiendile).

Kas soovid, et aitaksin selle simuleerimise jaoks koodi koostada või graafiku luua? Võid ka faili üles laadida, kui sul on juba andmed olemas.

Su eesmärk on väga huvitav ja praktiline – modelleerida leibkondade liikumisi teedevõrgus, arvestades nii servade geomeetriat kui ka väljapääsupunktide kaale. Vaatame nüüd kahte pakutud tõenäosusjaotust:

---

### **1. Gravitatsioonimudel**

**Põhimõte**: Liikumise tõenäosus kahe punkti vahel sõltub nende "massist" (nt elanike arv, töökohtade arv) ja kaugusest nende vahel.

**Valem** (lihtsustatud kujul): $ T_{ij} = \frac{P_i \cdot A_j}{d_{ij}^\beta} $

- ( T_{ij} ): liikumiste arv punktist ( i ) punkti ( j )
- ( P_i ): lähtekoha "mass" (nt leibkondade arv)
- ( A_j ): sihtkoha atraktiivsus (nt väljapääsupunkti kaal)
- ( d_{ij} ): kaugus lähte- ja sihtpunkti vahel
- ( \beta ): kauguse mõju eksponent (tavaliselt 1–2)

**Plussid**:

- Lihtne ja intuitiivne.
- Hästi sobiv, kui sul on teada väljapääsupunktide kaalud.

---

### **2. Huffi mudel**

**Põhimõte**: Tõenäosus, et inimene valib sihtkoha ( j ), sõltub selle atraktiivsusest ja kaugusest võrreldes kõigi teiste võimalike sihtkohtadega.

**Valem**: $ P_{ij} = \frac{A_j / d_{ij}^\beta}{\sum_k A_k / d_{ik}^\beta} $

- ( P_{ij} ): tõenäosus, et leibkond ( i ) valib sihtkoha ( j )
- ( A_j ): sihtkoha atraktiivsus
- ( d_{ij} ): kaugus
- Summa nimetajas käib üle kõigi võimalike sihtkohtade ( k )

**Plussid**:

- Võimaldab modelleerida konkurentsi sihtkohtade vahel.
- Sobib hästi, kui on mitu väljapääsupunkti ja soovid modelleerida valikukäitumist.

---

### **Kumba eelistada?**

|Kriteerium|Gravitatsioonimudel|Huffi mudel|
|---|---|---|
|Lihtsus|✅|❌|
|Konkurents sihtkohtade vahel|❌|✅|
|Vajadus absoluutarvude järele|✅ (annab liikumiste arvu)|❌ (annab tõenäosuse)|
|Sobivus väljapääsupunktide kaalude kasutamiseks|✅|✅|

**Soovitus**:

- Kui soovid **lihtsat ja otsest liikumiste arvu** modelleerimist, kasuta **gravitatsioonimudelit**.
- Kui soovid **tõenäosuslikku ja konkurentsipõhist valikut**, kasuta **Huffi mudelit**.

---

Kas soovid, et aitaksin ühe neist mudelitest rakendada sinu andmetele? Kui sul on olemas:

- Leibkondade asukohad,
- Väljapääsupunktid koos kaaludega,
- Teedevõrgu struktuur,

siis saan aidata simuleerida liikumisi ja arvutada servade koormused. Soovi korral võid ka andmefailid üles laadida.

Et saaksin aidata liikumiste modelleerimise ja visualiseerimisega, oleks hea, kui andmed oleksid struktureeritud järgmistes formaatides. Siin on ülevaade vajaminevatest andmetest ja nende soovituslik struktuur:

---

### 📍 **1. Leibkondade asukohad**

**Failinimi**: `households.csv`  
**Vorming**: CSV  
**Veerud**:

- `id` – unikaalne identifikaator
- `lat` – laiuskraad
- `lon` – pikkuskraad

**Näide**:

```csv
id,lat,lon
1,58.8881,22.5832
2,58.8890,22.5840
...
```

---

### 🚪 **2. Väljapääsupunktid (atraktiivsed sihtkohad)**

**Failinimi**: `exits.csv`  
**Vorming**: CSV  
**Veerud**:

- `id` – unikaalne identifikaator
- `lat` – laiuskraad
- `lon` – pikkuskraad
- `weight` – atraktiivsuse kaal (nt töökohtade arv, liiklusvool jne)

**Näide**:

```csv
id,lat,lon,weight
A,58.9000,22.6000,1.5
B,58.9100,22.6100,2.0
...
```

---

### 🛣️ **3. Teedevõrk (graafi servad)**

**Failinimi**: `edges.csv`  
**Vorming**: CSV  
**Veerud**:

- `edge_id` – unikaalne identifikaator
- `start_lat`, `start_lon` – alguspunkti koordinaadid
- `end_lat`, `end_lon` – lõpp-punkti koordinaadid

**Näide**:

```csv
edge_id,start_lat,start_lon,end_lat,end_lon
1,58.8881,22.5832,58.8890,22.5840
2,58.8890,22.5840,58.8900,22.5850
...
```

---

### ✅ **Valikuline: Tippude loetelu**

Kui sul on olemas ka tippude (nodes) fail, võib see aidata täpsemalt graafi koostada.

---

Kui sul on need failid olemas või osaliselt olemas, võid need siia üles laadida. Aitan seejärel:

- luua graafi,
- arvutada liikumised (nt gravitatsioonimudeli alusel),
- jaotada need servadele,
- arvutada väljapääsupunktide koormused,
- ning soovi korral visualiseerida tulemused.

Kas soovid alustada failide üleslaadimisega?

[[SQL päringud]]

Tulemused on edukalt salvestatud! Siin on allalaaditavad failid:

- 📄 [links_with_gid.csv](blob:https://www.microsoft365.com/537ffbfb-8ae1-4c57-9437-851724efd2c9) – sisaldab kõiki teelõike koos määratud GID-idega.
- 📍 [exit_points.csv](blob:https://www.microsoft365.com/b3ba807e-4d60-47b2-a7b7-e13f53c3ac08) – sisaldab koordinaate punktidest, kus kohalikud teed puutuvad kokku `tertiary` või `secondary` teedega (väljapääsupunktid).

Kas soovid nüüd näiteks:

- Visualiseerida neid võrke ja väljapääsupunkte kaardil?
- Alustada liikumiste modelleerimist nende GID-ide põhjal?

Anna teada, kuidas saan edasi aidata!

Fail on edukalt loodud! 🎉

📍 [exit_points_with_gid.csv](blob:https://www.microsoft365.com/9b539dcb-2756-4a97-92e4-1ee6dde73f27) sisaldab:

- **Koordinaate** (`lat`, `lon`) igast väljapääsupunktist,
- **GID** väärtust, mis näitab, millise isoleeritud kohaliku teedevõrguga see punkt on seotud.

Kui üks punkt ühendab mitut võrku (nt kui `tertiary` või `secondary` tee lõikab võrgu osadeks), siis on see punkt failis mitu korda – iga kord erineva GID-iga.

Kas soovid nüüd:

- Visualiseerida neid võrke ja väljapääsupunkte?
- Alustada liikumiste modelleerimist nende GID-ide põhjal?

Anna teada, kuidas saan edasi aidata!

Et laadida CSV-failid `exit_points_with_gid.csv` ja `links_with_gid.csv` PostGIS andmebaasi, saad kasutada järgmisi SQL-päringuid koos `\COPY` käsuga PostgreSQL terminalis (`psql`) või tööriistaga nagu pgAdmin. Eeldame, et failid on salvestatud serveri või kliendi failisüsteemi ja sisaldavad sobivaid veerge.

---

### 📍 **1. `exit_points_with_gid.csv` laadimine**

**CSV veerud**: `lon`, `lat`, `GID`  
**Soovitatav tabelistruktuur**:

```sql
CREATE TABLE exit_points_with_gid (
    id SERIAL PRIMARY KEY,
    gid INTEGER,
    geom GEOMETRY(Point, 3301) -- või muu sobiv SRID
);
```

**Andmete laadimine**:

```sql
\COPY exit_points_with_gid(gid, geom)
FROM PROGRAM 'awk -F\",\" \"NR>1{print \\\"POINT(\\\" \$1 \\\" \\\" \$2 \\\" )\\\"}\" exit_points_with_gid.csv | paste -d\",\" <(cut -d\",\" -f3 exit_points_with_gid.csv)' 
WITH (FORMAT csv);
```

Või lihtsamalt, kui kasutad Pythonit või ETL-tööriista, lae esmalt `lon`, `lat`, `gid` ja seejärel loo `geom` veerg SQL-is:

```sql
ALTER TABLE exit_points_with_gid
ADD COLUMN geom GEOMETRY(Point, 3301);

UPDATE exit_points_with_gid
SET geom = ST_SetSRID(ST_MakePoint(lon, lat), 3301);
```

---

### 🛣️ **2. `links_with_gid.csv` laadimine**

**CSV veerud**: sisaldab `id`, `osm_type`, `geom`, `GID`  
**Soovitatav tabelistruktuur**:

```sql
CREATE TABLE links_with_gid (
    id INTEGER PRIMARY KEY,
    osm_type TEXT,
    gid INTEGER,
    geom GEOMETRY(LineString, 3301) -- või muu sobiv SRID
);
```

**Andmete laadimine**:

```sql
\COPY links_with_gid(id, osm_type, gid, geom)
FROM 'links_with_gid.csv'
WITH (FORMAT csv, HEADER true);
```

Kui `geom` on WKT-kujul, siis teisenda see geomeetriaks:

```sql
ALTER TABLE links_with_gid
ALTER COLUMN geom TYPE GEOMETRY(LineString, 3301)
USING ST_SetSRID(ST_GeomFromText(geom), 3301);
```

---

Kas soovid, et koostan ka valmis skriptifailid nende päringute jaoks? Võin need salvestada `.sql` või `.sh` formaadis.

Siin on valmis PostgreSQL skript, mis loob otse andmebaasist `osm_kehtna_vald.links` järgmised tabelid:

- 🛣️ **`links_with_gid`** – sisaldab kohalikke teid koos GID väärtustega (isoleeritud võrgud).
- 📍 **`exit_points_with_gid`** – sisaldab väljapääsupunkte koos GID-dega, kus kohalikud teed puutuvad kokku `tertiary` või `secondary` teedega.

📄 Laadi skript alla siit: [create_links_and_exits.sql](blob:https://www.microsoft365.com/4546c905-02a2-4671-949d-0dc2a4f1ece4)

Skript kasutab:

- `pgr_connectedComponents` funktsiooni graafi komponentide leidmiseks (vajab pgRouting laiendust),
- `ST_DWithin` ruumilist võrdlust tippude ühendamiseks.

Kas soovid, et aitaksin ka selle skripti käivitamise või pgRouting seadistamisega?

pgRouting on PostgreSQL laiendus, mis lisab ruumilise graafiteooria funktsionaalsuse PostGIS-ile. Selle abil saad teha näiteks marsruutimist, võrguanalüüsi ja nagu meie puhul – leida ühendatud komponendid.

### ✅ **pgRoutingi seadistamine samm-sammult**

#### 1. **Eeldused**

- PostgreSQL on paigaldatud
- PostGIS on paigaldatud ja aktiveeritud andmebaasis

#### 2. **pgRoutingi paigaldamine**

**Linux (Debian/Ubuntu):**

```bash
sudo apt install postgresql-14-pgrouting
```

**macOS (Homebrew):**

```bash
brew install pgrouting
```

**Windows:** Kui kasutad PostgreSQL Installerit (nt. StackBuilder), vali sealt **pgRouting** lisamoodul.

---

#### 3. **pgRoutingi aktiveerimine andmebaasis**

Logi PostgreSQL andmebaasi:

```bash
psql -d sinu_andmebaas
```

Aktiveeri laiendus:

```sql
CREATE EXTENSION IF NOT EXISTS pgrouting;
```

Kontrolli, kas see õnnestus:

```sql
SELECT * FROM pg_extension WHERE extname = 'pgrouting';
```

---

#### 4. **Kontrolli, kas funktsioonid töötavad**

Näiteks:

```sql
SELECT * FROM pgr_version();
```

---

Kui soovid, võin koostada ka skripti, mis kontrollib ja paigaldab kõik vajalikud laiendused. Kas soovid seda?

