-
Notifications
You must be signed in to change notification settings - Fork 15
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
How ZTM data were parsed. #3
Comments
(I am not the author, but...) You can see the
If you implement your own |
Warszawski ZTM udostępnia dane w wymyślonym przez siebie formacie, więc niestety musiałem od podstaw napisać parser dla tych plików. Oznacza to, że najprawdopodobniej żaden fragment tego kodu nie będzie mógł być użyty do generowania danych dla innych miast. Dobra wiadomość jest taka, że jeżeli inne miasta używają standardowych formatów typu XML, wygenerowanie danych na ich podstawie powinno być znacznie prostsze. To tyle słowem wstępu, a teraz specyfikacja plików wynikowych - tych, które są konsumowane przez klienta. Wizualizacja potrzebuje trzech typów plików: danych geograficznych miasta (określających kształt, lokalizację na mapie, rozmiar warstwy itp.), danych dotyczących przystanków (kody, lokalizacja na mapie oraz informacje o możliwości przejścia piechotą pomiędzy przystankami) oraz połączeń komunikacyjnych pomiędzy przystankami (dla Warszawy jest 1.6 mln takich połączeń, więc zostały podzielone na wiele plików reprezentujących dni tygodnia oraz godziny). Interfejsy reprezentujące wewnętrzną strukturę tych plików zdefiniowane są w 1. Dane geograficzne miastaPierwszy plik nie ma żadnego związku z danymi ZTM, informacje na temat samego miasta można znaleźć w Wikipedii, wyekstrahować z Google Maps lub Open Street Maps. Skrypt interface ShapeData {
center?: L.LatLngTuple;
box?: L.LatLngTuple[];
hborder?: number[][];
vborder?: number[][];
size?: [number, number];
river?: number[];
}
Plan minimum do obsługi innego miasta to przygotowanie analogicznego obrazka wejściowego dla tegoż miasta oraz podmiana w skrypcie zapisanych na sztywno pozycji geograficznych center i box. 2. Dane komunikacyjneDane komunikacyjne można traktować jako graf skierowany, w którym wierzchołkami są przystanki a krawędziami połączenia pomiędzy przystankami. Wizualizacja wyróżnia dwa typy połączeń: proste oraz czasowe. type SimpleRoute = number
type TimedRoute = [number, number]
type SimpleRoutes = {[key: string]: SimpleRoute}
type TimedRoutes = {[key: string]: TimedRoute[]} Połączenie proste ( Koszt dojazdu do wszystkich punktów liczony jest po stronie klienta algorytmem Dijkstry. Algorytm może korzystać wymiennie z połączeń prostych oraz czasowych, przy czym połączenia proste są ładowane tylko raz przy starcie razem z danymi przystanków, natomiast połączenia czasowe są pobierane za każdym razem gdy użytkownik zmieni dzień lub godzinę wizualizacji. Dane połączeń dla Warszawy generuje skrypt 2.1. Dane przystankówPlik type Points = {[key: string]: Point} Natomiast pojedynczy przystanek jest opisany interfejsem: interface Point extends Site {
routes: SimpleRoutes;
visited?: boolean;
cost?: number;
code?: string;
color?: number[];
colorHex?: string;
lon: number;
lat: number;
} Większość pól jest wypełnianych po stronie klienta podczas generowania wizualizacji, w pliku json wypełnione są tylko trzy z nich: lon (długość geograficzna punktu), lat (szerokość geograficzna punktu) oraz routes (połączenia proste z innymi punktami). Poniżej przykład poprawnego jsona, który może być odczytany przez klienta. Plik definiuje 2 punkty o identyfikatorach "A" i "B", dodatkowo z punktu "A" do punktu "B" oraz z punktu "B" do punktu "A" istnieje połączenie o koszcie 5 minut. {
"A": {"lon":21.00818,"lat":52.2084,"routes":{"B":5}},
"B": {"lon":20.99212,"lat":52.1580,"routes":{"A":5}}
} Skrypt 2.2. Dane połączeńPliki z danymi połączeń mają następującą strukturę: type Routes = {[key: string]: TimedRoutes} Poniżej przykładowy plik json z definicjami połączeń. Plik zawiera połączenia z punktów "A" i "B". Punkt "A" ma po 2 połączenia z punktem "B" oraz 2 połączenia z punktem "C". Punkt "B" ma 2 połączenia z punktem "C". Połączenia zaczynają się od godziny 17 (bo 17 * 60 = 1020 minut od północy). {
"A":{"B":[[1020, 2], [1025, 2]],"C":[[1023, 4], [1030, 2]]},
"B":{"C":[[1020, 2], [1022, 3]]}
} W przypadku Warszawy istnieją osobne rozkłady dla dnia roboczego, soboty oraz niedzieli i świąt. Dodatkowo możliwe jest wybranie godziny wizualizacji, zatem ostatecznie dane połączeń podzielone zostały na pliki o nazwach z sufiksami zawierajacymi kod week, sat lub sun oraz liczbę od 0 do 23. Przykładowo plik |
Hi,
I'm considering reusing your project to prepare similar visualization for other Polish cities that provides timetable data of public transportation. For instance, Wrocław provides timetable in XML and GTFS, but the ZTM data your project is based on seems to be formatted custom way. Could you share some info how those data were formatted or how other type data could be consumed by your engine?
The text was updated successfully, but these errors were encountered: