User Tools

Site Tools


public:realtime:external_api:dynamic_full

Dynamiczne dane (realtime)

Powinny istnieć trzy oddzielne zasoby informujące system o aktualnej sytuacji floty pojazdów. Zasoby nr 2 i nr 3, połączone są z dyspozytornią - nie są wymagane do uruchomienia realtime, jednak ich wdrożenie zapewni pełniejszą informację pasażerską.

Zasoby:

  1. aktualne lokalizacje pojazdów
  2. przypisania pojazdów
  3. rodzaj taboru

Aktualne lokalizacje pojazdów

Dla utrzymania wydajności zasób z wszystkimi aktualnymi lokalizacjami powinien być cachowany po stronie operatora tj. system operatora powinien trzymać aktualny wynik dla całej sieci i tylko okresowo dopisywać do niego zmiany. Dzięki temu zapytanie z zewnętrznego systemu (np. jakdojade) nie będzie obciążać systemu realtime organizatora/przewoźnika (przez pobieranie poszczególnych pozycji pojazdów z wnętrza systemu). Może to być np. lista w pamięci operacyjnej zapisywana do formatu JSON w przypadku wystąpienia zapytania, lub fizyczny plik z JSONem na dysku wystawiony za pomocą serwera http/ftp (do którego ta lista jest zapisywana z pewną określoną częstotliwością).

Dzięki temu serwer jakdojade będzie mógł asynchronicznie odpytać o pozycje pojazdów i w każdym, dowolnym momencie otrzyma pełną listę znanych lokalizacji pojazdów.

Optymalnie system jakdojade wykonuje zapytanie o stan lokalizacji raz na sekundę - nawet jeśli system u operatora udostępnia pozycje poszczególnych pojazdów z mniejszą częstotliwością. Przykład:

  • pozycja pojazdu jest nadawana do systemu operatora co 120 sekund (tj każdy pojazd nadaje swoją lokalizacje co 120 sekund)
  • załóżmy, że serwer jakdojade odpytuje system operatora co 60 sekund
  • pozycja pojazdu A pojawiła się w systemie operatora o godzinie 15:00:10
  • serwer jakdojade zapytał o pozycje o godzinie 15:00:12
  • pozycja pojazdu B pojawiła się w systemie operatora o godzinie 15:00:15
  • pozycja pojazdu C pojawiła się w systemie operatora o godzinie 15:00:30
  • serwer jakdojade zapytał o pozycje o godzinie 15:01:12 (czyli przez 42 sek użytkownicy nie dostawali zmian dotyczących taboru - mimo, że nic nie stało na przeszkodzie przed taką aktualizacją - wewnętrznie system jakdojade aktualizuje interfejsy użytkownika raz na 5 sek)

Model danych

Jest to lista lokacji pojazdów. Dodatkowo został dodany numer wersji rozkładu (zasób statyczny) - dzięki temu w razie zmiany rozkładu system jakdojade będzie wiedział, że musi wczytać ponownie statyczne dane.

Lista powinna zawierać tylko wpisy dla aktywnych obecnie kursów. Jeśli z powodów technicznych jest to niemożliwe, powinna istnieć możliwość określenia aktywnych kursów (np. tylko te które mają wypełnione courseId).

Jeśli dostępny jest zasób Przypisania pojazdów, lista ta może zawierać informacje o wszystkich pojazdach we flocie (lub tych aktualnie używanych - np. jadących na podmianę innego uszkodzonego autobusu).

Dodatkowo wraz z lokalizacją danego pojazdu - może być obecna predykcja czasów dla następnych przystanków - dla danego kursu. Dzięki temu system jakdojade może wykorzystywać algorytmy dostarczane przez ITS do określania czasów przybycia pojazdów na przystanki - zamiast wyliczać je samodzielnie. Zapewni to spójność danych prezentowanych przez różne systemy.

PlantUML Graph

Opis modelu

RealtimeLocations

Zbiór pojazdów dla których jest dostępna informacja o lokalizacji.

  • timestamp: czas w którym został wygenerowany odczyt z wszystkimi liniami (pomocny w synchronizacji czasu, gdyby serwer ogranizatora/przewoźnika nie był automatycznie synchronizowany z usługami ntp - synchronizacja czasu)
  • scheduleVersion: identyfikator wygenerowanego rozkładu (pole musi odpowiadać wartości z pola version z obiektu Schedule z zosobów statycznych)
  • assignmentsVersion: identyfikator obecnych przypisań zadań do pojazdów (pole musi odpowiadać wartości z pola version z obiektu Assignments z zosobu 'przypisania pojazdów'). Wypełniony tylko w przypadku gdy istnieje zasób Przypisania pojazdów.
  • coordinateEncoding: kodowanie współrzędnych - domyślnie “WGS84”

RealtimeLocation

Pojedyńcza aktualna pozycja monitorowanego pojazdu.

  • timestamp: czas w którym został wygenerowany odczyt z pojazdu (np. pokładowy czas autokomputera, lub czas którym do systemu monitoringu realtime został przekazany odczyt z autokomputera)
  • coordinate: pozycja GPS odczytu
  • courseId: identyfikator kursu, który pozwoli dopasować odczyt do kursu w danym dniu (np identyfikator z bazy BusMan CB) - musi odpowiadac polu id z obiektu Course z zasobów statycznych. Pole to jest tak naprawdę koncepcyjne - i może zostać zastąpione przez np. grupę pól równoważnych, np. równie dobrym identyfikatorem kursu może być zbiór informacji: (numer_linii; nr_brygady; nr_kursu_na_brygadzie)
  • vehicleNo: numer boczny pojazdu; razem z zasobem zawierającym typy pojazdów pozwoli na określenie rodzaju pojazdu - np niskopodłogowość
  • stopCode: kod słupka przystanku który został ostatnio 'odwiedzony'
  • speed: aktualna prędkość pojazdu w momencie odczytu
  • brigade: brygada która wykonuje podany kurs (alternatywa dla courseId)
  • lineName: nazwa linii dla której jest wykonany dany kurs (alternatywa dla courseId)
  • courseBrigadeIndex: numer kursu na brygadzie (alternatywa dla courseId)
  • realtimePredictions: predykcja czasów na kolejnych przystankach dla danego kursu
  • coordinateEncoding: kodowanie współrzędnych - domyślnie takie jak w RealtimeLocations

RealtimePrediction

  • stopCode: kod słupka przystanku
  • predictedArrivalTimestamp: predykcja czasu przyjazdu pojazdu na danym przystanku
  • predictedDepartureTimestamp: predykcja czasu odjazdu pojazdu na danym przystanku

JSON

locations.json
{
  "timestamp": "04.05.2013 13:24:23",
  "scheduleVersion": "03.05.2013 23:14:23",
  "assignmentsVersion": "03.05.2013 00:14:23",
  "coordinateEncoding": "UTM 32V",
  "locations": [
    {
      "timestamp": "04.05.2013 14:14:23",
      "coordinate": "18.23424:52.234523",
      "courseId": "667",
      "vehicleNo": "506",
      "stopCode": "DEEC-02",
      "speed": 25.0
    },
    {
      "timestamp": "04.05.2013 14:14:14",
      "coordinate": "18.23426:52.234523",
      "courseId": "22421",
      "vehicleNo": "101",
      "stopCode": "ARC-02",
      "speed": 45.0,
      "coordinateEncoding": "UTM 33V",
    },
    {
      "timestamp": "04.05.2013 14:14:14",
      "coordinate": "18.23426:52.234523",
      "courseId": "22421",
      "vehicleNo": "101",
      "stopCode": "ARC-02",
      "realtimePredictions": [
         {
           "stopCode": "HETM-23",
           "predictedDepartureTimestamp": "04.05.2013 14:16:00",
         },
         {
           "stopCode": "KOLE-02",
           "predictedArrivalTimestamp": "04.05.2013 14:17:00",
           "predictedDepartureTimestamp": "04.05.2013 14:19:00",
         },
         ...
      ]
    },
    ...
  ]
}

Przypisane zadania

Wraz z rozkładem statycznym daje możliwość systemowi jakdojade wyliczyć i uwzględnić opóźnienia oraz wyłączenia dla nierozpoczętych jeszcze kursów.

Diagram modelu

PlantUML Graph

Opis modelu

Assignments

Lista przypisań pojazdów do kursów.

  • version: pole zawiera informację o wersji raportu (może to być timestamp z czasem ostatniej zmiany, musi odpowiadać wartości pola assignmentsVersion z obiektu RealtimeLocations)

Assignment

Planowane lub obecne przypisanie pojazdu do kursu.

  • courseId: identyfikator kursu (musi odpowiadać polu courseId z RealtimeLocation)
  • vehicleNo: planowany numer pojazdu dla podanego kursu
  • fromStopCode: początkowy kod słupka od którego obowiązuje dany pojazd, jeżeli pojazd obowiązuje tylko na części kursu - domyślna wartość: początkowy kod słupka z kursu
  • toStopCode: końcowy kod słupka od którego obowiązuje dany pojazd, jeżeli pojazd obowiązuje tylko na części kursu - domyślna wartość: końcowy kod słupka z kursu

Przykładowe zastosowanie informacji o zadaniach:

Awaria pojazdu - brak kursu

  • dyspozytor wie, że kurs o godzinie 10:23 nie wyruszy z pętli A ze względu na awarię pojazdu.
  • w związku z tym przypisuje w systemie informacje o takim zdarzeniu, Zasób 'planowane zadania' zwraca informacje z wypełnionym odpowiednim courseId, oraz vehicleNo ustawionym na wartość “DISABLED”.
  • jakdojade nie będzie proponować podróżnym tego kursu w wyszukiwarce, odpowiednio również oznaczy ten pojazd w tabliczkach rozkładowych

JSON

{
  "version": "24.05.2013 09:40:02",
  "assignments": [
    {
      "courseId": "234512",
      "vehicleNo": "DISABLED"
    },
    ...
  ]
}

Opóźnienie pojazdu na następnym kursie

  • kurs o identyfikatorze 777 o godzinie odjazdu 10:24 z pętli A jest wykonywany przez pojazd o nr 104 (planowany koniec w pętli B o 10:55)
  • jest godzina 10:50
  • na podstawie pozycji GPS i predykcji czasów przejazdów system jakdojade określił, że pojazd nie dotrze do pętli B wcześniej niż o 11:10
  • ten sam pojazd ma wykonać kurs o identyfikatorze 778 z pętli B o godzinie 11:05
  • istnieje zatem przypuszczenie, że pojazd ma 5 min opóźnienia dla kursu 778 (zostanie to pokazane podróżnym, oraz uwzględnione w algorytmach planujących podróż)

JSON

{
  "version": "23.05.2013 23:23:12",
  "assignments": [
    {
      "courseId": "777",
      "vehicleNo": "104"
    },
    {
      "courseId": "778",
      "vehicleNo": "104"
    },
    ...
  ]
}

Opóźnienie/awaria pojazdu z podmianą na pętli

  • kurs o identyfikatorze 777 o godzinie odjazdu 10:24 z pętli A jest wykonywany przez pojazd o nr 104 (planowany koniec w pętli B o 10:55)
  • jest godzina 10:55
  • na podstawie pozycji GPS i predykcji czasów przejazdów system jakdojade określił, że pojazd nie dotrze do pętli B wcześniej niż o 11:20
  • ten sam pojazd ma wykonać kurs o identyfikatorze 778 z pętli B o godzinie 11:05
  • dyspozytor podmienił pojazd na kursie 778 na nr 205
  • dzięki temu podróżni wiedzą, że kurs o godz. 11:05 zostanie wykonany planowo

JSON

{
  "version": "24.05.2013 10:58:22",
  "assignments": [
    {
      "courseId": "777",
      "vehicleNo": "104"
    },
    {
      "courseId": "778",
      "vehicleNo": "205"
    },
    ...
  ]
}

Opóźnienie/awaria pojazdu z podmianą na trasie

  • kurs o identyfikatorze 777 o godzinie odjazdu 10:24 z pętli A jest wykonywany przez pojazd o nr 104 (planowany koniec w pętli B o 10:55)
  • jest godzina 10:30, autobus uległ awarii w okolicy przystanku X
  • dyspozytor przypisał nowy autobus o nr 205 od przystanku X do tego kursu, oraz kursów następnych
  • od przystanku X podróżni są informowani o nowej predyjcji czasów na podstawie obecnego położenia pojazdu nr 205

JSON

{
  "version": "24.05.2013 10:38:22",
  "assignments": [
    {
      "courseId": "777",
      "vehicleNo": "104",
      "toStopCode": "X"
    },
    {
      "courseId": "778",
      "vehicleNo": "205",
      "fromStopCode": "X"
    },
    {
      "courseId": "779",
      "vehicleNo": "205"
    }
    ...
  ]
}

Rodzaj taboru

Lista zawierająca informacje o typach pojazdów oznaczonych poszczególnymi numerami.

PlantUML Graph

Opis modelu

VehicleTypes

Lista pojazdów.

VehicleType

Zbiór wszystkich pojazdów przewoźnika.

  • vehicleNo: numer boczny pojazdu
  • vehicleType: typ pojazdu (np. niskopodłogowy krótki, niskopodłogowy przegubowy…)

JSON

{
"vehicles": [
  {
    "vehicleType": "niskopodłogowy przegubowy",
    "vehicleNo": "104"
  },
  ...
]
}
public/realtime/external_api/dynamic_full.txt · Last modified: 2016/09/07 13:21 by mikolaj.grajek