@golemio/pid 3.13.2-dev.1802603210 → 3.13.2-dev.1803100353
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/cache/index.md +5 -0
- package/docs/cache/types/in_memory.md +58 -0
- package/docs/cache/types/psql.md +76 -0
- package/docs/cache/types/redis.md +314 -0
- package/docs/processing/index.md +17 -0
- package/docs/processing/input_realtime_data/http_mpvnet.md +153 -0
- package/docs/processing/input_realtime_data/tcp_dpp_bus.md +27 -0
- package/docs/processing/input_realtime_data/tcp_dpp_metro.md +24 -0
- package/docs/processing/input_realtime_data/tcp_dpp_tram.md +26 -0
- package/docs/processing/input_realtime_data/tcp_telmax_arriva_city.md +44 -0
- package/docs/processing/state_position_tracking/http_mpvnet.md +55 -0
- package/docs/{state_position_tracking/tcp_common.md → processing/state_position_tracking/tcp_dpp_common.md} +2 -14
- package/docs/{state_position_tracking/tcp_metro.md → processing/state_position_tracking/tcp_dpp_metro.md} +2 -9
- package/docs/processing/state_position_tracking/tcp_telmax_arriva_city.md +7 -0
- package/docs/processing/vehicle_types.md +32 -0
- package/package.json +1 -1
- package/docs/state_position_tracking/http.md +0 -113
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# In-memory cache
|
|
2
|
+
|
|
3
|
+
- Cachování v paměti instance služby
|
|
4
|
+
- Nejdříve se načtou data z PSQL, následně si instance služby data drží v paměti
|
|
5
|
+
- Variabilní nebo žádné TTL (tedy pro obnovení dat je nutné službu/instanci/pod restartovat)
|
|
6
|
+
- Vhodné pro data, která se často nemění, ale zároveň se nevyplatí je ukládat do Redisu
|
|
7
|
+
|
|
8
|
+
## Kolejové obvody
|
|
9
|
+
|
|
10
|
+
- Třída [CachedMetroRailTrackLookup](../../../src/integration-engine/vehicle-positions/workers/vehicle-positions/data-access/metro/CachedMetroRailtrackLookup.ts)
|
|
11
|
+
- Využití v rámci procesování metro zpráv manipulací shape anchor pointů na trase pro přesnější určení stavu vozidla (`on_track` X `at_stop`) a zpoždění na příjezdu/odjezdu do/ze zastávky
|
|
12
|
+
- Viz [MetroShapePointsFixer](../../../src/integration-engine/vehicle-positions/workers/vehicle-positions/helpers/metro/MetroShapePointsFixer.ts)
|
|
13
|
+
- TTL žádné
|
|
14
|
+
- :warning: Dříve se nové kolejové obvody načítaly podle potřeby ROPIDu (zpravidla 2x za rok), takže současný způsob cachování byl v pořádku. Nyní se načítají každý den spolu s JŘ stažením z Blob Storage (kde si soubor ROPIDu spravuje sám), takže je absence TTL kvůli neaktualizaci dat problematická (neaktuálnost kolejových obvodů a špatné určení stavu vozidla, případně zpoždění v zastávce), je potřeba to řešit jinak
|
|
15
|
+
|
|
16
|
+
```mermaid
|
|
17
|
+
flowchart TB;
|
|
18
|
+
initial[Příjem zprávy, zpárování s GTFS, uložení do DB]-->amqp_updateDelay[AMQP updateDelay];
|
|
19
|
+
amqp_updateDelay--select-->trips[(PSQL trips)];
|
|
20
|
+
amqp_updateDelay--select-->positions[(PSQL positions)];
|
|
21
|
+
|
|
22
|
+
trips--Anchor pointy neexistují-->anchor_points_new[Vytvoření anchor points podle GTFS shapes];
|
|
23
|
+
positions--Anchor pointy neexistují-->anchor_points_new;
|
|
24
|
+
trips--Anchor pointy existují-->anchor_points_exist[Načtení anchor points z Redisu];
|
|
25
|
+
positions--Anchor pointy existují-->anchor_points_exist;
|
|
26
|
+
|
|
27
|
+
anchor_points_new-->fixer[MetroShapePointsFixer];
|
|
28
|
+
fixer-->lookup[CachedMetroRailTrackLookup];
|
|
29
|
+
lookup--select pokud cache miss<-->railtrack[(PSQL metro railtrack data)];
|
|
30
|
+
lookup-->save_anchor_points[Uložení anchor points do Redisu];
|
|
31
|
+
save_anchor_points-->continue[Pokračování ve zpracování zprávy];
|
|
32
|
+
|
|
33
|
+
anchor_points_exist-->continue;
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Popisky vozidel
|
|
37
|
+
|
|
38
|
+
- Třída [VehicleDescriptorCachedRepository](../../../src/output-gateway/public/data-access/VehicleDescriptorCachedRepository.ts)
|
|
39
|
+
- Využití v rámci:
|
|
40
|
+
- Public VP detailu pro získání dodatečných informací o konkrétním vozidle na trase (pokud si uživatel vyžádá `scope[]=vehicle_descriptor`)
|
|
41
|
+
- Public odjezdů pro získání dodatečných informací (USB nabíječky, klimatizace) o vozidle na každém odjezdu z vybraných zastávek, pokud už víme, které vozidlo daný spoj obsluhuje
|
|
42
|
+
- TTL 4 hodiny
|
|
43
|
+
- Data stahujeme 2x denně, takže současný způsob cachování teď ničemu úplně nevadí
|
|
44
|
+
|
|
45
|
+
```mermaid
|
|
46
|
+
flowchart TB;
|
|
47
|
+
api_request_vp[GET /v2/public/vehiclepositions/$vehicle_id]-->process_vp[Zpracování API requestu];
|
|
48
|
+
api_request_departures[GET /v2/public/departureboards]-->process_departures[Zpracování API requestu];
|
|
49
|
+
|
|
50
|
+
process_vp--uživatel vyžádal vehicle_descriptor-->descriptor_repository[VehicleDescriptorCachedRepository];
|
|
51
|
+
process_vp--uživatel nevyžádal vehicle_descriptor-->continue[Pokračování ve zpracování];
|
|
52
|
+
|
|
53
|
+
process_departures--známe vozidlo k odjezdu-->descriptor_repository;
|
|
54
|
+
process_departures--neznáme vozidlo k odjezdu-->continue;
|
|
55
|
+
|
|
56
|
+
descriptor_repository--select pokud cache miss<-->descriptors[(PSQL vehicle descriptors)];
|
|
57
|
+
descriptor_repository-->continue;
|
|
58
|
+
```
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# PostgreSQL cache
|
|
2
|
+
|
|
3
|
+
- V současnosti cachujeme pouze kontext k danému RT spoji - tedy stav vozidla/spoje po poslední zpracované zprávě
|
|
4
|
+
- Nemusíme tedy dotahovat předchozí pozice z DB, ale veškeré informace máme ve sloupci `last_position_context` v tabulce `vehicle_positions_trips`
|
|
5
|
+
- Uložen jako JSON objekt s variabilními daty a atributy - v závislosti na stavu vozidla/spoje některé atributy chybí nebo jsou prázdné/null
|
|
6
|
+
- Pokud se jedná o první pozici na spoji, pak všechny atributy kromě `tripId` budou null a nepovinné atributy můžou chybět
|
|
7
|
+
- Aktuální interface viz [IVPTripsLastPositionContext](../../../src/schema-definitions/vehicle-positions/models/interfaces/VPTripsLastPositionInterfaces.ts)
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
interface IVPTripsLastPositionContext {
|
|
11
|
+
lastPositionId: string | null;
|
|
12
|
+
lastPositionLat?: number | null;
|
|
13
|
+
lastPositionLng?: number | null;
|
|
14
|
+
lastPositionOriginTimestamp: number | null;
|
|
15
|
+
lastPositionTracking: Feature<Point, IVPTripsPositionAttributes> | null;
|
|
16
|
+
lastPositionCanceled: boolean | null;
|
|
17
|
+
lastPositionLastStop: {
|
|
18
|
+
id: string | null;
|
|
19
|
+
sequence: number | null;
|
|
20
|
+
arrival_time: number | null;
|
|
21
|
+
arrival_delay: number | null;
|
|
22
|
+
departure_time: number | null;
|
|
23
|
+
departure_delay: number | null;
|
|
24
|
+
};
|
|
25
|
+
lastPositionDelay: number | null;
|
|
26
|
+
atStopStreak: IVPTripsComputedPositionAtStopStreak;
|
|
27
|
+
lastPositionBeforeTrackDelayed: {
|
|
28
|
+
delay: number | null;
|
|
29
|
+
origin_timestamp: Date;
|
|
30
|
+
} | null;
|
|
31
|
+
lastPositionState: StatePositionEnum | null;
|
|
32
|
+
lastStopSequence?: number | null;
|
|
33
|
+
lastPositionStateChange: string | null;
|
|
34
|
+
tripId: string;
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
- **lastPositionId** - ID poslední pozice, koresponduje ID záznamu v tabulce `vehiclepositions_positions`
|
|
39
|
+
- _poznámka_: využití během aktualizace tripu v databázi (lze nahradit přímo pozicí). Rovněž se využívá během propagace zpoždění
|
|
40
|
+
- **lastPositionLat** - poslední známá zeměpisná šířka vozidla
|
|
41
|
+
- _poznámka_: nepoužívá se a může být null, pokud je spoj zrušen a nepodařilo se zjistit poslední známou polohu
|
|
42
|
+
- **lastPositionLng** - poslední známá zeměpisná délka vozidla
|
|
43
|
+
- _poznámka_: nepoužívá se a může být null, pokud je spoj zrušen a nepodařilo se zjistit poslední známou polohu
|
|
44
|
+
- **lastPositionOriginTimestamp** - `origin_timestamp` poslední pozice (timestamp odeslání zprávy z vozidla)
|
|
45
|
+
- _poznámka_: využití během propagace zpoždění a určení duplikovaných zpráv. :warning: unix timestamp v milisekundách
|
|
46
|
+
- **lastPositionTracking** - pokud je poslední pozice tracked, pak je zde uložena jako GeoJSON objekt, jinak null
|
|
47
|
+
- _poznámka_: využití během určení stavu vozidla jedoucího z/do garáže, projetí poslední zastávky a ujeté trasy `shape_dist_traveled` a azimutu u propagované pozice
|
|
48
|
+
- **lastPositionCanceled** - indikátor, zda byl spoj předchozí zprávou deklarován jako zrušený
|
|
49
|
+
- _poznámka_: využití během aktualizace tripu v databázi. Zbytečné a lze nahradit stavem pozice
|
|
50
|
+
- **lastPositionLastStop** - informace o poslední zastávce, kterou vozidlo projelo
|
|
51
|
+
- _poznámka_: využití pouze pro výpočet zpoždění na zastávce
|
|
52
|
+
- **id** - GTFS ID zastávky. V současnosti je vždy null a nepoužívá se
|
|
53
|
+
- **sequence** - pořadí zastávky v rámci GTFS stop times
|
|
54
|
+
- **arrival_time** - čas příjezdu na zastávku podle GTFS
|
|
55
|
+
- **arrival_delay** - vypočítané zpoždění příjezdu na zastávku oproti GTFS v sekundách
|
|
56
|
+
- **departure_time** - čas odjezdu ze zastávky podle GTFS
|
|
57
|
+
- **departure_delay** - vypočítané zpoždění odjezdu ze zastávky oproti GTFS v sekundách
|
|
58
|
+
- **lastPositionDelay** - poslední vypočítané zpoždění vozidla na spoji
|
|
59
|
+
- _poznámka_: využití pouze pro výpočet zpoždění na zastávce
|
|
60
|
+
- **atStopStreak** - informace o délce pobytu vozidla na zastávce
|
|
61
|
+
- _poznámka_: využití pro přesnější určení zpoždění vozidla během pobytu na zastávce a taky pro výpočet zpoždění během příjezdu a odjezdu na zastávku
|
|
62
|
+
- **firstPositionTimestamp** - timestamp první pozice na zastávce
|
|
63
|
+
- **firstPositionDelay** - zpoždění v sekundách během první pozice na zastávce. Liší se od zpoždění během příjezdu na zastávku, které se počítá jinak
|
|
64
|
+
- **stop_sequence** - pořadí zastávky v rámci GTFS stop times
|
|
65
|
+
- **lastPositionBeforeTrackDelayed** - dodatečné informace o poslední pozici
|
|
66
|
+
- _poznámka_: vyplněno pouze v případě, že poslední pozice spoje byla zpropagována z předchozího spoje na oběhu, jinak null. Využití pro určení zpozdění vozidla a taky pro určení stavu vozidla jedoucího z/do garáže
|
|
67
|
+
- **delay** - zpoždění poslední pozice oproti GTFS v sekundách
|
|
68
|
+
- **origin_timestamp** - timestamp poslední pozice (timestamp odeslání zprávy z vozidla)
|
|
69
|
+
- **lastPositionState** - stav vozidla během poslední pozice
|
|
70
|
+
- _poznámka_: využití pro určení stavu a správné určení segmentu trasy (mezi jakými zastávkami se vozidlo nachází, díky tomu přesnější zpoždění vozidla)
|
|
71
|
+
- **lastStopSequence** - pořadí poslední projeté zastávky v rámci GTFS stop times
|
|
72
|
+
- _poznámka_: využití během určení, zda se vozidlo navrátilo na trase zpět
|
|
73
|
+
- **lastPositionStateChange** - timestamp poslední změny stavu vozidla
|
|
74
|
+
- _poznámka_: využití pro určení stavu vozidla a zda se má vůbec vypočítat zpoždění
|
|
75
|
+
- **tripId** - RT ID spoje, ke kterému se kontext vztahuje. Koresponduje ID záznamu v tabulce `vehiclepositions_trips`
|
|
76
|
+
- _poznámka_: využití během aktualizace tripu v databázi. Zbytečné, šlo by udělat lépe
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
# Redis cache
|
|
2
|
+
|
|
3
|
+
## Cache pro načítání GTFS jízdních řádů
|
|
4
|
+
|
|
5
|
+
### files:gtfsStatic:*
|
|
6
|
+
|
|
7
|
+
- Klíč `files:gtfsStatic:*`, kde `*` je název souboru, popř. cesta k souboru v případě ZIP archivu
|
|
8
|
+
- Hodnota CSV/JSON jako string
|
|
9
|
+
- TTL žádné
|
|
10
|
+
- Retence dat až do úspěšného načtení GTFS jíždních řádů
|
|
11
|
+
- Cache obsahuje všechny načtené soubory z ROPID FTP (viz [implementační dokumentace](../../implementation_documentation.md#files-gtfs-static#ropid-ftp-obecně))
|
|
12
|
+
- Menší soubory jsou ukládány pomocí `SET`, větší jsou streamovány pomocí knihovny [redis-wstream](https://github.com/jeffbski/redis-wstream) (`SET` + `APPEND`)
|
|
13
|
+
- Menší soubory jsou následně načteny pomocí `GET`, větší jsou streamovány z Redisu do PSQL pomocí knihovny [redis-rstream](https://github.com/jeffbski/redis-rstream) (`GETRANGE`)
|
|
14
|
+
|
|
15
|
+
### Flowchart
|
|
16
|
+
|
|
17
|
+
```mermaid
|
|
18
|
+
flowchart TD;
|
|
19
|
+
redis_1[("Redis files:gtfsStatic:*")];
|
|
20
|
+
redis_2[("Redis files:gtfsStatic:*")];
|
|
21
|
+
redis_3[("Redis files:gtfsStatic:*")];
|
|
22
|
+
|
|
23
|
+
psql[("PSQL ropidgtfs_*_tmp")];
|
|
24
|
+
amqp_transformAndSaveData[AMQP transformAndSaveData];
|
|
25
|
+
|
|
26
|
+
initial["Zpráva z cronu, stažení z ROPID FTP"];
|
|
27
|
+
initial--SET malý soubor-->redis_1;
|
|
28
|
+
initial--Wstream velký soubor-->redis_1;
|
|
29
|
+
initial-->amqp_transformAndSaveData;
|
|
30
|
+
|
|
31
|
+
amqp_transformAndSaveData--GET malý soubor<-->redis_2;
|
|
32
|
+
amqp_transformAndSaveData--Rstream velký soubor<-->redis_2;
|
|
33
|
+
amqp_transformAndSaveData--INSERT malý soubor-->psql;
|
|
34
|
+
amqp_transformAndSaveData--COPY stream velký soubor-->psql;
|
|
35
|
+
|
|
36
|
+
continue[Pokračování v načítání JŘ];
|
|
37
|
+
amqp_transformAndSaveData-->continue;
|
|
38
|
+
|
|
39
|
+
cache_manager["DataCacheManager"];
|
|
40
|
+
continue-->cache_manager;
|
|
41
|
+
cache_manager--Truncate-->redis_3;
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Cache pro GTFS-RT feedy
|
|
46
|
+
|
|
47
|
+
### files:gtfsRt
|
|
48
|
+
|
|
49
|
+
- Klíč `files:gtfsRt`, pomocný `files:gtfsRt_*_timestamp`, kde `*` je název feedu bez přípony
|
|
50
|
+
- Hodnota je hash mapa, kde klíč je název feedu s příponou `.pb`
|
|
51
|
+
- `trip_updates.pb`
|
|
52
|
+
- `vehicle_positions.pb`
|
|
53
|
+
- `pid_feed.pb`
|
|
54
|
+
- `alerts.pb`
|
|
55
|
+
- Hodnota v hash mapě je binární blob reprezentující specifický GTFS-RT feed
|
|
56
|
+
- Hodnota v pomocném klíči je unix timestamp poslední aktualizace daného feed v milisekundách
|
|
57
|
+
- TTL žádné
|
|
58
|
+
- Retence dat aktivní, vždy uchováváme nejnovější feedy
|
|
59
|
+
- Všechny feedy jsou ukládány pomocí `HSET`, pomocné timestampy pomocí `SET`
|
|
60
|
+
- Feedy jsou nabízený přes API `/v2/vehiclepositions/gtfsrt/{feed}`, kde `{feed}` je název feedu s příponou `.pb`
|
|
61
|
+
- Žádaný feed se načte pomocí `HGET` a vrátí se jako binární blob. Pokud feed neexistuje, vrátí se 404
|
|
62
|
+
- Pomocný timestamp se načte pomocí `GET` a vrátí se jako hodnota hlavičky `Last-Modified` převedená na ISO string. Pokud timestamp neexistuje, hodnota hlavičky bude unix timestamp 0 jako ISO string. Využívá se především pro monitoring a alerting
|
|
63
|
+
- Feedy se generují 3x za minutu (rabín 2x)
|
|
64
|
+
|
|
65
|
+
### Flowchart
|
|
66
|
+
|
|
67
|
+
```mermaid
|
|
68
|
+
flowchart TD;
|
|
69
|
+
redis_f_1[("Redis files:gtfsRt")];
|
|
70
|
+
redis_t_1[("Redis files:gtfsRt_*_timestamp")];
|
|
71
|
+
psql[("PSQL vehiclepositions_*, ropidvymi_*")];
|
|
72
|
+
|
|
73
|
+
connector[("OG Redis connector")];
|
|
74
|
+
repository["IE GtfsRtRedisRepository"];
|
|
75
|
+
|
|
76
|
+
get_gtfsrt["GET /v2/vehiclepositions/gtfsrt/$feed"];
|
|
77
|
+
|
|
78
|
+
initial["Zpráva z cronu, vygenerování feedů"];
|
|
79
|
+
initial--Select<-->psql;
|
|
80
|
+
initial-->repository;
|
|
81
|
+
repository--HSET *.pb-->redis_f_1;
|
|
82
|
+
repository--SET *_timestamp-->redis_t_1;
|
|
83
|
+
|
|
84
|
+
get_gtfsrt-->connector;
|
|
85
|
+
connector--HGET *.pb<-->redis_f_1;
|
|
86
|
+
connector--GET *_timestamp<-->redis_t_1;
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Cache pro zpracování RT dat
|
|
90
|
+
|
|
91
|
+
### gtfsRunSchedule:*
|
|
92
|
+
|
|
93
|
+
- TODO doplnit
|
|
94
|
+
|
|
95
|
+
### gtfsBlockSchedule:*
|
|
96
|
+
|
|
97
|
+
- TODO doplnit
|
|
98
|
+
|
|
99
|
+
### gtfsDelayComputation:*
|
|
100
|
+
|
|
101
|
+
- TODO doplnit
|
|
102
|
+
|
|
103
|
+
### Flowchart
|
|
104
|
+
|
|
105
|
+
```mermaid
|
|
106
|
+
flowchart TD;
|
|
107
|
+
todo["TODO"];
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Cache pro předzpracování a párování dat z Telmaxu (Arriva City)
|
|
111
|
+
|
|
112
|
+
### vpRegionalBusCisLookup:*
|
|
113
|
+
|
|
114
|
+
- TODO doplnit
|
|
115
|
+
|
|
116
|
+
### vpRegionalBusGtfsLookup:*
|
|
117
|
+
|
|
118
|
+
- TODO doplnit
|
|
119
|
+
|
|
120
|
+
### Flowchart
|
|
121
|
+
|
|
122
|
+
```mermaid
|
|
123
|
+
flowchart TD;
|
|
124
|
+
todo["TODO"];
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Cache pro public API
|
|
128
|
+
|
|
129
|
+
### vpPublicCache:*
|
|
130
|
+
|
|
131
|
+
- Hlavní komponentou je sorted set `vpPublicCache:$setId`, kde `$setId` je ID vygenerované datové sady (4 náhodné bajty reprentované hexadecimálně)
|
|
132
|
+
- Score je GPS souřadnice (`GEOADD`), member je ID vozidla. Sorted set se používá jako základ pro public VP (`GEOSEARCH`)
|
|
133
|
+
- ID nejnovější datové sady se propaguje přes PubSub channel `vpPublicCache`
|
|
134
|
+
- Další komponenty:
|
|
135
|
+
- `vpPublicCache:$setId:trip-$gtfsTripId` - list ID vozidel asociovaných s daným GTFS trip id (možnost více vozidel na jednom spoji)
|
|
136
|
+
- `vpPublicCache:$setId:vehicle-$vehicleId` - JSON jako string s informacemi o vozidle a spoji, které vykonává
|
|
137
|
+
- `vpPublicCache:$setId:future-trip-$gtfsTripId` - list ID vozidel asociovaných s daným GTFS trip id (možnost více vozidel na jednom spoji). Vozidlo je před trasou a vykonává předchozí spoj na oběhu (nemá se zobrazit na mapě). Využití v public odjezdech
|
|
138
|
+
- `vpPublicCache:$setId:future-vehicle-$vehicleId-$gtfsTripId` - JSON jako string s informacemi o vozidle. Vozidlo je před trasou a vykonává předchozí spoj na oběhu (nemá se zobrazit na mapě). Využití v public odjezdech a public VP detailu s GTFS lookupem
|
|
139
|
+
- `vpPublicCache:$setId:canceled-trips-$gtfsTripId` - JSON jako string s informacemi o zrušeném spoji. Využití v public odjezdech
|
|
140
|
+
- TTL 1 minuta
|
|
141
|
+
- Nová datová sada se generuje přibližně jednou za 3 vteřiny a obsahuje všechny RT spoje (aktivní, budoucí a zrušené)
|
|
142
|
+
|
|
143
|
+
### vpPublicStopTimeCache:*
|
|
144
|
+
|
|
145
|
+
- Klíč `vpPublicStopTimeCache:*`, kde `*` je kombinace ID vozidla a GTFS id spoje (možnost více vozidel na jednom spoji)
|
|
146
|
+
- Hodnota je JSON jako string s informacemi o zastávkách a jejich časech
|
|
147
|
+
- `sequence` - pořadí zastávky podle GTFS stop times
|
|
148
|
+
- `arr_delay` - čas příjezdu na zastávku - reálný čas u projetých zastávek, predikce u budoucích
|
|
149
|
+
- `dep_delay` - čas odjezdu ze zastávky - reálný čas u projetých zastávek, predikce u budoucích
|
|
150
|
+
- `cis_stop_platform_code` - nástupiště/kolej podle CIS u vlakových zastávek, jinde null
|
|
151
|
+
- `platform_code` - označení zastávky podle GTFS
|
|
152
|
+
- `stop_id` - GTFS id zastávky
|
|
153
|
+
- TTL 1 hodina a 5 minut
|
|
154
|
+
- Automatické promazání dat po úspěšném načtení GTFS jíždních řádů
|
|
155
|
+
- Cca jednou za 5 vteřin se přenačtou stop times pro všechny aktivní spoje. Generování může běžet pouze jednou, po dokončení tasku se spustí znovu (max čekání 4.8 vteřin)
|
|
156
|
+
|
|
157
|
+
### gtfsPublicDepartureCache:*
|
|
158
|
+
|
|
159
|
+
- Klíč `gtfsPublicDepartureCache:*`, kde `*` je GTFS id zastávky
|
|
160
|
+
- Hodnota je sorted set, kde score je unix timestamp odjezdu v sekundách a member jsou relevantní informace o odjezdu
|
|
161
|
+
- Existuje záznam pro každou zastávku v GTFS. Pokud v ní ale není žádný odjezd, je vyplněný pouze jeden prázdný member - detekce validní zastávky bez odjezdu
|
|
162
|
+
- TTL 7 hodin
|
|
163
|
+
- Retence dat aktivní, jednou za hodinu se smažou všechny odjezdy starší než 3 hodiny
|
|
164
|
+
- Jednou za hodinu se vygenerují nové odjezdy pro všechny zastávky v intervalu +5 hodin až +7 hodin, po přenačtení JŘ se přegenerují všechny odjezdy v interval -3 hodiny až +7 hodin
|
|
165
|
+
- Ukládá se pomocí `ZADD`, čte se pomocí `ZRANGEBYSCORE` (-inf, now + `minutesAfter`)
|
|
166
|
+
- Využití v public odjezdech
|
|
167
|
+
|
|
168
|
+
### Flowchart (refresh)
|
|
169
|
+
|
|
170
|
+
```mermaid
|
|
171
|
+
flowchart LR;
|
|
172
|
+
finish_up_gtfs["Dokončení zpracování GTFS JŘ"];
|
|
173
|
+
|
|
174
|
+
psql_rt[("PSQL vehiclepositions_*")];
|
|
175
|
+
psql_stop_times[("PSQL v_public_vehiclepositions_combined_stop_times")];
|
|
176
|
+
psql_departures[("PSQL ropidgtfs_departures")];
|
|
177
|
+
|
|
178
|
+
redis_pubsub_channel["Redis channel vpPublicCache"];
|
|
179
|
+
redis_public_cache[("Redis vpPublicCache:*")];
|
|
180
|
+
redis_stop_times[("Redis vpPublicStopTimeCache:*")];
|
|
181
|
+
redis_departures[("Redis gtfsPublicDepartureCache:*")];
|
|
182
|
+
|
|
183
|
+
amqp_refreshPublicTripCache[AMQP refreshPublicTripCache];
|
|
184
|
+
%% amqp_refreshPublicTripCache--"Čekání max 2.4 vteřin od spuštění tasku"-->amqp_refreshPublicTripCache;
|
|
185
|
+
amqp_refreshPublicStopTimeCache[AMQP refreshPublicStopTimeCache];
|
|
186
|
+
%% amqp_refreshPublicStopTimeCache--"Čekání max 4.8 vteřin od spuštění tasku"-->amqp_refreshPublicStopTimeCache;
|
|
187
|
+
amqp_refreshPublicGtfsDepartureCache[AMQP refreshPublicGtfsDepartureCache];
|
|
188
|
+
|
|
189
|
+
cron_public_cache["Cron public VP 1x za minutu (backup)"];
|
|
190
|
+
cron_public_cache-->amqp_refreshPublicTripCache;
|
|
191
|
+
|
|
192
|
+
cron_stop_times["Cron zastávky spojů 1x za minutu (backup)"];
|
|
193
|
+
cron_stop_times-->amqp_refreshPublicStopTimeCache;
|
|
194
|
+
|
|
195
|
+
cron_departures["Cron odjezdy 1x za hodinu"];
|
|
196
|
+
cron_departures--"{fromHours: 5, toHours: 7}"-->amqp_refreshPublicGtfsDepartureCache;
|
|
197
|
+
|
|
198
|
+
finish_up_gtfs--"Truncate"-->redis_stop_times;
|
|
199
|
+
finish_up_gtfs--"{fromHours: -3, toHours: 7}"-->amqp_refreshPublicGtfsDepartureCache;
|
|
200
|
+
|
|
201
|
+
amqp_refreshPublicTripCache--"Aktivní spoje a jejich polohy"<-->psql_rt;
|
|
202
|
+
amqp_refreshPublicTripCache--"GEOADD + RPUSH + SET"-->redis_public_cache;
|
|
203
|
+
amqp_refreshPublicTripCache--"ID/název nové datové sady"-->redis_pubsub_channel;
|
|
204
|
+
|
|
205
|
+
amqp_refreshPublicStopTimeCache--"Zastávky u všech aktivních spojů"<-->psql_stop_times;
|
|
206
|
+
amqp_refreshPublicStopTimeCache--"MSET"-->redis_stop_times;
|
|
207
|
+
|
|
208
|
+
amqp_refreshPublicGtfsDepartureCache--"Odjezdy v intervalu"<-->psql_departures;
|
|
209
|
+
amqp_refreshPublicGtfsDepartureCache--"ZREMRANGEBYSCORE + ZADD"-->redis_departures;
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### Flowchart (public API VP)
|
|
213
|
+
```mermaid
|
|
214
|
+
flowchart TD;
|
|
215
|
+
redis_pubsub_channel["Redis channel vpPublicCache"];
|
|
216
|
+
redis_subscriber["VPSubscriber"];
|
|
217
|
+
redis_public_cache[("Redis vpPublicCache:* (RT info)")];
|
|
218
|
+
redis_public_cache_misc[("Redis vpPublicCache:* (aktivní, budoucí a zrušené spoje)")];
|
|
219
|
+
redis_repository["OG PublicVehiclePositionsRepository"];
|
|
220
|
+
|
|
221
|
+
redis_repository<-->redis_public_cache_misc;
|
|
222
|
+
redis_repository<-->redis_public_cache;
|
|
223
|
+
|
|
224
|
+
redis_subscriber--"Přihlášení k odběru"-->redis_pubsub_channel;
|
|
225
|
+
redis_pubsub_channel--"ID/název nové datové sady"-->redis_subscriber--"setCurrentSetName"-->redis_repository;
|
|
226
|
+
|
|
227
|
+
get_vp["GET /v2/public/vehiclepositions"];
|
|
228
|
+
get_vp--"GEOSEARCH + vehicle_id lookup pouze aktivních spojů"-->redis_repository;
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### Flowchart (public API VP detail)
|
|
232
|
+
```mermaid
|
|
233
|
+
flowchart TD;
|
|
234
|
+
redis_pubsub_channel["Redis channel vpPublicCache"];
|
|
235
|
+
redis_subscriber["VPSubscriber"];
|
|
236
|
+
redis_public_cache[("Redis vpPublicCache:* (RT info)")];
|
|
237
|
+
redis_public_cache_misc[("Redis vpPublicCache:* (aktivní, budoucí a zrušené spoje)")];
|
|
238
|
+
redis_stop_times[("Redis vpPublicStopTimeCache:*")];
|
|
239
|
+
redis_delay_computation[("Redis gtfsDelayComputation:* (pouze shapes)")];
|
|
240
|
+
redis_repository["OG PublicVehiclePositionsRepository"];
|
|
241
|
+
redis_repository<-->redis_public_cache_misc;
|
|
242
|
+
redis_repository<-->redis_public_cache;
|
|
243
|
+
|
|
244
|
+
redis_subscriber--"Přihlášení k odběru"-->redis_pubsub_channel;
|
|
245
|
+
redis_pubsub_channel--"ID/název nové datové sady"-->redis_subscriber--"setCurrentSetName"-->redis_repository;
|
|
246
|
+
|
|
247
|
+
get_vp_detail["GET /v2/public/vehiclepositions/$vehicle_id"];
|
|
248
|
+
|
|
249
|
+
get_vp_detail--"Lookup aktivního GTFS spoje"-->redis_repository;
|
|
250
|
+
get_vp_detail--"scope[]=stop_times"<-->redis_stop_times;
|
|
251
|
+
get_vp_detail--"scope[]=shapes"<-->redis_delay_computation;
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### Flowchart (public API VP detail with GTFS)
|
|
255
|
+
```mermaid
|
|
256
|
+
flowchart TD;
|
|
257
|
+
redis_pubsub_channel["Redis channel vpPublicCache"];
|
|
258
|
+
redis_subscriber["VPSubscriber"];
|
|
259
|
+
redis_public_cache[("Redis vpPublicCache:* (RT info)")];
|
|
260
|
+
redis_public_cache_misc[("Redis vpPublicCache:* (aktivní, budoucí a zrušené spoje)")];
|
|
261
|
+
redis_stop_times[("Redis vpPublicStopTimeCache:*")];
|
|
262
|
+
redis_delay_computation[("Redis gtfsDelayComputation:* (pouze shapes)")];
|
|
263
|
+
redis_repository["OG PublicVehiclePositionsRepository"];
|
|
264
|
+
|
|
265
|
+
redis_repository<-->redis_public_cache_misc;
|
|
266
|
+
redis_repository<-->redis_public_cache;
|
|
267
|
+
|
|
268
|
+
redis_subscriber--"Přihlášení k odběru"-->redis_pubsub_channel;
|
|
269
|
+
redis_pubsub_channel--"ID/název nové datové sady"-->redis_subscriber--"setCurrentSetName"-->redis_repository;
|
|
270
|
+
|
|
271
|
+
get_vp_detail_with_gtfs["GET /v2/public/vehiclepositions/$vehicle_id;gtfsTripId=$gtfsTripId"];
|
|
272
|
+
|
|
273
|
+
get_vp_detail_with_gtfs--"Lookup aktivního nebo budoucího GTFS spoje (exact match)"-->redis_repository;
|
|
274
|
+
get_vp_detail_with_gtfs--"scope[]=stop_times"<-->redis_stop_times;
|
|
275
|
+
get_vp_detail_with_gtfs--"scope[]=shapes"<-->redis_delay_computation;
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### Flowchart (public API GTFS static lookup)
|
|
279
|
+
|
|
280
|
+
:warning: GTFS static lookup neřeší RT informace a jako jediný EP je napojený přímo na PSQL. Kvůli předpokládáně nižšímu využití (detail odjezdů v budoucnosti) to tolik nevadí
|
|
281
|
+
|
|
282
|
+
```mermaid
|
|
283
|
+
flowchart TD;
|
|
284
|
+
psql_trip[("PSQL ropidgtfs_trips, ropidgtfs_routes, ropidgtfs_precomputed_trip_schedule")];
|
|
285
|
+
psql_stop_times[("PSQL ropidgtfs_stop_times, ropidgtfs_stops")];
|
|
286
|
+
psql_shapes[("PSQL ropidgtfs_shapes")];
|
|
287
|
+
|
|
288
|
+
get_gtfs_detail["GET /v2/public/gtfs/trips/$trip_id"];
|
|
289
|
+
get_gtfs_detail--"Lookup GTFS trip id"<-->psql_trip;
|
|
290
|
+
get_gtfs_detail--"scope[]=stop_times"<-->psql_stop_times;
|
|
291
|
+
get_gtfs_detail--"scope[]=shapes"<-->psql_shapes;
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
### Flowchart (public API departures)
|
|
295
|
+
```mermaid
|
|
296
|
+
flowchart TD;
|
|
297
|
+
redis_pubsub_channel["Redis channel vpPublicCache"];
|
|
298
|
+
redis_subscriber["VPSubscriber"];
|
|
299
|
+
redis_public_cache[("Redis vpPublicCache:* (RT info)")];
|
|
300
|
+
redis_public_cache_misc[("Redis vpPublicCache:* (aktivní, budoucí a zrušené spoje)")];
|
|
301
|
+
redis_departures[("Redis gtfsPublicDepartureCache:*")];
|
|
302
|
+
redis_repository["OG PublicVehiclePositionsRepository"];
|
|
303
|
+
|
|
304
|
+
redis_subscriber--"Přihlášení k odběru"-->redis_pubsub_channel;
|
|
305
|
+
redis_pubsub_channel--"ID/název nové datové sady"-->redis_subscriber--"setCurrentSetName"-->redis_repository;
|
|
306
|
+
|
|
307
|
+
get_departures["GET /v2/public/departureboards"];
|
|
308
|
+
|
|
309
|
+
get_departures--"Odjezdy pro zastávky"-->redis_departures;
|
|
310
|
+
get_departures--"Aktivní vozidlo podle GTFS trip id"-->redis_repository<-->redis_public_cache_misc;
|
|
311
|
+
rt_info["Obohacení o RT informace"];
|
|
312
|
+
get_departures--"Alespoň jedno vozidlo připadá nějakému spoji (aktivní, budoucí i zrušené) na odjezdu"-->rt_info;
|
|
313
|
+
rt_info--"RT informace o spoji"-->redis_repository<-->redis_public_cache;
|
|
314
|
+
```
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Dokumentace zpracování vstupních RT dat
|
|
2
|
+
|
|
3
|
+
- **Popis vstupních dat podle poskytovatele**
|
|
4
|
+
- [HTTP MPVNet](./input_realtime_data/http_mpvnet.md)
|
|
5
|
+
- [Městské a příměstské autobusy (mimo DPP)](./input_realtime_data/http_mpvnet.md#městské-a-příměstské-autobusy-mimo-dpp)
|
|
6
|
+
- [Přívozy](./input_realtime_data/http_mpvnet.md#přívozy)
|
|
7
|
+
- [Vlaky](./input_realtime_data/http_mpvnet.md#vlaky)
|
|
8
|
+
- [TCP DPP tramvaje](./input_realtime_data/tcp_dpp_tram.md)
|
|
9
|
+
- [TCP DPP autobusy a trolejbusy](./input_realtime_data/tcp_dpp_bus.md)
|
|
10
|
+
- [TCP DPP metro](./input_realtime_data/tcp_dpp_metro.md)
|
|
11
|
+
- [TCP Telmax Arriva City](./input_realtime_data/tcp_telmax_arriva_city.md)
|
|
12
|
+
- **Popis určení stavu vozidla na trase podle poskytovatele**
|
|
13
|
+
- [HTTP MPVNet](./state_position_tracking/http_mpvnet.md)
|
|
14
|
+
- [TCP DPP](./state_position_tracking/tcp_dpp_common.md)
|
|
15
|
+
- [TCP DPP metro](./state_position_tracking/tcp_dpp_metro.md)
|
|
16
|
+
- [TCP Telmax Arriva City](./state_position_tracking/tcp_telmax_arriva_city.md)
|
|
17
|
+
- [**Mapování MPVNet vehicle type na GTFS**](./vehicle_types.md)
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
# HTTP MPVNet
|
|
2
|
+
|
|
3
|
+
## Městské a příměstské autobusy (mimo DPP)
|
|
4
|
+
```xml
|
|
5
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
6
|
+
|
|
7
|
+
<m disp="http://77.93.194.81:8716/api">
|
|
8
|
+
|
|
9
|
+
<spoj ka="2" kb="0" den="2025-03-30" lin="100194" alias="194" spoj="4009" dopr="ABOUT ME" doprSkut="ABOUT ME" kmenl="194" t="3" tcis="A" np="true" po="2" vuzevc="1907" skol="false" posl="false" sled="2" lat="50.09078" lng="14.42738" cpoz="09:34:59" azimut="76" rychl="1" zast="63505" asw="14100002" zpoz_prij="-59">
|
|
10
|
+
<zast stan="A" odj="09:20" zast="59168" asw="29530001" zpoz_typ_odj="3" zpoz_odj="28" />
|
|
11
|
+
|
|
12
|
+
<zast stan="D" odj="09:23" zast="59104" asw="3610004" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="-33" zpoz_odj="9" />
|
|
13
|
+
|
|
14
|
+
<zast stan="I" odj="09:26" zast="57811" asw="3600009" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="-84" zpoz_odj="-44" />
|
|
15
|
+
|
|
16
|
+
<zast stan="A" odj="09:27" zast="59299" asw="7030081" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="-36" zpoz_odj="-3" />
|
|
17
|
+
|
|
18
|
+
<zast stan="B" odj="09:29" zast="63506" asw="14080002" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="-70" zpoz_odj="5" />
|
|
19
|
+
|
|
20
|
+
<zast stan="A" odj="09:32" zast="59300" asw="29620001" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="-94" zpoz_odj="-9" />
|
|
21
|
+
|
|
22
|
+
<zast stan="A" odj="09:33" zast="59108" asw="29630001" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="-18" zpoz_odj="-1" />
|
|
23
|
+
|
|
24
|
+
<zast stan="B" odj="09:35" zast="63505" asw="14100002" zpoz_typ_prij="3" zpoz_typ_odj="2" zpoz_prij="-59" zpoz_odj="0" />
|
|
25
|
+
|
|
26
|
+
<zast stan="A" odj="09:37" zast="63507" asw="14090001" zpoz_typ_prij="2" zpoz_typ_odj="2" zpoz_prij="0" zpoz_odj="0" />
|
|
27
|
+
|
|
28
|
+
<zast stan="B" odj="09:39" zast="59203" asw="29560002" zpoz_typ_prij="2" zpoz_typ_odj="2" zpoz_prij="0" zpoz_odj="0" />
|
|
29
|
+
|
|
30
|
+
<zast stan="B" odj="09:40" zast="58766" asw="320052" zpoz_typ_prij="2" zpoz_typ_odj="2" zpoz_prij="0" zpoz_odj="0" />
|
|
31
|
+
|
|
32
|
+
<zast stan="H" prij="09:41" zast="27863" asw="6890008" zpoz_typ_prij="2" zpoz_prij="0" />
|
|
33
|
+
</spoj>
|
|
34
|
+
|
|
35
|
+
</m>
|
|
36
|
+
```
|
|
37
|
+
- _spoj_ - informace o spoji a vozidlu
|
|
38
|
+
- **ka** - ??? nepoužíváme
|
|
39
|
+
- **kb** - ??? nepoužíváme
|
|
40
|
+
- **den** - datum, kdy spoj vyjel
|
|
41
|
+
- **lin** - označení linky podle CIS
|
|
42
|
+
- **alias** - číslo/označení linky podle CIS
|
|
43
|
+
- **spoj** - označení spoje podle CIS
|
|
44
|
+
- **dopr** - smluvní dopravce podle JŘ
|
|
45
|
+
- **doprSkut** - reálný dopravce vykonávající oběh
|
|
46
|
+
- **kmenl** - kmenová linka, může se lišit od **alias**
|
|
47
|
+
- **t** - typ vozidla, viz [vehicle_types.md](../vehicle_types.md)
|
|
48
|
+
- **tcis** - ??? nepoužíváme
|
|
49
|
+
- **np** - indikátor nízkopodlažnosti
|
|
50
|
+
- **po** - oběhové číslo
|
|
51
|
+
- **vuzevc** - [Evidenční číslo vozidla](https://cs.wikipedia.org/wiki/Eviden%C4%8Dn%C3%AD_%C4%8D%C3%ADslo_vozidla)
|
|
52
|
+
- **skol** - nejspíš indikátor školního spoje ??? nepoužíváme
|
|
53
|
+
- **posl** - nejspíš indikátor poslední spoje na oběhu ??? nepoužíváme
|
|
54
|
+
- **sled** - indikátor, zda je spoj sledovaný (tracked)
|
|
55
|
+
- 0 - nesledovaný (spoj je před trasou nebo dojel nebo je zrušen)
|
|
56
|
+
- 2 - sledovaný (spoj je na trase nebo v zastávce)
|
|
57
|
+
- **lat** - zeměpisná šířka
|
|
58
|
+
- **lng** - zeměpisná délka
|
|
59
|
+
- **cpoz** - čas odeslání zprávy (nejspíš z vozidla), nesmí být více než 5 minut v budoucnu
|
|
60
|
+
- **azimut** - azimut
|
|
61
|
+
- **rychl** - rychlost vozidla
|
|
62
|
+
- **zast** - aktuální nebo poslední projetá zastávka CIS (miniuzel)
|
|
63
|
+
- **asw** - aktuální nebo poslední projetá zastávka ASW
|
|
64
|
+
- **zpoz_prij** - zpoždění na příjezdu do aktuální nebo poslední projeté zastávky
|
|
65
|
+
- **zpoz_odj** - zpoždění na odjezdu z poslední projeté zastávky. Pokud je vozidlo v zastávce, pak není vyplněno
|
|
66
|
+
- **zrus** - indikátor, zda byl spoj zrušen
|
|
67
|
+
- **zrusod** - příklad 59168/A, nejspíš od které zastávky byl spoj zrušen ???
|
|
68
|
+
- _zast_ - informace o projetých i budoucích zastávkách spoje
|
|
69
|
+
- **stan** - stanoviště/nástupiště/kolej podle CIS
|
|
70
|
+
- **odj** - čas odjezdu za zastávky podle JŘ
|
|
71
|
+
- **prij** - čas příjezdu do zastávky podle JŘ
|
|
72
|
+
- **zast** - identifikátor miniuzlu (CIS), kam zastávka patří
|
|
73
|
+
- **asw** - ASW identifikátor zastávky
|
|
74
|
+
- **zpoz_typ_prij** - typ zpoždění příjezd do zastávky (2 predikce, 3 reálný stav)
|
|
75
|
+
- **zpoz_typ_odj** - typ zpoždění odjezd ze zastávky (2 predikce, 3 reálný stav)
|
|
76
|
+
- **zpoz_prij** - zpoždění příjezd do zastávky
|
|
77
|
+
- **zpoz_odj** - zpoždění příjezd do zastávky
|
|
78
|
+
|
|
79
|
+
## Přívozy
|
|
80
|
+
```xml
|
|
81
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
82
|
+
|
|
83
|
+
<m disp="http://77.93.194.81:8716/api">
|
|
84
|
+
|
|
85
|
+
<spoj ka="2" kb="0" den="2025-03-30" lin="199693" alias="P3" spoj="4096" dopr="VITTUS GROUP" doprSkut="VITTUS GROUP" kmenl="1803" t="12" tcis="P" np="true" po="1" vuzevc="302" skol="false" posl="false" sled="0" lat="50.04807" lng="14.41222" cpoz="09:18:29" azimut="337" rychl="2">
|
|
86
|
+
<zast stan="K" odj="09:32" zast="58997" asw="1100011" zpoz_typ_odj="2" zpoz_odj="0" />
|
|
87
|
+
|
|
88
|
+
<zast stan="K" prij="09:34" zast="28003" asw="3370011" zpoz_typ_prij="2" zpoz_prij="0" />
|
|
89
|
+
</spoj>
|
|
90
|
+
|
|
91
|
+
</m>
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Vlaky
|
|
95
|
+
```xml
|
|
96
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
97
|
+
|
|
98
|
+
<m disp="http://77.93.194.81:8716/api">
|
|
99
|
+
|
|
100
|
+
<spoj ka="1" kb="0" den="2025-03-30" lin="" alias="S8" spoj="9055" dopr="ČESKÉ DRÁHY" t="0" np="true" skol="false" posl="false" sled="2" lat="49.8657227" lng="14.4618721" cpoz="09:35:19" zast="5455746" zpoz_prij="600" zpoz_odj="600">
|
|
101
|
+
<zast stan="5S/22S" odj="08:25" zast="5457076" zpoz_typ_odj="3" zpoz_odj="720" />
|
|
102
|
+
|
|
103
|
+
<zast stan="-/6" prij="08:29" odj="08:30" zast="5457276" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="720" zpoz_odj="780" />
|
|
104
|
+
|
|
105
|
+
<zast stan="-/1" odj="08:34" zast="5457287" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="720" zpoz_odj="780" />
|
|
106
|
+
|
|
107
|
+
<zast stan="-/2" odj="08:38" zast="5457156" zpoz_zxtyp_prij="3" zpoz_typ_odj="3" zpoz_prij="660" zpoz_odj="720" />
|
|
108
|
+
|
|
109
|
+
<zast stan="2/-" prij="08:42" odj="08:43" zast="5457016" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="660" zpoz_odj="660" />
|
|
110
|
+
|
|
111
|
+
<zast stan="-/2" prij="08:46" odj="08:47" zast="5457386" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="720" zpoz_odj="720" />
|
|
112
|
+
|
|
113
|
+
<zast stan="-/1" odj="08:49" zast="5455526" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="780" zpoz_odj="840" />
|
|
114
|
+
|
|
115
|
+
<zast stan="-/3" odj="08:53" zast="5455536" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="720" zpoz_odj="780" />
|
|
116
|
+
|
|
117
|
+
<zast stan="-/1" odj="08:57" zast="5455556" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="720" zpoz_odj="780" />
|
|
118
|
+
|
|
119
|
+
<zast stan="2/3" prij="09:01" odj="09:02" zast="5455546" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="720" zpoz_odj="720" />
|
|
120
|
+
|
|
121
|
+
<zast stan="-/1" odj="09:05" zast="5458316" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="660" zpoz_odj="660" />
|
|
122
|
+
|
|
123
|
+
<zast stan="-/2" prij="09:12" odj="09:13" zast="5455696" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="600" zpoz_odj="600" />
|
|
124
|
+
|
|
125
|
+
<zast stan="-/1" odj="09:16" zast="5455716" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="600" zpoz_odj="660" />
|
|
126
|
+
|
|
127
|
+
<zast stan="-/1" odj="09:19" zast="5455726" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="600" zpoz_odj="660" />
|
|
128
|
+
|
|
129
|
+
<zast stan="-/1" odj="09:24" zast="5455746" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="600" zpoz_odj="600" />
|
|
130
|
+
|
|
131
|
+
<zast stan="-/1" prij="09:30" odj="09:31" zast="5455736" zpoz_typ_prij="2" zpoz_typ_odj="2" zpoz_prij="720" zpoz_odj="720" />
|
|
132
|
+
|
|
133
|
+
<zast prij="09:35" odj="09:36" zast="5455756" zpoz_typ_prij="2" zpoz_typ_odj="2" zpoz_prij="720" zpoz_odj="720" />
|
|
134
|
+
|
|
135
|
+
<zast prij="09:38" odj="09:39" zast="5455776" zpoz_typ_prij="2" zpoz_typ_odj="2" zpoz_prij="720" zpoz_odj="720" />
|
|
136
|
+
|
|
137
|
+
<zast prij="09:42" odj="09:43" zast="5455766" zpoz_typ_prij="2" zpoz_typ_odj="2" zpoz_prij="720" zpoz_odj="720" />
|
|
138
|
+
|
|
139
|
+
<zast odj="09:46" zast="5455796" zpoz_typ_prij="2" zpoz_typ_odj="2" zpoz_prij="720" zpoz_odj="720" />
|
|
140
|
+
|
|
141
|
+
<zast prij="09:49" odj="10:03" zast="5455786" zpoz_typ_prij="2" zpoz_typ_odj="2" zpoz_prij="720" zpoz_odj="720" />
|
|
142
|
+
|
|
143
|
+
<zast prij="10:06" odj="10:07" zast="5455806" zpoz_typ_prij="2" zpoz_typ_odj="2" zpoz_prij="720" zpoz_odj="720" />
|
|
144
|
+
|
|
145
|
+
<zast prij="10:11" odj="10:12" zast="5455816" zpoz_typ_prij="2" zpoz_typ_odj="2" zpoz_prij="720" zpoz_odj="720" />
|
|
146
|
+
|
|
147
|
+
<zast prij="10:14" odj="10:15" zast="5455096" zpoz_typ_prij="2" zpoz_typ_odj="2" zpoz_prij="720" zpoz_odj="720" />
|
|
148
|
+
|
|
149
|
+
<zast prij="10:19" zast="5455046" zpoz_typ_prij="2" zpoz_prij="300" />
|
|
150
|
+
</spoj>
|
|
151
|
+
|
|
152
|
+
</m>
|
|
153
|
+
```
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# TCP DPP autobusy a trolejbusy
|
|
2
|
+
|
|
3
|
+
```xml
|
|
4
|
+
<M>
|
|
5
|
+
|
|
6
|
+
<V turnus="144/3" line="144" evc="3885" np="ano" lat="50.12460" lng="14.45489" akt="06750004" takt="2025-03-30T18:10:04" konc="06490001" tjr="2025-03-30T18:10:00" pkt="473060" tm="2025-03-30T18:10:06" events="P"/>
|
|
7
|
+
|
|
8
|
+
</M>
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
- **turnus** - oběh
|
|
12
|
+
- **line** - linka
|
|
13
|
+
- **evc** - [Evidenční číslo vozidla](https://cs.wikipedia.org/wiki/Eviden%C4%8Dn%C3%AD_%C4%8D%C3%ADslo_vozidla)
|
|
14
|
+
- **np** - indikátor nízkopodlažnosti
|
|
15
|
+
- **lat** - zeměpisná šířka
|
|
16
|
+
- **lng** - zeměpisná délka
|
|
17
|
+
- **akt** - poslední projetá zastávka, nepoužíváme
|
|
18
|
+
- **takt** - timestamp odeslání zprávy z vozidla
|
|
19
|
+
- **konc** - poslední ASW zastávka spoje, nepoužíváme
|
|
20
|
+
- **tjr** - timestamp odeslání zprávy podle JŘ (v jaký čas mělo vozidlo na daném bodě být)
|
|
21
|
+
- **pkt** - identifikátor zprávy z vozidla/číslo TCP packetu??? Nepoužíváme
|
|
22
|
+
- **tm** - timestamp odeslání zprávy od DPP
|
|
23
|
+
- **events** - událost asociovaná se zprávou
|
|
24
|
+
- P - příjezd do zastávky
|
|
25
|
+
- O - odjezd ze zastávky
|
|
26
|
+
- V - spoj ukončen
|
|
27
|
+
- T - checkpoint na trase, vozidlo jen o sobě dává vědět
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# TCP DPP metro
|
|
2
|
+
|
|
3
|
+
```xml
|
|
4
|
+
<m linka="C" tm="2025-03-03T09:07:59Z" gvd="GD29c">
|
|
5
|
+
|
|
6
|
+
<vlak csp=" 6" csr=" 6" cv="225" ko="282901" odch="-25" />
|
|
7
|
+
|
|
8
|
+
<vlak csp="10" csr="10" cv="229" ko="313207" odch="0" />
|
|
9
|
+
|
|
10
|
+
<vlak csp="16" csr="16" cv="260" ko="3704" odch="15" />
|
|
11
|
+
|
|
12
|
+
<vlak csp="18" csr="18" cv="245" ko="4709" odch="50" />
|
|
13
|
+
|
|
14
|
+
</m>
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
- **linka** - označení linky, koresponduje s GTFS `route.short_name`
|
|
18
|
+
- **tm** - timestamp odeslání zprávy od DPP
|
|
19
|
+
- **gvd** - grafikon, nepoužíváme
|
|
20
|
+
- **csp** - oběhové číslo podle JŘ, nevěříme
|
|
21
|
+
- **csr** - oběhové číslo doopravdy, nevěříme
|
|
22
|
+
- **cv** - číslo spoje, koresponduje s trip_number v obehy.csv, unikátní v rámci linky
|
|
23
|
+
- **ko** - kolejový obvod, určení GPS souřadnic
|
|
24
|
+
- **odch** - odchylka oproti `tm`, určení zpoždění (záporné číslo znamená zpoždění)
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# TCP DPP tramvaje
|
|
2
|
+
|
|
3
|
+
```xml
|
|
4
|
+
<M>
|
|
5
|
+
|
|
6
|
+
<V turnus="12/2" line="12" evc="8544" lat="50.10486" lng="14.53100" akt="51440002" takt="2025-03-30T18:11:52" konc="00720002" tjr="2025-03-30T18:10:00" pkt="591646" tm="2025-03-30T18:11:52" events="O"/>
|
|
7
|
+
|
|
8
|
+
</M>
|
|
9
|
+
```
|
|
10
|
+
- **turnus** - oběh
|
|
11
|
+
- **line** - linka
|
|
12
|
+
- **evc** - [Evidenční číslo vozidla](https://cs.wikipedia.org/wiki/Eviden%C4%8Dn%C3%AD_%C4%8D%C3%ADslo_vozidla)
|
|
13
|
+
- **np** - indikátor nízkopodlažnosti
|
|
14
|
+
- **lat** - zeměpisná šířka
|
|
15
|
+
- **lng** - zeměpisná délka
|
|
16
|
+
- **akt** - poslední projetá zastávka, nepoužíváme
|
|
17
|
+
- **takt** - timestamp odeslání zprávy z vozidla
|
|
18
|
+
- **konc** - poslední ASW zastávka spoje, nepoužíváme
|
|
19
|
+
- **tjr** - timestamp odeslání zprávy podle JŘ (v jaký čas mělo vozidlo na daném bodě být)
|
|
20
|
+
- **pkt** - identifikátor zprávy z vozidla/číslo TCP packetu??? Nepoužíváme
|
|
21
|
+
- **tm** - timestamp odeslání zprávy od DPP
|
|
22
|
+
- **events** - událost asociovaná se zprávou
|
|
23
|
+
- P - příjezd do zastávky
|
|
24
|
+
- O - odjezd ze zastávky
|
|
25
|
+
- V - spoj ukončen
|
|
26
|
+
- T - checkpoint na trase, vozidlo jen o sobě dává vědět
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# TCP Telmax Arriva City + Arriva City Neratovice
|
|
2
|
+
|
|
3
|
+
```xml
|
|
4
|
+
<M>
|
|
5
|
+
|
|
6
|
+
<V imei="860425047186836" rz="5SB8545" pkt="573" lat="50.0451" lng="14.44866" tm="2025-03-30T18:07:09" events="Z" rych="13" smer="49" />
|
|
7
|
+
|
|
8
|
+
<V imei="862430061982423" rz="6SN8270" pkt="5527" lat="50.10773" lng="14.60353" tm="2025-03-30T18:07:11" events="P" line="100204" conn="4032" rych="0" smer="320" evc="9018" turnus="204716" ridic="200602" akt="55207" konc="55250" />
|
|
9
|
+
|
|
10
|
+
<V imei="867377023798816" rz="6SU3222" pkt="2837" lat="49.95867" lng="14.8828" tm="2025-03-30T18:07:09" events="Z" rych="39" smer="350" />
|
|
11
|
+
|
|
12
|
+
<V imei="867377023795952" rz="9U89136" pkt="1002" lat="49.86153" lng="14.58563" tm="2025-03-30T18:07:13" events="L" rych="48" smer="193" />
|
|
13
|
+
|
|
14
|
+
<V imei="867377023798816" rz="6SU3222" pkt="2838" lat="49.95876" lng="14.88278" tm="2025-03-30T18:07:10" events="Z" rych="39" smer="351" />
|
|
15
|
+
|
|
16
|
+
<V imei="867377023797230" rz="9U89064" pkt="939" lat="50.038" lng="14.45776" tm="2025-03-30T18:07:12" events="R" rych="11" smer="40" />
|
|
17
|
+
|
|
18
|
+
<V imei="867377023812609" rz="6AB1843" pkt="5024" lat="50.12651" lng="14.51493" tm="2025-03-30T18:07:11" events="T" rych="0" smer="347" />
|
|
19
|
+
|
|
20
|
+
<V imei="868711063963758" rz="6SU2942" pkt="4016" lat="50.07414" lng="14.56016" tm="2025-03-30T18:07:11" events="RZ" rych="13" smer="244" />
|
|
21
|
+
|
|
22
|
+
<V imei="867377023797214" rz="6AJ8958" pkt="4597" lat="50.09357" lng="14.49805" tm="2025-03-30T18:07:15" events="A" rych="15" smer="294" />
|
|
23
|
+
|
|
24
|
+
<V imei="867377023820230" rz="4AV4134" pkt="3974" lat="50.08041" lng="14.48195" tm="2025-03-30T18:07:11" events="L" rych="30" smer="78" />
|
|
25
|
+
|
|
26
|
+
</M>
|
|
27
|
+
```
|
|
28
|
+
- **imei** - identifikátor palubního počítače/vozidla, u nás `external_trip_id`
|
|
29
|
+
- **rz** - SPZ, nepoužíváme
|
|
30
|
+
- **pkt** - identifikátor zprávy z vozidla/číslo TCP packetu??? Nepoužíváme
|
|
31
|
+
- **lat** - zeměpisná šířka
|
|
32
|
+
- **lng** - zeměpisná délka
|
|
33
|
+
- **tm** - timestamp odeslání právy z vozidla
|
|
34
|
+
- **events** - událost asociovaná se zprávou
|
|
35
|
+
- **R** - výjezd ze zastávky
|
|
36
|
+
- **line** - označení linky podle CIS
|
|
37
|
+
- **conn** - označení spoje podle CIS
|
|
38
|
+
- **rych** - rychlost vozidla
|
|
39
|
+
- **smer** - azimut
|
|
40
|
+
- **evc** - [Evidenční číslo vozidla](https://cs.wikipedia.org/wiki/Eviden%C4%8Dn%C3%AD_%C4%8D%C3%ADslo_vozidla)
|
|
41
|
+
- **turnus** - jiný formát než DPP???, nepoužíváme
|
|
42
|
+
- **ridic** - ??? nepoužíváme
|
|
43
|
+
- **akt** - aktuální zastávka , nepoužíváme
|
|
44
|
+
- **konc** - poslední zastávka, nepoužíváme
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# HTTP MPVNet state_position
|
|
2
|
+
|
|
3
|
+
- Batch data chodí na VP-IG (vyšší jednotky MB během špičky)
|
|
4
|
+
- Formát vstupních dat viz [input_realtime_data/http_mpvnet.md](../input_realtime_data/http_mpvnet.md)
|
|
5
|
+
- (HTTP) Input Gateway
|
|
6
|
+
- Raw data se uloží na blob storage
|
|
7
|
+
- knihovnou `xml2js` se transformují na JSON
|
|
8
|
+
- validují se vůči JSON schématu a pošlou na Rabbita do fronty `saveDataToDB`
|
|
9
|
+
- saveDataToDB
|
|
10
|
+
- data se napasují na struktury tabulek `vehiclepositions_trips` a `vehiclepositions_positions` (stav je `unknown`, `tracking` se bere ze vstupních dat)
|
|
11
|
+
- všechny spoje se upsertují, nové spoje a jejich pozice se pošlou do fronty `updateGTFSTripId`, existující do `updateDelay`
|
|
12
|
+
- updateGTFSTripId
|
|
13
|
+
- duplikace vlakových spojů a pozic podle block id (určení tracking podle cis stop id)
|
|
14
|
+
- obohacení spojů GTFS daty (včetně oběhu a kmenové linky)
|
|
15
|
+
- upsert asociovaných pozic
|
|
16
|
+
- spoje se pošlou do fronty `updateDelay`
|
|
17
|
+
- updateDelay
|
|
18
|
+
- opět duplikace vlakových spojů, upsert asociovaných pozic
|
|
19
|
+
- opětovné načtení asociovaných pozic z DB
|
|
20
|
+
- určení trasy spoje podle GTFS shapes a stop times
|
|
21
|
+
- processing pozic, uložení do databáze
|
|
22
|
+
- Not tracking (`tracking` je `0` a nebo nepřišly souřadnice)
|
|
23
|
+
- pokud je poslední pozice neznámá, nebo je známá a ve stavu `on_track` nebo `at_stop`, je aktuální stav `before_track`
|
|
24
|
+
- pokud je poslední známá pozice s `tracking 2`
|
|
25
|
+
- pokud je pozice duplicitní (existuje pozice se stejným `origin_timestamp`), stav je `duplicate`
|
|
26
|
+
- jinak je stav `after_track`
|
|
27
|
+
- Tracking (`tracking` je `2`, souřadnice jsou známy)
|
|
28
|
+
- pokud je vozidlo 200 metrů od nejblizšího bodu (anchor points) na trase, stav je `off_track`
|
|
29
|
+
- pokud je nejbližší bod v zastávce, nastaví se stav na `at_stop`
|
|
30
|
+
- jinak je stav `on_track`
|
|
31
|
+
- Zrušený spoj (příznak `canceled` u pozice)
|
|
32
|
+
- stav je vždy `canceled`
|
|
33
|
+
- propagateDelay
|
|
34
|
+
- podle kmenové linky a oběhu vyhledáme navazující spoje
|
|
35
|
+
- podle GTFS trip id a registračního čísla poslední pozici ve stavu `before_track`
|
|
36
|
+
- přepsání stavu na `before_track_delayed`
|
|
37
|
+
|
|
38
|
+
```mermaid
|
|
39
|
+
flowchart TB;
|
|
40
|
+
A[HTTP data]-->B[VP HTTP Input Gateway]--raw data-->Blob[Azure Blob Storage];
|
|
41
|
+
B--JSON xml2js-->C[AMQP saveDataToDB]--upsert-->trips[(DB trips)];
|
|
42
|
+
C--nové spoje bez GTFS dat-->D[AMQP updateGTFSTripId];
|
|
43
|
+
C--existující spoje-->E[AMQP updateDelay];
|
|
44
|
+
D--upsert-->trips;
|
|
45
|
+
D--upsert-->positions[(DB positions)];
|
|
46
|
+
D--nové spoje s GTFS daty-->E;
|
|
47
|
+
E--upsert-->trips;
|
|
48
|
+
E--upsert-->positions;
|
|
49
|
+
E--select-->trips;
|
|
50
|
+
E--select-->positions;
|
|
51
|
+
E--uložené spoje-->F[AMQP propagateDelay];
|
|
52
|
+
F--select-->trips;
|
|
53
|
+
F--select-->positions;
|
|
54
|
+
F--upsert-->positions;
|
|
55
|
+
```
|
|
@@ -1,19 +1,7 @@
|
|
|
1
|
-
# TCP common state_position
|
|
1
|
+
# TCP DPP common state_position
|
|
2
2
|
|
|
3
3
|
- Data chodí na TCP-IG
|
|
4
|
-
|
|
5
|
-
```xml
|
|
6
|
-
<M>
|
|
7
|
-
<V turnus="17/3" line="17" evc="9168" np="ano" lat="50.05440" lng="14.41812" akt="03030001" takt="2022-08-02T21:56:22" konc="26200002" tjr="2022-08-02T21:56:00" pkt="1885317" tm="2022-08-02T21:56:22" events="O" />
|
|
8
|
-
</M>
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
```xml
|
|
12
|
-
<M>
|
|
13
|
-
<V turnus="134/3" line="134" evc="3738" np="ano" lat="50.03952" lng="14.42919" akt="07960001" takt="2022-06-29T17:28:13" konc="01100005" tjr="2022-06-29T17:23:00" pkt="12709236" tm="2022-06-29T17:28:22" events="O" />
|
|
14
|
-
</M>
|
|
15
|
-
```
|
|
16
|
-
|
|
4
|
+
- Formát vstupních dat viz [input_realtime_data/http_mpvnet.md](../input_realtime_data/tcp_dpp_bus.md) a [input_realtime_data/tcp_dpp_tram.md](../input_realtime_data/tcp_dpp_tram.md)
|
|
17
5
|
- Transport (TCP) Input Gateway
|
|
18
6
|
- Raw data se uloží na blob storage (1MB buffer)
|
|
19
7
|
- knihovnou `xml2js` transformují na JSON
|
|
@@ -1,14 +1,7 @@
|
|
|
1
|
-
# TCP metro state_position
|
|
1
|
+
# TCP DPP metro state_position
|
|
2
2
|
|
|
3
3
|
- Data chodí na TCP-IG
|
|
4
|
-
|
|
5
|
-
```xml
|
|
6
|
-
<m linka="A" tm="2022-07-20T13:45:34Z" gvd="GD20a">
|
|
7
|
-
<vlak csp=" 3" csr=" 3" cv="279" ko="1809" odch="25" />
|
|
8
|
-
<!--...-->
|
|
9
|
-
</m>
|
|
10
|
-
```
|
|
11
|
-
|
|
4
|
+
- Formát vstupních dat viz [input_realtime_data/tcp_dpp_metro.md](../input_realtime_data/tcp_dpp_metro.md)
|
|
12
5
|
- Transport (TCP) Input Gateway
|
|
13
6
|
- Raw data se uloží na blob storage (1MB buffer)
|
|
14
7
|
- knihovnou `xml2js` transformují na JSON
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# TCP Telmax Arriva City state_position
|
|
2
|
+
|
|
3
|
+
- Data chodí na TCP-IG
|
|
4
|
+
- Data využíváme pouze na rabínovi, na produkci bereme z MPVNetu
|
|
5
|
+
- Formát vstupních dat viz [input_realtime_data/tcp_telmax_arriva_city.md](../input_realtime_data/tcp_telmax_arriva_city.md)
|
|
6
|
+
- Transport (TCP) Input Gateway
|
|
7
|
+
- TODO doplnit
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Mapování MPVNet vehicle type na GTFS
|
|
2
|
+
|
|
3
|
+
## Typ vozidel podle MPV
|
|
4
|
+
- 0 - neznámý nebo vlak
|
|
5
|
+
- 1 - metro
|
|
6
|
+
- 2 - tramvaj
|
|
7
|
+
- 3 - autobus MHD
|
|
8
|
+
- 4 - příměstský autobus
|
|
9
|
+
- 5 - noční autobus
|
|
10
|
+
- 6 - noční tramvaj
|
|
11
|
+
- 7 - náhradní doprava
|
|
12
|
+
- 8 - lanovka
|
|
13
|
+
- 9 - školní spoj
|
|
14
|
+
- 10 - spoj pro lidi s hendikepem
|
|
15
|
+
- 11 - smluvní spoj
|
|
16
|
+
- 12 - loď
|
|
17
|
+
- 13 - vlak
|
|
18
|
+
- 14 - náhradní autobus za vlak
|
|
19
|
+
- 15 - náhradní tramvaj
|
|
20
|
+
- 16 - noční příměstský autobus
|
|
21
|
+
- 17 - ostatní
|
|
22
|
+
- 18 - trolejbus
|
|
23
|
+
|
|
24
|
+
## Typ vozidel podle GTFS
|
|
25
|
+
- 0 - tramvaj, podle MPV 2, 6, 15
|
|
26
|
+
- 1 - metro, podle MPV 1
|
|
27
|
+
- 2 - vlak, podle MPV 0 a 13
|
|
28
|
+
- 3 - autobus, podle MPV 3, 4, 5, 7, 16
|
|
29
|
+
- 4 - loď, podle MPV 12
|
|
30
|
+
- 7 - lanovka, podle MPV 8
|
|
31
|
+
- 11 - trolejbus, podle MPV 18
|
|
32
|
+
- 1700 - smíšený nebo neznámý, nemapujeme z MPV
|
package/package.json
CHANGED
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
# HTTP state_position
|
|
2
|
-
|
|
3
|
-
- Batch data chodí na VP-IG (několik MB)
|
|
4
|
-
|
|
5
|
-
```xml
|
|
6
|
-
<?xml version="1.0" encoding="utf-8"?>
|
|
7
|
-
<m disp="http://77.93.194.81:8716/api">
|
|
8
|
-
<spoj ka="2" kb="0" den="2023-03-21" lin="100115" alias="115" spoj="1061" dopr="ČSAD POLKOST"
|
|
9
|
-
doprSkut="ČSAD POLKOST" kmenl="115" t="3" tcis="A" np="true" po="39" vuzevc="1861"
|
|
10
|
-
skol="false" posl="false" sled="0" lat="50.0307" lng="14.49185" cpoz="10:00:04" azimut="337"
|
|
11
|
-
rychl="26">
|
|
12
|
-
<zast stan="B" odj="10:30" zast="56714" asw="520091" zpoz_typ_odj="2" zpoz_odj="0" />
|
|
13
|
-
<zast stan="B" odj="10:32" zast="56794" asw="11310002" zpoz_typ_odj="2" zpoz_odj="0" />
|
|
14
|
-
<zast stan="A" odj="10:34" zast="59066" asw="13410001" zpoz_typ_odj="2" zpoz_odj="0" />
|
|
15
|
-
<zast stan="A" odj="10:36" zast="67975" asw="11320001" zpoz_typ_odj="2" zpoz_odj="0" />
|
|
16
|
-
<zast stan="B" odj="10:37" zast="58953" asw="13340002" zpoz_typ_odj="2" zpoz_odj="0" />
|
|
17
|
-
<zast stan="A" odj="10:40" zast="58789" asw="1810001" zpoz_typ_odj="2" zpoz_odj="0" />
|
|
18
|
-
<zast stan="A" odj="10:41" zast="56794" asw="11310001" />
|
|
19
|
-
<zast stan="F" prij="10:43" zast="56714" asw="520002" />
|
|
20
|
-
</spoj>
|
|
21
|
-
<spoj ka="2" kb="0" den="2023-03-21" lin="100117" alias="117" spoj="1016" dopr="ABOUT ME"
|
|
22
|
-
doprSkut="ABOUT ME" kmenl="117" t="3" tcis="A" np="true" po="6" vuzevc="1950" skol="false"
|
|
23
|
-
posl="false" sled="0" lat="50.04645" lng="14.46061" cpoz="09:59:56" azimut="165" rychl="0"
|
|
24
|
-
zast="57408" asw="500006" zpoz_prij="14">
|
|
25
|
-
<zast stan="B" odj="08:55" zast="66826" asw="32360002" zpoz_typ_odj="3" zpoz_odj="35" />
|
|
26
|
-
<zast stan="B" odj="08:55" zast="67375" asw="9910002" zpoz_typ_odj="3" zpoz_odj="81" />
|
|
27
|
-
<zast stan="C" odj="08:56" zast="55206" asw="2800053" zpoz_typ_odj="3" zpoz_odj="119" />
|
|
28
|
-
<zast stan="B" odj="08:58" zast="55181" asw="620002" zpoz_typ_odj="3" zpoz_odj="113" />
|
|
29
|
-
<zast stan="H8" odj="08:59" zast="51228" asw="10060052" zpoz_typ_odj="3" zpoz_odj="121" />
|
|
30
|
-
<zast stan="A" odj="09:00" zast="67477" asw="26020001" zpoz_typ_odj="3" zpoz_odj="85" />
|
|
31
|
-
<zast stan="E" odj="09:02" zast="51227" asw="9290005" zpoz_typ_odj="3" zpoz_odj="68" />
|
|
32
|
-
<zast stan="A" odj="09:03" zast="51226" asw="9390001" zpoz_typ_odj="3" zpoz_odj="91" />
|
|
33
|
-
<zast stan="A" odj="09:05" zast="55233" asw="11580001" zpoz_typ_odj="3" zpoz_odj="81" />
|
|
34
|
-
<zast stan="D" odj="09:07" zast="43729" asw="760051" zpoz_typ_odj="3" zpoz_odj="2" />
|
|
35
|
-
<zast stan="A" odj="09:08" zast="55214" asw="170001" zpoz_typ_odj="3" zpoz_odj="31" />
|
|
36
|
-
<zast stan="A" odj="09:09" zast="55183" asw="7270001" zpoz_typ_odj="3" zpoz_odj="36" />
|
|
37
|
-
<zast stan="A" odj="09:11" zast="55257" asw="7720001" zpoz_typ_odj="3" zpoz_odj="-9" />
|
|
38
|
-
<zast stan="A" odj="09:12" zast="55220" asw="9950001" zpoz_typ_odj="3" zpoz_odj="-15" />
|
|
39
|
-
<zast stan="B" odj="09:13" zast="55188" asw="9270002" zpoz_typ_odj="3" zpoz_odj="-2" />
|
|
40
|
-
<zast stan="B" odj="09:15" zast="58807" asw="6250002" zpoz_typ_odj="3" zpoz_odj="-20" />
|
|
41
|
-
<zast stan="B" odj="09:16" zast="58781" asw="4460002" zpoz_typ_odj="3" zpoz_odj="-5" />
|
|
42
|
-
<zast stan="B" odj="09:17" zast="58863" asw="6580002" zpoz_typ_odj="3" zpoz_odj="1" />
|
|
43
|
-
<zast stan="D" odj="09:18" zast="58863" asw="6580004" zpoz_typ_odj="3" zpoz_odj="-9" />
|
|
44
|
-
<zast stan="A" odj="09:19" zast="59095" asw="3280001" zpoz_typ_odj="3" zpoz_odj="-24" />
|
|
45
|
-
<zast stan="A" odj="09:20" zast="58972" asw="600001" zpoz_typ_odj="3" zpoz_odj="-8" />
|
|
46
|
-
<zast stan="B" odj="09:21" zast="58836" asw="4940002" zpoz_typ_odj="3" zpoz_odj="-11" />
|
|
47
|
-
<zast stan="B" odj="09:22" zast="58976" asw="8570002" zpoz_typ_odj="3" zpoz_odj="22" />
|
|
48
|
-
<zast stan="D" odj="09:24" zast="58837" asw="4970004" zpoz_typ_odj="3" zpoz_odj="-4" />
|
|
49
|
-
<zast stan="A" odj="09:25" zast="58869" asw="7220001" zpoz_typ_odj="3" zpoz_odj="-3" />
|
|
50
|
-
<zast stan="B" odj="09:27" zast="47119" asw="8930002" zpoz_typ_odj="3" zpoz_odj="-28" />
|
|
51
|
-
<zast stan="H" odj="09:29" zast="27948" asw="4880008" zpoz_typ_odj="3" zpoz_odj="-56" />
|
|
52
|
-
<zast stan="A" odj="09:32" zast="57400" asw="4410001" zpoz_typ_odj="3" zpoz_odj="-38" />
|
|
53
|
-
<zast stan="B" odj="09:33" zast="57401" asw="10480002" zpoz_typ_odj="3" zpoz_odj="-7" />
|
|
54
|
-
<zast stan="B" odj="09:34" zast="59152" asw="9370002" zpoz_typ_odj="3" zpoz_odj="-11" />
|
|
55
|
-
<zast stan="B" odj="09:35" zast="59258" asw="9380002" zpoz_typ_odj="3" zpoz_odj="-6" />
|
|
56
|
-
<zast stan="B" odj="09:37" zast="58814" asw="3430002" zpoz_typ_odj="3" zpoz_odj="48" />
|
|
57
|
-
<zast stan="L" prij="09:39" zast="57408" asw="500006" zpoz_typ_prij="3" zpoz_prij="14" />
|
|
58
|
-
</spoj>
|
|
59
|
-
<!--...-->
|
|
60
|
-
</m>
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
- (HTTP) Input Gateway
|
|
64
|
-
- Raw data se uloží na blob storage
|
|
65
|
-
- knihovnou `xml2js` se transformují na JSON
|
|
66
|
-
- validují se vůči JSON schématu a pošlou na Rabbita do fronty `saveDataToDB`
|
|
67
|
-
- saveDataToDB
|
|
68
|
-
- data se napasují na struktury tabulek `vehiclepositions_trips` a `vehiclepositions_positions` (stav je `unknown`, `tracking` se bere ze vstupních dat)
|
|
69
|
-
- všechny spoje se upsertují, nové spoje a jejich pozice se pošlou do fronty `updateGTFSTripId`, existující do `updateDelay`
|
|
70
|
-
- updateGTFSTripId
|
|
71
|
-
- duplikace vlakových spojů a pozic podle block id (určení tracking podle cis stop id)
|
|
72
|
-
- obohacení spojů GTFS daty (včetně oběhu a kmenové linky)
|
|
73
|
-
- upsert asociovaných pozic
|
|
74
|
-
- spoje se pošlou do fronty `updateDelay`
|
|
75
|
-
- updateDelay
|
|
76
|
-
- opět duplikace vlakových spojů, upsert asociovaných pozic
|
|
77
|
-
- opětovné načtení asociovaných pozic z DB
|
|
78
|
-
- určení trasy spoje podle GTFS shapes a stop times
|
|
79
|
-
- processing pozic, uložení do databáze
|
|
80
|
-
- Not tracking (`tracking` je `0` a nebo nepřišly souřadnice)
|
|
81
|
-
- pokud je poslední pozice neznámá, nebo je známá a ve stavu `on_track` nebo `at_stop`, je aktuální stav `before_track`
|
|
82
|
-
- pokud je poslední známá pozice s `tracking 2`
|
|
83
|
-
- pokud je pozice duplicitní (existuje pozice se stejným `origin_timestamp`), stav je `duplicate`
|
|
84
|
-
- jinak je stav `after_track`
|
|
85
|
-
- Tracking (`tracking` je `2`, souřadnice jsou známy)
|
|
86
|
-
- pokud je vozidlo 200 metrů od nejblizšího bodu (anchor points) na trase, stav je `off_track`
|
|
87
|
-
- pokud je nejbližší bod v zastávce, nastaví se stav na `at_stop`
|
|
88
|
-
- jinak je stav `on_track`
|
|
89
|
-
- Zrušený spoj (příznak `canceled` u pozice)
|
|
90
|
-
- stav je vždy `canceled`
|
|
91
|
-
- propagateDelay
|
|
92
|
-
- podle kmenové linky a oběhu vyhledáme navazující spoje
|
|
93
|
-
- podle GTFS trip id a registračního čísla poslední pozici ve stavu `before_track`
|
|
94
|
-
- přepsání stavu na `before_track_delayed`
|
|
95
|
-
|
|
96
|
-
```mermaid
|
|
97
|
-
flowchart TB;
|
|
98
|
-
A[HTTP data]-->B[VP HTTP Input Gateway]--raw data-->Blob[Azure Blob Storage];
|
|
99
|
-
B--JSON xml2js-->C[AMQP saveDataToDB]--upsert-->trips[(DB trips)];
|
|
100
|
-
C--nové spoje bez GTFS dat-->D[AMQP updateGTFSTripId];
|
|
101
|
-
C--existující spoje-->E[AMQP updateDelay];
|
|
102
|
-
D--upsert-->trips;
|
|
103
|
-
D--upsert-->positions[(DB positions)];
|
|
104
|
-
D--nové spoje s GTFS daty-->E;
|
|
105
|
-
E--upsert-->trips;
|
|
106
|
-
E--upsert-->positions;
|
|
107
|
-
E--select-->trips;
|
|
108
|
-
E--select-->positions;
|
|
109
|
-
E--uložené spoje-->F[AMQP propagateDelay];
|
|
110
|
-
F--select-->trips;
|
|
111
|
-
F--select-->positions;
|
|
112
|
-
F--upsert-->positions;
|
|
113
|
-
```
|