@transportme/load-ptv-gtfs 1.0.0
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/.github/workflows/unit-test.yml +46 -0
- package/lib/constants.mjs +18 -0
- package/lib/gtfs-package/PTVGTFS.mjs +96 -0
- package/lib/gtfs-parser/GTFSAgency.mjs +15 -0
- package/lib/gtfs-parser/GTFSCalendar.mjs +63 -0
- package/lib/gtfs-parser/GTFSCalendarDate.mjs +15 -0
- package/lib/gtfs-parser/GTFSRoute.mjs +106 -0
- package/lib/gtfs-parser/GTFSShape.mjs +39 -0
- package/lib/gtfs-parser/GTFSStop.mjs +212 -0
- package/lib/gtfs-parser/GTFSStopTime.mjs +30 -0
- package/lib/gtfs-parser/GTFSTrip.mjs +169 -0
- package/lib/gtfs-parser/readers/GTFSAgencyReader.mjs +27 -0
- package/lib/gtfs-parser/readers/GTFSCalendarDatesReader.mjs +25 -0
- package/lib/gtfs-parser/readers/GTFSCalendarReader.mjs +63 -0
- package/lib/gtfs-parser/readers/GTFSReader.mjs +48 -0
- package/lib/gtfs-parser/readers/GTFSRouteReader.mjs +35 -0
- package/lib/gtfs-parser/readers/GTFSShapeReader.mjs +75 -0
- package/lib/gtfs-parser/readers/GTFSStopTimesReader.mjs +85 -0
- package/lib/gtfs-parser/readers/GTFSStopsReader.mjs +36 -0
- package/lib/gtfs-parser/readers/GTFSTripReader.mjs +61 -0
- package/lib/gtfs-parser/readers/line-reader.mjs +112 -0
- package/lib/loader/RouteLoader.mjs +101 -0
- package/lib/loader/ShapeLoader.mjs +86 -0
- package/lib/loader/StopsLoader.mjs +139 -0
- package/lib/loader/TripLoader.mjs +187 -0
- package/lib/post-processing/merge-stops.mjs +85 -0
- package/lib/post-processing/set-route-stops.mjs +73 -0
- package/lib/post-processing/set-stop-services.mjs +64 -0
- package/lib/utils.mjs +16 -0
- package/package.json +27 -0
- package/test/gtfs-calendar.test.mjs +182 -0
- package/test/gtfs-route-loader.test.mjs +190 -0
- package/test/gtfs-routes.test.mjs +77 -0
- package/test/gtfs-shapes-loader.test.mjs +105 -0
- package/test/gtfs-shapes.test.mjs +23 -0
- package/test/gtfs-stop-loader-metro.test.mjs +49 -0
- package/test/gtfs-stop-loader.test.mjs +223 -0
- package/test/gtfs-stop-times.test.mjs +37 -0
- package/test/gtfs-stops.test.mjs +290 -0
- package/test/gtfs-trip-loader.test.mjs +142 -0
- package/test/gtfs-trips.test.mjs +109 -0
- package/test/line-reader.test.mjs +94 -0
- package/test/merge-stops.test.mjs +376 -0
- package/test/ptv-gtfs.test.mjs +106 -0
- package/test/sample-data/calendar/calendar.txt +34 -0
- package/test/sample-data/calendar/calendar_dates.txt +26 -0
- package/test/sample-data/gtfs-splitting/force_unique_stops_bus.txt +7 -0
- package/test/sample-data/gtfs-splitting/force_unique_stops_tram.txt +3 -0
- package/test/sample-data/gtfs-splitting/line_reader_test.txt +8 -0
- package/test/sample-data/gtfs-splitting/name_overrides.txt +4 -0
- package/test/sample-data/gtfs-splitting/nov_2024_train_data.txt +6 -0
- package/test/sample-data/gtfs-splitting/sample_stops.txt +20 -0
- package/test/sample-data/gtfs-splitting/special_chars_stops_csv.txt +6 -0
- package/test/sample-data/gtfs-splitting/stops_without_secondary.txt +6 -0
- package/test/sample-data/gtfs-unzipping/gtfs.zip +0 -0
- package/test/sample-data/one_line.csv +2 -0
- package/test/sample-data/routes/agency.txt +11 -0
- package/test/sample-data/routes/metro_bus_routes.txt +4 -0
- package/test/sample-data/routes/metro_lines.txt +5 -0
- package/test/sample-data/routes/regional_bus_routes.txt +7 -0
- package/test/sample-data/routes/vline.txt +7 -0
- package/test/sample-data/routes/west_gipp_transit.txt +20 -0
- package/test/sample-data/shapes/shapes.txt +89 -0
- package/test/sample-data/shapes/stop_times.txt +9 -0
- package/test/sample-data/shapes/stops.txt +4 -0
- package/test/sample-data/shapes/trips.txt +4 -0
- package/test/sample-data/stop-data/name-overrides.json +25 -0
- package/test/sample-data/stop-data/unique-stops.json +1 -0
- package/test/sample-data/suburbs.json +77 -0
- package/test/sample-data/trips/bus_trips.txt +5 -0
- package/test/sample-data/trips/stop_times.txt +29 -0
- package/test/sample-data/trips/stop_times_new.txt +8 -0
- package/test/sample-data/trips/stops.txt +8 -0
- package/test/sample-data/trips/trips.txt +5 -0
- package/test/sample-data/trips/trips_new.txt +2 -0
- package/test/set-stop-services.test.mjs +69 -0
- package/test/utils-test.mjs +26 -0
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
import { expect } from 'chai'
|
|
2
|
+
import merge from '../lib/post-processing/merge-stops.mjs'
|
|
3
|
+
|
|
4
|
+
describe('The stop merger', () => {
|
|
5
|
+
it('Should insert a deviation (Altona Loop)', () => {
|
|
6
|
+
let variants = [
|
|
7
|
+
[
|
|
8
|
+
{ "stopName" : "Yarraville", "stopGTFSID" : "19996" },
|
|
9
|
+
{ "stopName" : "Spotswood", "stopGTFSID" : "19995" },
|
|
10
|
+
{ "stopName" : "Newport", "stopGTFSID" : "19994" },
|
|
11
|
+
{ "stopName" : "Seaholme", "stopGTFSID" : "19927" },
|
|
12
|
+
{ "stopName" : "Altona", "stopGTFSID" : "19926" },
|
|
13
|
+
{ "stopName" : "Westona", "stopGTFSID" : "19925" },
|
|
14
|
+
{ "stopName" : "Laverton", "stopGTFSID" : "19923" },
|
|
15
|
+
{ "stopName" : "Aircraft", "stopGTFSID" : "19924" }
|
|
16
|
+
], [
|
|
17
|
+
{ "stopName" : "North Melbourne", "stopGTFSID" : "19973" },
|
|
18
|
+
{ "stopName" : "South Kensington", "stopGTFSID" : "20026" },
|
|
19
|
+
{ "stopName" : "Footscray", "stopGTFSID" : "20025" },
|
|
20
|
+
{ "stopName" : "Seddon", "stopGTFSID" : "19997" },
|
|
21
|
+
{ "stopName" : "Yarraville", "stopGTFSID" : "19996" },
|
|
22
|
+
{ "stopName" : "Spotswood", "stopGTFSID" : "19995" },
|
|
23
|
+
{ "stopName" : "Newport", "stopGTFSID" : "19994" },
|
|
24
|
+
{ "stopName" : "Laverton", "stopGTFSID" : "19923" },
|
|
25
|
+
{ "stopName" : "Aircraft", "stopGTFSID" : "19924" },
|
|
26
|
+
{ "stopName" : "Williams Landing", "stopGTFSID" : "46468" },
|
|
27
|
+
{ "stopName" : "Hoppers Crossing", "stopGTFSID" : "19922" },
|
|
28
|
+
{ "stopName" : "Werribee", "stopGTFSID" : "19921" }
|
|
29
|
+
]
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
expect(merge(variants)).to.deep.equal([
|
|
33
|
+
{ "stopName" : "North Melbourne", "stopGTFSID" : "19973" },
|
|
34
|
+
{ "stopName" : "South Kensington", "stopGTFSID" : "20026" },
|
|
35
|
+
{ "stopName" : "Footscray", "stopGTFSID" : "20025" },
|
|
36
|
+
{ "stopName" : "Seddon", "stopGTFSID" : "19997" },
|
|
37
|
+
{ "stopName" : "Yarraville", "stopGTFSID" : "19996" },
|
|
38
|
+
{ "stopName" : "Spotswood", "stopGTFSID" : "19995" },
|
|
39
|
+
{ "stopName" : "Newport", "stopGTFSID" : "19994" },
|
|
40
|
+
{ "stopName" : "Seaholme", "stopGTFSID" : "19927" },
|
|
41
|
+
{ "stopName" : "Altona", "stopGTFSID" : "19926" },
|
|
42
|
+
{ "stopName" : "Westona", "stopGTFSID" : "19925" },
|
|
43
|
+
{ "stopName" : "Laverton", "stopGTFSID" : "19923" },
|
|
44
|
+
{ "stopName" : "Aircraft", "stopGTFSID" : "19924" },
|
|
45
|
+
{ "stopName" : "Williams Landing", "stopGTFSID" : "46468" },
|
|
46
|
+
{ "stopName" : "Hoppers Crossing", "stopGTFSID" : "19922" },
|
|
47
|
+
{ "stopName" : "Werribee", "stopGTFSID" : "19921" }
|
|
48
|
+
])
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
it('Should merge 2 different branches (742)', () => {
|
|
52
|
+
let variants = [
|
|
53
|
+
[
|
|
54
|
+
{ "stopName" : "Blackburn Road/Ferntree Gully Road", "stopGTFSID" : "13038" },
|
|
55
|
+
{ "stopName" : "Blackburn Road/Normanby Road", "stopGTFSID" : "15418" },
|
|
56
|
+
{ "stopName" : "Howleys Road/Normanby Road", "stopGTFSID" : "15419" },
|
|
57
|
+
{ "stopName" : "Monash University/Research Way", "stopGTFSID" : "22447" },
|
|
58
|
+
{ "stopName" : "Hilltop Avenue/Gardiner Road", "stopGTFSID" : "22445" },
|
|
59
|
+
{ "stopName" : "Ferntree Gully Road/Gardiner Road", "stopGTFSID" : "22442" },
|
|
60
|
+
{ "stopName" : "Gardiner Road/Ferntree Gully Road", "stopGTFSID" : "13043" }
|
|
61
|
+
],
|
|
62
|
+
[
|
|
63
|
+
{ "stopName" : "Blackburn Road/Ferntree Gully Road", "stopGTFSID" : "13038" },
|
|
64
|
+
{ "stopName" : "Blackburn Road/Normanby Road", "stopGTFSID" : "15418" },
|
|
65
|
+
{ "stopName" : "Howleys Road/Normanby Road", "stopGTFSID" : "15419" },
|
|
66
|
+
{ "stopName" : "CSIRO/Normanby Road", "stopGTFSID" : "40973" },
|
|
67
|
+
{ "stopName" : "Ferntree Gully Road/Gardiner Road", "stopGTFSID" : "22442" },
|
|
68
|
+
{ "stopName" : "Gardiner Road/Ferntree Gully Road", "stopGTFSID" : "13043" }
|
|
69
|
+
]
|
|
70
|
+
]
|
|
71
|
+
|
|
72
|
+
expect(merge(variants)).to.deep.equal([
|
|
73
|
+
{ "stopName" : "Blackburn Road/Ferntree Gully Road", "stopGTFSID" : "13038" },
|
|
74
|
+
{ "stopName" : "Blackburn Road/Normanby Road", "stopGTFSID" : "15418" },
|
|
75
|
+
{ "stopName" : "Howleys Road/Normanby Road", "stopGTFSID" : "15419" },
|
|
76
|
+
{ "stopName" : "Monash University/Research Way", "stopGTFSID" : "22447" },
|
|
77
|
+
{ "stopName" : "Hilltop Avenue/Gardiner Road", "stopGTFSID" : "22445" },
|
|
78
|
+
{ "stopName" : "CSIRO/Normanby Road", "stopGTFSID" : "40973" },
|
|
79
|
+
{ "stopName" : "Ferntree Gully Road/Gardiner Road", "stopGTFSID" : "22442" },
|
|
80
|
+
{ "stopName" : "Gardiner Road/Ferntree Gully Road", "stopGTFSID" : "13043" }
|
|
81
|
+
])
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
it('Should merge 2 different branches (688)', () => {
|
|
86
|
+
let variants = [
|
|
87
|
+
[
|
|
88
|
+
{ "stopName" : "Montrose Town Centre/Mount Dandenong Tourist Road", "stopGTFSID" : "8936" },
|
|
89
|
+
{ "stopName" : "Acacia Avenue/Cambridge Road", "stopGTFSID" : "10295" },
|
|
90
|
+
{ "stopName" : "Alpine Way/Cambridge Road", "stopGTFSID" : "10296" },
|
|
91
|
+
{ "stopName" : "Regina Street/Cambridge Road", "stopGTFSID" : "11081" },
|
|
92
|
+
{ "stopName" : "Balmoral Street/Durham Road", "stopGTFSID" : "11082" },
|
|
93
|
+
{ "stopName" : "Elizabeth Bridge Reserve/Durham Road", "stopGTFSID" : "11083" },
|
|
94
|
+
{ "stopName" : "Hansen Park/Durham Road", "stopGTFSID" : "11084" },
|
|
95
|
+
{ "stopName" : "Charles Street/Durham Road", "stopGTFSID" : "11085" },
|
|
96
|
+
{ "stopName" : "Liverpool Road/Mount Dandenong Road", "stopGTFSID" : "11086" },
|
|
97
|
+
{ "stopName" : "Russo Place/Mount Dandenong Road", "stopGTFSID" : "8948" },
|
|
98
|
+
{ "stopName" : "Kilsyth Memorial Hall/Mount Dandenong Road", "stopGTFSID" : "8949" },
|
|
99
|
+
{ "stopName" : "Shelley Avenue/Mount Dandenong Road", "stopGTFSID" : "8950" },
|
|
100
|
+
{ "stopName" : "The Oaks/Mount Dandenong Road", "stopGTFSID" : "8951" },
|
|
101
|
+
{ "stopName" : "Ruskin Avenue/Mount Dandenong Road", "stopGTFSID" : "8952" },
|
|
102
|
+
{ "stopName" : "Gordon Street/Mount Dandenong Road", "stopGTFSID" : "8953" },
|
|
103
|
+
{ "stopName" : "Dorset Road/Mount Dandenong Road", "stopGTFSID" : "8954" },
|
|
104
|
+
{ "stopName" : "Norton Road/Mount Dandenong Road", "stopGTFSID" : "8955" },
|
|
105
|
+
{ "stopName" : "Arndale Shopping Centre/Mount Dandenong Road", "stopGTFSID" : "8956" },
|
|
106
|
+
{ "stopName" : "Mount Dandenong Road/Main Street", "stopGTFSID" : "13457" },
|
|
107
|
+
{ "stopName" : "Croydon Railway Station/Railway Avenue", "stopGTFSID" : "28719" }
|
|
108
|
+
], [
|
|
109
|
+
{ "stopName" : "Montrose Town Centre/Mount Dandenong Tourist Road", "stopGTFSID" : "8936" },
|
|
110
|
+
{ "stopName" : "Montrose Road/Mount Dandenong Road", "stopGTFSID" : "8937" },
|
|
111
|
+
{ "stopName" : "Montrose CFA/Mount Dandenong Road", "stopGTFSID" : "8938" },
|
|
112
|
+
{ "stopName" : "Canterbury Road/Mount Dandenong Road", "stopGTFSID" : "8939" },
|
|
113
|
+
{ "stopName" : "Bretby Way/Mount Dandenong Road", "stopGTFSID" : "8940" },
|
|
114
|
+
{ "stopName" : "Alpine Way/Mount Dandenong Road", "stopGTFSID" : "8941" },
|
|
115
|
+
{ "stopName" : "736 Mount Dandenong Road", "stopGTFSID" : "8942" },
|
|
116
|
+
{ "stopName" : "Geoffrey Drive/Mount Dandenong Road", "stopGTFSID" : "8943" },
|
|
117
|
+
{ "stopName" : "St. Richards Primary School/Mount Dandenong Road", "stopGTFSID" : "8944" },
|
|
118
|
+
{ "stopName" : "Cherylnne Crescent/Mount Dandenong Road", "stopGTFSID" : "8945" },
|
|
119
|
+
{ "stopName" : "Glendale Court/Mount Dandenong Road", "stopGTFSID" : "8946" },
|
|
120
|
+
{ "stopName" : "Durham Road/Mount Dandenong Road", "stopGTFSID" : "8947" },
|
|
121
|
+
{ "stopName" : "Liverpool Road/Mount Dandenong Road", "stopGTFSID" : "11086" },
|
|
122
|
+
{ "stopName" : "Russo Place/Mount Dandenong Road", "stopGTFSID" : "8948" },
|
|
123
|
+
{ "stopName" : "Kilsyth Memorial Hall/Mount Dandenong Road", "stopGTFSID" : "8949" },
|
|
124
|
+
{ "stopName" : "Shelley Avenue/Mount Dandenong Road", "stopGTFSID" : "8950" },
|
|
125
|
+
{ "stopName" : "The Oaks/Mount Dandenong Road", "stopGTFSID" : "8951" },
|
|
126
|
+
{ "stopName" : "Ruskin Avenue/Mount Dandenong Road", "stopGTFSID" : "8952" },
|
|
127
|
+
{ "stopName" : "Gordon Street/Mount Dandenong Road", "stopGTFSID" : "8953" },
|
|
128
|
+
{ "stopName" : "Dorset Road/Mount Dandenong Road", "stopGTFSID" : "8954" },
|
|
129
|
+
{ "stopName" : "Norton Road/Mount Dandenong Road", "stopGTFSID" : "8955" },
|
|
130
|
+
{ "stopName" : "Arndale Shopping Centre/Mount Dandenong Road", "stopGTFSID" : "8956" },
|
|
131
|
+
{ "stopName" : "Mount Dandenong Road/Main Street", "stopGTFSID" : "13457" },
|
|
132
|
+
{ "stopName" : "Croydon Railway Station/Railway Avenue", "stopGTFSID" : "28719" }
|
|
133
|
+
]
|
|
134
|
+
]
|
|
135
|
+
|
|
136
|
+
expect(merge(variants)).to.deep.equal([
|
|
137
|
+
{ "stopName" : "Montrose Town Centre/Mount Dandenong Tourist Road", "stopGTFSID" : "8936" },
|
|
138
|
+
{ "stopName" : "Montrose Road/Mount Dandenong Road", "stopGTFSID" : "8937" },
|
|
139
|
+
{ "stopName" : "Montrose CFA/Mount Dandenong Road", "stopGTFSID" : "8938" },
|
|
140
|
+
{ "stopName" : "Canterbury Road/Mount Dandenong Road", "stopGTFSID" : "8939" },
|
|
141
|
+
{ "stopName" : "Bretby Way/Mount Dandenong Road", "stopGTFSID" : "8940" },
|
|
142
|
+
{ "stopName" : "Alpine Way/Mount Dandenong Road", "stopGTFSID" : "8941" },
|
|
143
|
+
{ "stopName" : "736 Mount Dandenong Road", "stopGTFSID" : "8942" },
|
|
144
|
+
{ "stopName" : "Geoffrey Drive/Mount Dandenong Road", "stopGTFSID" : "8943" },
|
|
145
|
+
{ "stopName" : "St. Richards Primary School/Mount Dandenong Road", "stopGTFSID" : "8944" },
|
|
146
|
+
{ "stopName" : "Cherylnne Crescent/Mount Dandenong Road", "stopGTFSID" : "8945" },
|
|
147
|
+
{ "stopName" : "Glendale Court/Mount Dandenong Road", "stopGTFSID" : "8946" },
|
|
148
|
+
{ "stopName" : "Durham Road/Mount Dandenong Road", "stopGTFSID" : "8947" },
|
|
149
|
+
{ "stopName" : "Acacia Avenue/Cambridge Road", "stopGTFSID" : "10295" },
|
|
150
|
+
{ "stopName" : "Alpine Way/Cambridge Road", "stopGTFSID" : "10296" },
|
|
151
|
+
{ "stopName" : "Regina Street/Cambridge Road", "stopGTFSID" : "11081" },
|
|
152
|
+
{ "stopName" : "Balmoral Street/Durham Road", "stopGTFSID" : "11082" },
|
|
153
|
+
{ "stopName" : "Elizabeth Bridge Reserve/Durham Road", "stopGTFSID" : "11083" },
|
|
154
|
+
{ "stopName" : "Hansen Park/Durham Road", "stopGTFSID" : "11084" },
|
|
155
|
+
{ "stopName" : "Charles Street/Durham Road", "stopGTFSID" : "11085" },
|
|
156
|
+
{ "stopName" : "Liverpool Road/Mount Dandenong Road", "stopGTFSID" : "11086" },
|
|
157
|
+
{ "stopName" : "Russo Place/Mount Dandenong Road", "stopGTFSID" : "8948" },
|
|
158
|
+
{ "stopName" : "Kilsyth Memorial Hall/Mount Dandenong Road", "stopGTFSID" : "8949" },
|
|
159
|
+
{ "stopName" : "Shelley Avenue/Mount Dandenong Road", "stopGTFSID" : "8950" },
|
|
160
|
+
{ "stopName" : "The Oaks/Mount Dandenong Road", "stopGTFSID" : "8951" },
|
|
161
|
+
{ "stopName" : "Ruskin Avenue/Mount Dandenong Road", "stopGTFSID" : "8952" },
|
|
162
|
+
{ "stopName" : "Gordon Street/Mount Dandenong Road", "stopGTFSID" : "8953" },
|
|
163
|
+
{ "stopName" : "Dorset Road/Mount Dandenong Road", "stopGTFSID" : "8954" },
|
|
164
|
+
{ "stopName" : "Norton Road/Mount Dandenong Road", "stopGTFSID" : "8955" },
|
|
165
|
+
{ "stopName" : "Arndale Shopping Centre/Mount Dandenong Road", "stopGTFSID" : "8956" },
|
|
166
|
+
{ "stopName" : "Mount Dandenong Road/Main Street", "stopGTFSID" : "13457" },
|
|
167
|
+
{ "stopName" : "Croydon Railway Station/Railway Avenue", "stopGTFSID" : "28719" }
|
|
168
|
+
])
|
|
169
|
+
})
|
|
170
|
+
|
|
171
|
+
it('Should not create any further stops if a deviation overlaps (City Loop)', () => {
|
|
172
|
+
let variants = [
|
|
173
|
+
[
|
|
174
|
+
{ "stopName" : "Flinders Street Railway Station", "stopGTFSID" : "19854" },
|
|
175
|
+
{ "stopName" : "Southern Cross Railway Station", "stopGTFSID" : "22180" },
|
|
176
|
+
{ "stopName" : "Flagstaff Railway Station", "stopGTFSID" : "19841" },
|
|
177
|
+
{ "stopName" : "Melbourne Central Railway Station", "stopGTFSID" : "19842" },
|
|
178
|
+
{ "stopName" : "Parliament Railway Station", "stopGTFSID" : "19843" },
|
|
179
|
+
{ "stopName" : "Richmond Railway Station", "stopGTFSID" : "19908" },
|
|
180
|
+
{ "stopName" : "East Richmond Railway Station", "stopGTFSID" : "19907" },
|
|
181
|
+
{ "stopName" : "Burnley Railway Station", "stopGTFSID" : "19906" },
|
|
182
|
+
{ "stopName" : "Hawthorn Railway Station", "stopGTFSID" : "19905" },
|
|
183
|
+
{ "stopName" : "Glenferrie Railway Station", "stopGTFSID" : "19904" },
|
|
184
|
+
{ "stopName" : "Auburn Railway Station", "stopGTFSID" : "19903" },
|
|
185
|
+
{ "stopName" : "Camberwell Railway Station", "stopGTFSID" : "19853" },
|
|
186
|
+
], [
|
|
187
|
+
{ "stopName" : "Flinders Street Railway Station", "stopGTFSID" : "19854" },
|
|
188
|
+
{ "stopName" : "Richmond Railway Station", "stopGTFSID" : "19908" },
|
|
189
|
+
{ "stopName" : "East Richmond Railway Station", "stopGTFSID" : "19907" },
|
|
190
|
+
{ "stopName" : "Burnley Railway Station", "stopGTFSID" : "19906" },
|
|
191
|
+
{ "stopName" : "Hawthorn Railway Station", "stopGTFSID" : "19905" },
|
|
192
|
+
{ "stopName" : "Glenferrie Railway Station", "stopGTFSID" : "19904" },
|
|
193
|
+
{ "stopName" : "Auburn Railway Station", "stopGTFSID" : "19903" },
|
|
194
|
+
{ "stopName" : "Camberwell Railway Station", "stopGTFSID" : "19853" },
|
|
195
|
+
]
|
|
196
|
+
]
|
|
197
|
+
|
|
198
|
+
expect(merge(variants)).to.deep.equal(variants[0])
|
|
199
|
+
})
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
it('Should merge 2 different branches (NOR Group City Loop)', () => {
|
|
203
|
+
let variants = [
|
|
204
|
+
[
|
|
205
|
+
{ "stopName" : "Flinders Street Railway Station", "stopGTFSID" : "19854" },
|
|
206
|
+
{ "stopName" : "Southern Cross Railway Station", "stopGTFSID" : "22180" },
|
|
207
|
+
{ "stopName" : "North Melbourne Railway Station", "stopGTFSID" : "19973" },
|
|
208
|
+
{ "stopName" : "Macaulay Railway Station", "stopGTFSID" : "19972" },
|
|
209
|
+
], [
|
|
210
|
+
{ "stopName" : "Flinders Street Railway Station", "stopGTFSID" : "19854" },
|
|
211
|
+
{ "stopName" : "Parliament Railway Station", "stopGTFSID" : "19843" },
|
|
212
|
+
{ "stopName" : "Melbourne Central Railway Station", "stopGTFSID" : "19842" },
|
|
213
|
+
{ "stopName" : "Flagstaff Railway Station", "stopGTFSID" : "19841" },
|
|
214
|
+
{ "stopName" : "North Melbourne Railway Station", "stopGTFSID" : "19973" },
|
|
215
|
+
{ "stopName" : "Macaulay Railway Station", "stopGTFSID" : "19972" },
|
|
216
|
+
]
|
|
217
|
+
]
|
|
218
|
+
|
|
219
|
+
expect(merge(variants)).to.deep.equal([
|
|
220
|
+
{ "stopName" : "Flinders Street Railway Station", "stopGTFSID" : "19854" },
|
|
221
|
+
{ "stopName" : "Parliament Railway Station", "stopGTFSID" : "19843" },
|
|
222
|
+
{ "stopName" : "Melbourne Central Railway Station", "stopGTFSID" : "19842" },
|
|
223
|
+
{ "stopName" : "Flagstaff Railway Station", "stopGTFSID" : "19841" },
|
|
224
|
+
{ "stopName" : "Southern Cross Railway Station", "stopGTFSID" : "22180" },
|
|
225
|
+
{ "stopName" : "North Melbourne Railway Station", "stopGTFSID" : "19973" },
|
|
226
|
+
{ "stopName" : "Macaulay Railway Station", "stopGTFSID" : "19972" },
|
|
227
|
+
])
|
|
228
|
+
})
|
|
229
|
+
|
|
230
|
+
it('Should handle a branch that is also an alternate destination (681)', () => {
|
|
231
|
+
let commonStops = [
|
|
232
|
+
{ "stopName" : "Knox City Shopping Centre/Burwood Highway", "stopGTFSID" : "19629" },
|
|
233
|
+
{ "stopName" : "Burwood Highway/Stud Road", "stopGTFSID" : "15219" },
|
|
234
|
+
{ "stopName" : "Swinburne TAFE - Wantirna/Stud Road", "stopGTFSID" : "14191" },
|
|
235
|
+
{ "stopName" : "High Street Road/Stud Road", "stopGTFSID" : "14190" },
|
|
236
|
+
{ "stopName" : "Harcrest Boulevard/Stud Road", "stopGTFSID" : "14189" },
|
|
237
|
+
{ "stopName" : "Mockridge Street/Stud Road", "stopGTFSID" : "14188" },
|
|
238
|
+
{ "stopName" : "Armin Street/Stud Road", "stopGTFSID" : "14187" },
|
|
239
|
+
{ "stopName" : "Evans Street/Stud Road", "stopGTFSID" : "14186" },
|
|
240
|
+
{ "stopName" : "Glenifer Avenue/Stud Road", "stopGTFSID" : "14184" },
|
|
241
|
+
{ "stopName" : "Scoresby Village Shopping Centre/Stud Road", "stopGTFSID" : "14183" },
|
|
242
|
+
{ "stopName" : "Ferntree Gully Road/Stud Road", "stopGTFSID" : "14182" },
|
|
243
|
+
{ "stopName" : "Centre Road/Stud Road", "stopGTFSID" : "14181" },
|
|
244
|
+
{ "stopName" : "Kingsley Close/Stud Road", "stopGTFSID" : "14180" },
|
|
245
|
+
{ "stopName" : "Kelletts Road/Stud Road", "stopGTFSID" : "14179" },
|
|
246
|
+
{ "stopName" : "Lakeside Boulevard/Stud Road", "stopGTFSID" : "14178" },
|
|
247
|
+
{ "stopName" : "Stud Park Shopping Centre", "stopGTFSID" : "21314" },
|
|
248
|
+
{ "stopName" : "Rowville Community Centre/Fulham Road", "stopGTFSID" : "13339" },
|
|
249
|
+
{ "stopName" : "Erie Avenue/Bridgewater Way", "stopGTFSID" : "13346" },
|
|
250
|
+
{ "stopName" : "Kelletts Road/Taylors Lane", "stopGTFSID" : "15227" },
|
|
251
|
+
{ "stopName" : "Valleyview Drive/Karoo Road", "stopGTFSID" : "15242" },
|
|
252
|
+
{ "stopName" : "Oakdene Court/Landsborough Avenue", "stopGTFSID" : "15243" },
|
|
253
|
+
{ "stopName" : "Kellbourne Drive/Landsborough Avenue", "stopGTFSID" : "15244" },
|
|
254
|
+
{ "stopName" : "Karoo Primary School/Karoo Road", "stopGTFSID" : "15245" },
|
|
255
|
+
{ "stopName" : "Camley Court/Karoo Road", "stopGTFSID" : "15246" },
|
|
256
|
+
{ "stopName" : "Sovereign Manors Crescent/Karoo Road", "stopGTFSID" : "15247" },
|
|
257
|
+
{ "stopName" : "Langhorne Crescent/Victoria Knox Avenue", "stopGTFSID" : "15248" },
|
|
258
|
+
{ "stopName" : "Sovereign Crest Boulevard/Victoria Knox Avenue", "stopGTFSID" : "15249" },
|
|
259
|
+
{ "stopName" : "Greenhaven Court/Sovereign Crest Boulevard", "stopGTFSID" : "15250" },
|
|
260
|
+
{ "stopName" : "Lakesfield Drive/Napoleon Road", "stopGTFSID" : "15251" },
|
|
261
|
+
{ "stopName" : "Lakesfield Drive/Kelletts Road", "stopGTFSID" : "15252" },
|
|
262
|
+
{ "stopName" : "Rosewood Boulevard/Heritage Way", "stopGTFSID" : "15202" },
|
|
263
|
+
{ "stopName" : "Windsor Drive/Heritage Way", "stopGTFSID" : "15201" },
|
|
264
|
+
{ "stopName" : "Windsor Drive/Rosewood Boulevard", "stopGTFSID" : "15200" },
|
|
265
|
+
{ "stopName" : "Heritage Way/Rosewood Boulevard", "stopGTFSID" : "15198" },
|
|
266
|
+
{ "stopName" : "Kelletts Road/Rosewood Boulevard", "stopGTFSID" : "15199" },
|
|
267
|
+
{ "stopName" : "Grenfell Place/Major Crescent", "stopGTFSID" : "15258" },
|
|
268
|
+
{ "stopName" : "Malata Way/Major Crescent", "stopGTFSID" : "15259" },
|
|
269
|
+
{ "stopName" : "Regency Terrace/Major Crescent", "stopGTFSID" : "15260" },
|
|
270
|
+
{ "stopName" : "Major Crescent/Sullivan Avenue", "stopGTFSID" : "15261" },
|
|
271
|
+
{ "stopName" : "Barry Reserve/Anthony Drive", "stopGTFSID" : "15262" },
|
|
272
|
+
{ "stopName" : "Napoleon Road/Anthony Drive", "stopGTFSID" : "15263" },
|
|
273
|
+
{ "stopName" : "Gill Court/Napoleon Road", "stopGTFSID" : "15264" },
|
|
274
|
+
{ "stopName" : "Park Road/Napoleon Road", "stopGTFSID" : "15265" },
|
|
275
|
+
{ "stopName" : "Teofilo Drive/Napoleon Road", "stopGTFSID" : "15266" },
|
|
276
|
+
{ "stopName" : "Wetherby Court/Dandelion Drive", "stopGTFSID" : "15267" },
|
|
277
|
+
{ "stopName" : "Peregrine Reserve/Dandelion Drive", "stopGTFSID" : "15268" },
|
|
278
|
+
{ "stopName" : "Armstrong Drive/Dandelion Drive", "stopGTFSID" : "15269" },
|
|
279
|
+
{ "stopName" : "Wellington Village Shopping Centre/Braeburn Parade", "stopGTFSID" : "15271" },
|
|
280
|
+
{ "stopName" : "Ada Street/Braeburn Parade", "stopGTFSID" : "41177" },
|
|
281
|
+
{ "stopName" : "Dalmatia Court/Gearon Avenue", "stopGTFSID" : "15272" },
|
|
282
|
+
{ "stopName" : "Suzana Place/Pia Drive", "stopGTFSID" : "15273" },
|
|
283
|
+
{ "stopName" : "Pia Drive/Trisha Drive", "stopGTFSID" : "15275" },
|
|
284
|
+
{ "stopName" : "Koombahla Court/Liviana Drive", "stopGTFSID" : "23180" },
|
|
285
|
+
{ "stopName" : "Fowler Road/Shearer Drive", "stopGTFSID" : "23038" },
|
|
286
|
+
{ "stopName" : "Liberty Avenue/Shearer Drive", "stopGTFSID" : "15277" },
|
|
287
|
+
{ "stopName" : "Buckingham Drive/Liberty Avenue", "stopGTFSID" : "15278" },
|
|
288
|
+
{ "stopName" : "Liberty Avenue Reserve/Liberty Avenue", "stopGTFSID" : "15279" },
|
|
289
|
+
{ "stopName" : "Virgilia Court/Liberty Avenue", "stopGTFSID" : "23037" },
|
|
290
|
+
{ "stopName" : "Liberty Avenue/Clauscen Drive", "stopGTFSID" : "15281" },
|
|
291
|
+
{ "stopName" : "McKay Road/Taylors Lane", "stopGTFSID" : "15282" },
|
|
292
|
+
{ "stopName" : "Taylors Lane/Bernard Hamilton Way", "stopGTFSID" : "15283" },
|
|
293
|
+
{ "stopName" : "Turramurra Drive/Bridgewater Way", "stopGTFSID" : "15284" },
|
|
294
|
+
{ "stopName" : "Simon Avenue/Bridgewater Way", "stopGTFSID" : "15285" },
|
|
295
|
+
{ "stopName" : "Rowville Community Centre/Fulham Road", "stopGTFSID" : "15184" },
|
|
296
|
+
{ "stopName" : "Stud Park Shopping Centre", "stopGTFSID" : "21314" },
|
|
297
|
+
{ "stopName" : "Stud Park Shopping Centre/Stud Road", "stopGTFSID" : "15149" }
|
|
298
|
+
]
|
|
299
|
+
|
|
300
|
+
let studKnox = [
|
|
301
|
+
{ "stopName" : "Lakeside Boulevard/Stud Road", "stopGTFSID" : "15150" },
|
|
302
|
+
{ "stopName" : "Kelletts Road/Stud Road - West", "stopGTFSID" : "15151" },
|
|
303
|
+
{ "stopName" : "Kingsley Close/Stud Road", "stopGTFSID" : "15152" },
|
|
304
|
+
{ "stopName" : "Centre Road/Stud Road", "stopGTFSID" : "15153" },
|
|
305
|
+
{ "stopName" : "Scoresby Village Shopping Centre/Stud Road", "stopGTFSID" : "15154" },
|
|
306
|
+
{ "stopName" : "The Close/Stud Road", "stopGTFSID" : "15155" },
|
|
307
|
+
{ "stopName" : "Sheppard Drive/Stud Road", "stopGTFSID" : "15156" },
|
|
308
|
+
{ "stopName" : "Evans Street/Stud Road", "stopGTFSID" : "15157" },
|
|
309
|
+
{ "stopName" : "George Street/Stud Road", "stopGTFSID" : "15158" },
|
|
310
|
+
{ "stopName" : "Mockridge Street/Stud Road", "stopGTFSID" : "15159" },
|
|
311
|
+
{ "stopName" : "Harcrest Boulevard/Stud Road", "stopGTFSID" : "15160" },
|
|
312
|
+
{ "stopName" : "High Street Road/Stud Road", "stopGTFSID" : "15161" },
|
|
313
|
+
{ "stopName" : "Swinburne TAFE - Wantirna/Stud Road", "stopGTFSID" : "15162" },
|
|
314
|
+
{ "stopName" : "Knox City Shopping Centre/Burwood Highway", "stopGTFSID" : "19629" }
|
|
315
|
+
]
|
|
316
|
+
|
|
317
|
+
let studWav = [
|
|
318
|
+
{ "stopName" : "Turramurra Drive/Stud Road", "stopGTFSID" : "14176" },
|
|
319
|
+
{ "stopName" : "Stud Road/Wellington Road", "stopGTFSID" : "16505" },
|
|
320
|
+
{ "stopName" : "Viewtech Place/Wellington Road", "stopGTFSID" : "16506" },
|
|
321
|
+
{ "stopName" : "Jaydee Court/Wellington Road", "stopGTFSID" : "16507" },
|
|
322
|
+
{ "stopName" : "Eastlink/Wellington Road", "stopGTFSID" : "16508" },
|
|
323
|
+
{ "stopName" : "Haverbrack Drive/Wellington Road", "stopGTFSID" : "2351" },
|
|
324
|
+
{ "stopName" : "Wellington Road/Jacksons Road", "stopGTFSID" : "22714" },
|
|
325
|
+
{ "stopName" : "Stirling Theological College/Jacksons Road", "stopGTFSID" : "22715" },
|
|
326
|
+
{ "stopName" : "Carboni Court/Jacksons Road", "stopGTFSID" : "22716" },
|
|
327
|
+
{ "stopName" : "Gladeswood Drive/Jacksons Road", "stopGTFSID" : "21327" },
|
|
328
|
+
{ "stopName" : "Waverley Gardens Shopping Centre/Hansworth Street", "stopGTFSID" : "21310" }
|
|
329
|
+
]
|
|
330
|
+
|
|
331
|
+
let variants = [
|
|
332
|
+
[
|
|
333
|
+
...commonStops,
|
|
334
|
+
...studKnox
|
|
335
|
+
],
|
|
336
|
+
[
|
|
337
|
+
...commonStops,
|
|
338
|
+
...studWav
|
|
339
|
+
]
|
|
340
|
+
]
|
|
341
|
+
|
|
342
|
+
expect(merge(variants)).to.deep.equal(
|
|
343
|
+
[
|
|
344
|
+
...commonStops,
|
|
345
|
+
...studWav,
|
|
346
|
+
...studKnox
|
|
347
|
+
]
|
|
348
|
+
)
|
|
349
|
+
})
|
|
350
|
+
|
|
351
|
+
it('Should merge a route that runs in halves only', () => {
|
|
352
|
+
let firstHalf = [
|
|
353
|
+
{ "stopName" : "Knox City Shopping Centre/Burwood Highway", "stopGTFSID" : "19629" },
|
|
354
|
+
{ "stopName" : "Burwood Highway/Stud Road", "stopGTFSID" : "15219" },
|
|
355
|
+
{ "stopName" : "Swinburne TAFE - Wantirna/Stud Road", "stopGTFSID" : "14191" },
|
|
356
|
+
{ "stopName" : "High Street Road/Stud Road", "stopGTFSID" : "14190" },
|
|
357
|
+
{ "stopName" : "Harcrest Boulevard/Stud Road", "stopGTFSID" : "14189" },
|
|
358
|
+
{ "stopName" : "Mockridge Street/Stud Road", "stopGTFSID" : "14188" },
|
|
359
|
+
]
|
|
360
|
+
let secondHalf = [
|
|
361
|
+
{ "stopName" : "Mockridge Street/Stud Road", "stopGTFSID" : "14188" },
|
|
362
|
+
{ "stopName" : "Armin Street/Stud Road", "stopGTFSID" : "14187" },
|
|
363
|
+
{ "stopName" : "Evans Street/Stud Road", "stopGTFSID" : "14186" },
|
|
364
|
+
{ "stopName" : "Glenifer Avenue/Stud Road", "stopGTFSID" : "14184" },
|
|
365
|
+
{ "stopName" : "Scoresby Village Shopping Centre/Stud Road", "stopGTFSID" : "14183" },
|
|
366
|
+
{ "stopName" : "Ferntree Gully Road/Stud Road", "stopGTFSID" : "14182" },
|
|
367
|
+
{ "stopName" : "Centre Road/Stud Road", "stopGTFSID" : "14181" },
|
|
368
|
+
{ "stopName" : "Kingsley Close/Stud Road", "stopGTFSID" : "14180" }
|
|
369
|
+
]
|
|
370
|
+
|
|
371
|
+
expect(merge([ firstHalf, secondHalf ])).to.deep.equal([
|
|
372
|
+
...firstHalf,
|
|
373
|
+
...secondHalf.slice(1)
|
|
374
|
+
])
|
|
375
|
+
})
|
|
376
|
+
})
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { expect } from 'chai'
|
|
2
|
+
import nock from 'nock'
|
|
3
|
+
import PTVGTFS from '../lib/gtfs-package/PTVGTFS.mjs'
|
|
4
|
+
import path from 'path'
|
|
5
|
+
import url from 'url'
|
|
6
|
+
import { dir as tmpdir } from 'tmp-promise'
|
|
7
|
+
import fs from 'fs/promises'
|
|
8
|
+
|
|
9
|
+
const __filename = url.fileURLToPath(import.meta.url)
|
|
10
|
+
const __dirname = path.dirname(__filename)
|
|
11
|
+
|
|
12
|
+
let gtfsHost = 'http://data.ptv.vic.gov.au'
|
|
13
|
+
let gtfsURL = '/downloads/gtfs.zip'
|
|
14
|
+
|
|
15
|
+
let responseHeaders = {
|
|
16
|
+
'last-modified': 'Fri, 12 Jul 2024 02:25:21 GMT',
|
|
17
|
+
'content-length': '165927454',
|
|
18
|
+
'content-type': 'application/zip'
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const stubGTFSUnzipping = (await fs.readFile(path.join(__dirname, 'sample-data', 'gtfs-unzipping', 'gtfs.zip')))
|
|
22
|
+
|
|
23
|
+
async function downloadGTFS() {
|
|
24
|
+
nock(gtfsHost).get(gtfsURL).reply(200, stubGTFSUnzipping)
|
|
25
|
+
let tmp = await tmpdir({ unsafeCleanup: true })
|
|
26
|
+
|
|
27
|
+
let gtfs = new PTVGTFS(gtfsHost + gtfsURL)
|
|
28
|
+
await gtfs.download(tmp.path)
|
|
29
|
+
|
|
30
|
+
return {
|
|
31
|
+
gtfs, tmp
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
describe('The PTVGTFS class', () => {
|
|
36
|
+
describe('The getPublishedDate function', () => {
|
|
37
|
+
it('Should read the last-modified header and return that', async () => {
|
|
38
|
+
nock(gtfsHost).head(gtfsURL).reply(200, '', responseHeaders)
|
|
39
|
+
|
|
40
|
+
let gtfs = new PTVGTFS(gtfsHost + gtfsURL)
|
|
41
|
+
let publishedDate = await gtfs.getPublishedDate()
|
|
42
|
+
|
|
43
|
+
expect(publishedDate.toISOString()).to.equal('2024-07-12T02:25:21.000Z')
|
|
44
|
+
})
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
describe('The download function', () => {
|
|
48
|
+
it('Should save the gtfs file to the given folder, with the filename as gtfs.zip', async () => {
|
|
49
|
+
let { gtfs, tmp } = await downloadGTFS()
|
|
50
|
+
|
|
51
|
+
let stat = await fs.stat(path.join(tmp.path, 'gtfs.zip'))
|
|
52
|
+
expect(stat.size).to.equal(23408)
|
|
53
|
+
|
|
54
|
+
await tmp.cleanup()
|
|
55
|
+
})
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
describe('The unzip function', () => {
|
|
59
|
+
it('Should throw and error if the file has not been downloaded first', async () => {
|
|
60
|
+
let gtfs = new PTVGTFS(gtfsHost + gtfsURL)
|
|
61
|
+
expect((await gtfs.unzip().catch(e => e)).message).to.equal('Need to download GTFS file first!')
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
it('Should unzip gtfs.zip, producing the numbered folders', async () => {
|
|
65
|
+
let { gtfs, tmp } = await downloadGTFS()
|
|
66
|
+
await gtfs.unzip()
|
|
67
|
+
|
|
68
|
+
let stat = await fs.stat(path.join(tmp.path, '1', 'google_transit.zip'))
|
|
69
|
+
expect(stat).to.not.be.null
|
|
70
|
+
|
|
71
|
+
await tmp.cleanup()
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
it('Should unzip the google_transit.zip files in the numbered folders as well', async () => {
|
|
75
|
+
let { gtfs, tmp } = await downloadGTFS()
|
|
76
|
+
await gtfs.unzip()
|
|
77
|
+
|
|
78
|
+
for (let i = 1; i <= 11; i++) {
|
|
79
|
+
if (i === 9) continue
|
|
80
|
+
let stat = await fs.stat(path.join(tmp.path, i.toString(), 'stops.txt'))
|
|
81
|
+
expect(stat).to.not.be.null
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
await tmp.cleanup()
|
|
85
|
+
})
|
|
86
|
+
})
|
|
87
|
+
|
|
88
|
+
describe('The cleanup function', () => {
|
|
89
|
+
it('Should remove the zip files, keeping the CSV files intact', async () => {
|
|
90
|
+
let { gtfs, tmp } = await downloadGTFS()
|
|
91
|
+
await gtfs.unzip()
|
|
92
|
+
await gtfs.cleanup()
|
|
93
|
+
|
|
94
|
+
let mainStat = await fs.stat(path.join(tmp.path, 'gtfs.zip')).catch(e => e)
|
|
95
|
+
expect(mainStat).to.be.instanceof(Error)
|
|
96
|
+
|
|
97
|
+
for (let i = 1; i <= 11; i++) {
|
|
98
|
+
if (i === 9) continue
|
|
99
|
+
let stat = await fs.stat(path.join(tmp.path, i.toString(), 'google_transit.zip')).catch(e => e)
|
|
100
|
+
expect(stat).to.be.instanceof(Error)
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
await tmp.cleanup()
|
|
104
|
+
})
|
|
105
|
+
})
|
|
106
|
+
})
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
service_id,monday,tuesday,wednesday,thursday,friday,saturday,sunday,start_date,end_date
|
|
2
|
+
"T2","0","0","0","0","0","1","0","20241108","20241114"
|
|
3
|
+
"T2_1","0","0","0","0","0","1","0","20241115","20241121"
|
|
4
|
+
"T2_2","0","0","0","0","0","1","0","20241122","20250209"
|
|
5
|
+
"T3","0","0","0","0","0","0","1","20241108","20241114"
|
|
6
|
+
"T3_1","0","0","0","0","0","0","1","20241115","20241121"
|
|
7
|
+
"T3_2","0","0","0","0","0","0","1","20241122","20250209"
|
|
8
|
+
"T5","1","1","1","1","0","0","0","20241108","20241114"
|
|
9
|
+
"T5_1","1","1","1","1","0","0","0","20241115","20241121"
|
|
10
|
+
"T5_2","1","1","1","1","0","0","0","20241122","20250209"
|
|
11
|
+
"T5+n5","0","0","0","1","0","0","0","20241108","20241114"
|
|
12
|
+
"T5+n6","1","1","1","0","0","0","0","20241108","20241114"
|
|
13
|
+
"T5+n7","1","1","0","1","0","0","0","20241108","20241114"
|
|
14
|
+
"T5+n8","0","0","1","0","0","0","0","20241108","20241114"
|
|
15
|
+
"T5+n9","0","1","1","1","0","0","0","20241108","20241114"
|
|
16
|
+
"T5+o0","1","0","0","0","0","0","0","20241108","20241114"
|
|
17
|
+
"T5+o1","1","1","0","0","0","0","0","20241108","20241114"
|
|
18
|
+
"T5+o2","0","0","1","1","0","0","0","20241108","20241114"
|
|
19
|
+
"T5+o3","0","1","1","0","0","0","0","20241108","20241114"
|
|
20
|
+
"T5+o4","0","1","1","1","0","0","0","20241115","20241121"
|
|
21
|
+
"T5+o5","1","0","0","0","0","0","0","20241115","20241121"
|
|
22
|
+
"T5+o6","0","0","1","1","0","0","0","20241115","20241121"
|
|
23
|
+
"T5+o7","1","1","0","0","0","0","0","20241115","20241121"
|
|
24
|
+
"T5+o8","1","1","0","1","0","0","0","20241115","20241121"
|
|
25
|
+
"T5+o9","0","0","1","0","0","0","0","20241115","20241121"
|
|
26
|
+
"T5+p0","1","1","1","0","0","0","0","20241115","20241121"
|
|
27
|
+
"T5+p1","0","0","0","1","0","0","0","20241115","20241121"
|
|
28
|
+
"T5+p2","0","1","0","0","0","0","0","20241115","20241121"
|
|
29
|
+
"T6","0","0","0","0","1","0","0","20241108","20241114"
|
|
30
|
+
"T6_1","0","0","0","0","1","0","0","20241115","20241121"
|
|
31
|
+
"T6_2","0","0","0","0","1","0","0","20241122","20250209"
|
|
32
|
+
"UI","0","0","0","1","0","0","0","20241122","20250209"
|
|
33
|
+
"UL","0","0","1","0","0","0","0","20241122","20250209"
|
|
34
|
+
"MF10-49-601-aus","1","1","1","1","1","0","0","20241122","20250223"
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
service_id,date,exception_type
|
|
2
|
+
"T3_2","20250126","2"
|
|
3
|
+
"T5_2","20241225","2"
|
|
4
|
+
"T5_2","20241226","2"
|
|
5
|
+
"T5_2","20250101","2"
|
|
6
|
+
"T5_2","20250127","2"
|
|
7
|
+
"UI","20241128","2"
|
|
8
|
+
"UI","20241205","2"
|
|
9
|
+
"UI","20241212","2"
|
|
10
|
+
"UI","20241219","2"
|
|
11
|
+
"UI","20250102","2"
|
|
12
|
+
"UI","20250109","2"
|
|
13
|
+
"UI","20250116","2"
|
|
14
|
+
"UI","20250123","2"
|
|
15
|
+
"UI","20250130","2"
|
|
16
|
+
"UI","20250206","2"
|
|
17
|
+
"UL","20241127","2"
|
|
18
|
+
"UL","20241204","2"
|
|
19
|
+
"UL","20241211","2"
|
|
20
|
+
"UL","20241218","2"
|
|
21
|
+
"UL","20250101","2"
|
|
22
|
+
"UL","20250108","2"
|
|
23
|
+
"UL","20250115","2"
|
|
24
|
+
"UL","20250122","2"
|
|
25
|
+
"UL","20250129","2"
|
|
26
|
+
"UL","20250205","2"
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
stop_id,stop_name,stop_lat,stop_lon
|
|
2
|
+
"16830","Melbourne University/Royal Pde (Parkville)","-37.7984297818238","144.957855928775"
|
|
3
|
+
"28670","Melbourne University/Grattan St (Carlton)","-37.8001309323072","144.961897703257"
|
|
4
|
+
"28671","Melbourne University/Grattan St (Carlton)","-37.8002400593444","144.962996363755"
|
|
5
|
+
"28673","Melbourne University/Grattan St (Carlton)","-37.8000452422121","144.960071535123"
|
|
6
|
+
"28675","Melbourne University/Grattan St (Carlton)","-37.800110297337","144.960705753974"
|
|
7
|
+
"87","Melbourne University/Swanston St (Carlton)","-37.7999508835265","144.963992391723"
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
stop_id,stop_name,stop_lat,stop_lon
|
|
2
|
+
"1000","Dole Ave/Cheddar Rd (Reservoir)","-37.7007748061827","145.018951051008"
|
|
3
|
+
"10001","Rex St/Taylors Rd (Kings Park)","-37.7269752097338","144.776152425766"
|
|
4
|
+
"10002","Yuille St/Centenary Ave (Melton)","-37.676159502415","144.595789405034"
|
|
5
|
+
"10009","Gum Rd/Main Rd West (Albanvale)","-37.7414971143105","144.775899388911"
|
|
6
|
+
"1001","Lloyd Ave/Cheddar Rd (Reservoir)","-37.6991830099559","145.019685286526"
|
|
7
|
+
"10010","Kings Rd/Main Rd West (St Albans)","-37.7419455261301","144.78008474429"
|
|
8
|
+
"10011","Moffat St/Main Rd West (St Albans)","-37.7423246041343","144.783466504334"
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
stop_id,stop_name,stop_lat,stop_lon
|
|
2
|
+
"49016","Ballarat Bus Interchange (Soldiers Hill)","-37.5583880170257","143.859870505315"
|
|
3
|
+
"49017","Ballarat Bus Interchange (Soldiers Hill)","-37.558622046041","143.860200212639"
|
|
4
|
+
"49020","Ballarat Bus Interchange (Soldiers Hill)","-37.558397045775","143.860209663324"
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
stop_id,stop_name,stop_lat,stop_lon,location_type,parent_station,platform_code
|
|
2
|
+
"11207","Camberwell Station","-37.82672159","145.05877266","","Parentvic:rail:CAM","1"
|
|
3
|
+
"11208","Camberwell Station","-37.82656845","145.05877667","","Parentvic:rail:CAM","2"
|
|
4
|
+
"11209","Camberwell Station","-37.82653224","145.05876626","","Parentvic:rail:CAM","3"
|
|
5
|
+
"26130","Camberwell Rail Replacement Bus”,”-37.82633726","145.05841916","","Parentvic:rail:CAM","B"
|
|
6
|
+
"Parentvic:rail:CAM","Camberwell Station","-37.82656714","145.05869718","1","",""
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
stop_id,stop_name,stop_lat,stop_lon
|
|
2
|
+
"1000","Dole Ave/Cheddar Rd (Reservoir)","-37.7007748061827","145.018951051008"
|
|
3
|
+
"10001","Rex St/Taylors Rd (Kings Park)","-37.7269752097338","144.776152425766"
|
|
4
|
+
"10002","Yuille St/Centenary Ave (Melton)","-37.676159502415","144.595789405034"
|
|
5
|
+
"10009","Gum Rd/Main Rd West (Albanvale)","-37.7414971143105","144.775899388911"
|
|
6
|
+
"1001","Lloyd Ave/Cheddar Rd (Reservoir)","-37.6991830099559","145.019685286526"
|
|
7
|
+
"10010","Kings Rd/Main Rd West (St Albans)","-37.7419455261301","144.78008474429"
|
|
8
|
+
"10011","Moffat St/Main Rd West (St Albans)","-37.7423246041343","144.783466504334"
|
|
9
|
+
"16074","Waverley Rd/Watsons Rd (Glen Waverley)","-37.8900764627378","145.170243673036"
|
|
10
|
+
"15064","Waverley Rd/Watsons Rd (Glen Waverley)","-37.8901951633874","145.170343077835"
|
|
11
|
+
"9662","Waverley Rd/Warrigal Rd (Chadstone)","-37.879427459666","145.091009789504"
|
|
12
|
+
"9379","Waverley Rd/Warrigal Rd (Chadstone)","-37.8795658733597","145.090653754117"
|
|
13
|
+
"19580","Belgrave Station/Belgrave-Gembrook Rd (Belgrave)","-37.9096818213337","145.354857507576"
|
|
14
|
+
"19581","Belgrave Station/Belgrave-Gembrook Rd (Belgrave)","-37.9095756173024","145.354996370113"
|
|
15
|
+
"19582","Belgrave Station/Belgrave-Gembrook Rd (Belgrave)","-37.9094159930233","145.355181920791"
|
|
16
|
+
"28191","Lilydale Station/West William St (Lilydale)","-37.7570490306183","145.345723747959"
|
|
17
|
+
"28196","Lilydale Station/East William St (Lilydale)","-37.7575706259904","145.345644021564"
|
|
18
|
+
"28198","Lilydale Station/Main St (Lilydale)","-37.756739520712","145.345503616316"
|
|
19
|
+
"51586","Huntingdale Station/Haughton Rd (Oakleigh)","-37.9111998619901","145.103064853799"
|
|
20
|
+
"22440","Huntingdale Station/Huntingdale Rd (Huntingdale)","-37.911010298723","145.103604328761"
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
stop_id,stop_name,stop_lat,stop_lon
|
|
2
|
+
"1000","Dole Ave/Cheddar Rd (Reservoir)","-37.7007748061827","145.018951051008"
|
|
3
|
+
"10001","Rex St/Taylors Rd (Kings Park)","-37.7269752097338","144.776152425766"
|
|
4
|
+
"10002","Yuille St/Centenary Ave (Melton)","-37.676159502415","144.595789405034"
|
|
5
|
+
"10009","Gum Rd/Main Rd West (Albanvale)","-37.7414971143105","144.775899388911"
|
|
6
|
+
"28675","Melbourne University/Grattan St (Carlton)","-37.800110297337","144.960705753974"
|