9 |
9 |
10 def muunna_ajovuoro_tunniste(tunniste): |
10 def muunna_ajovuoro_tunniste(tunniste): |
11 return tunniste |
11 return tunniste |
12 |
12 |
13 class Ajovuoro: |
13 class Ajovuoro: |
14 def __init__(self, tunniste, linja, palvelu, kyltti, suunta): |
14 def __init__(self, tunniste, linja, palvelu, kyltti, suunta, length): |
15 self.tunniste, self.linja, self.palvelu, self.kyltti, self.suunta = tunniste, linja, \ |
15 self.tunniste, self.linja, self.palvelu, self.kyltti, self.suunta = tunniste, linja, \ |
16 palvelu, kyltti, suunta |
16 palvelu, kyltti, suunta |
|
17 self.length = length |
17 self.reitti = [] |
18 self.reitti = [] |
18 self.nimi = muunna_ajovuoro_tunniste(tunniste) |
19 self.nimi = muunna_ajovuoro_tunniste(tunniste) |
19 def __repr__(self): |
20 def __repr__(self): |
20 return 'ajot[%r]' % self.nimi |
21 return 'ajot[%r]' % self.nimi |
21 def pysäkkiReitillä(self, pysäkki): |
22 def pysäkkiReitillä(self, pysäkki): |
106 # jos tämä ajovuoro ajetaan tänä päivänä |
107 # jos tämä ajovuoro ajetaan tänä päivänä |
107 if trip.ajetaan_päivänä(date): |
108 if trip.ajetaan_päivänä(date): |
108 # ja jos tämä ajo pysähtyy tällä pysäkillä, ei kuitenkaan saapuen |
109 # ja jos tämä ajo pysähtyy tällä pysäkillä, ei kuitenkaan saapuen |
109 # päätepysäkille, |
110 # päätepysäkille, |
110 stop = trip.pysäkkiReitillä(self) |
111 stop = trip.pysäkkiReitillä(self) |
111 if stop and stop is not trip.reitti[-1]: |
112 if stop and not stop.isArrival(): # stop is not trip.reitti[-1]: |
112 # ja jos tämä pysähdys on tulevaisuudessa, |
113 # ja jos tämä pysähdys on tulevaisuudessa, |
113 stop_time = datetime.combine(date, time()) + stop.saapumisaika |
114 stop_time = datetime.combine(date, time()) + stop.saapumisaika |
114 if stop_time >= nyt(): |
115 if stop_time >= nyt(): |
115 # lisää pysähdys listaan. |
116 # lisää pysähdys listaan. |
116 result.append({ |
117 result.append({ |
121 # Lajittele lopputulos saapumisajan mukaan. |
122 # Lajittele lopputulos saapumisajan mukaan. |
122 result.sort(key = lambda schedule_entry: schedule_entry['time']) |
123 result.sort(key = lambda schedule_entry: schedule_entry['time']) |
123 return result |
124 return result |
124 |
125 |
125 class Pysähdys: |
126 class Pysähdys: |
126 def __init__(self, saapumisaika, lähtöaika, pysäkki, ajo): |
127 def __init__(self, saapumisaika, lähtöaika, pysäkki, ajo, ajettu_matka): |
127 self.saapumisaika, self.lähtöaika, self.pysäkki, self.ajo = saapumisaika, lähtöaika, \ |
128 self.saapumisaika, self.lähtöaika, self.pysäkki, self.ajo = saapumisaika, lähtöaika, \ |
128 pysäkki, ajo |
129 pysäkki, ajo |
|
130 self.ajettu_matka = ajettu_matka |
|
131 def isArrival(self): |
|
132 iterator = iter(self.ajo.reitti) |
|
133 stop = next(iterator) |
|
134 while stop is not self: |
|
135 stop = next(iterator) |
|
136 for stop in iterator: |
|
137 if stop.pysäkki.alue != self.pysäkki.alue: |
|
138 return False |
|
139 return True |
129 def __repr__(self): |
140 def __repr__(self): |
130 return 'Pysähdys(%r, %r, %r, %r)' % (self.saapumisaika, self.lähtöaika, self.pysäkki, self.ajo) |
141 return 'Pysähdys(%r, %r, %r, %r)' % (self.saapumisaika, self.lähtöaika, self.pysäkki, self.ajo) |
131 |
142 |
132 linjat = {} |
143 linjat = {} |
133 linjat_per_tunniste = {} |
144 linjat_per_tunniste = {} |
145 linjat[linja.viite] = linja |
156 linjat[linja.viite] = linja |
146 linjat_per_tunniste[linja.tunniste] = linja |
157 linjat_per_tunniste[linja.tunniste] = linja |
147 print('%d linjaa' % len(linjat), file = stderr) |
158 print('%d linjaa' % len(linjat), file = stderr) |
148 |
159 |
149 print('Ladataan ajot... ', file = stderr, end = '', flush = True) |
160 print('Ladataan ajot... ', file = stderr, end = '', flush = True) |
|
161 |
|
162 shape_distances = {} |
|
163 with open('gtfs/shapes.txt') as file: |
|
164 for row in lue_csv(file): |
|
165 shape_distances[row['shape_id']] = max(shape_distances.get(row['shape_id'], 0), float(row['shape_dist_traveled'])) |
|
166 |
150 with open('gtfs/trips.txt') as tiedosto: |
167 with open('gtfs/trips.txt') as tiedosto: |
151 for rivi in lue_csv(tiedosto, muunnokset = {'direction_id': lambda k: Suunta(int(k))}): |
168 for rivi in lue_csv(tiedosto, muunnokset = {'direction_id': lambda k: Suunta(int(k))}): |
152 if rivi['service_id'] not in palvelut: |
169 if rivi['service_id'] not in palvelut: |
153 palvelut[rivi['service_id']] = Palvelu(rivi['service_id']) |
170 palvelut[rivi['service_id']] = Palvelu(rivi['service_id']) |
154 linja = linjat_per_tunniste[rivi['route_id']] |
171 linja = linjat_per_tunniste[rivi['route_id']] |
155 ajo = Ajovuoro(tunniste = rivi['trip_id'], |
172 ajo = Ajovuoro( |
|
173 tunniste = rivi['trip_id'], |
156 linja = linja, |
174 linja = linja, |
157 palvelu = palvelut[rivi['service_id']], |
175 palvelu = palvelut[rivi['service_id']], |
158 kyltti = rivi['trip_headsign'], |
176 kyltti = rivi['trip_headsign'], |
159 suunta = rivi['direction_id']) |
177 suunta = rivi['direction_id'], |
|
178 length = shape_distances[rivi['shape_id']] |
|
179 ) |
160 assert ajo.nimi not in ajot |
180 assert ajo.nimi not in ajot |
161 ajot[ajo.nimi] = ajo |
181 ajot[ajo.nimi] = ajo |
162 print('%d ajoa' % len(ajot), file = stderr) |
182 print('%d ajoa' % len(ajot), file = stderr) |
163 |
183 |
164 def lue_päiväys(teksti): |
184 def lue_päiväys(teksti): |
346 for rivi in lue_csv(file): |
366 for rivi in lue_csv(file): |
347 ajo = ajot[muunna_ajovuoro_tunniste(rivi['trip_id'])] |
367 ajo = ajot[muunna_ajovuoro_tunniste(rivi['trip_id'])] |
348 saapumisaika = lue_aika(rivi['arrival_time']) |
368 saapumisaika = lue_aika(rivi['arrival_time']) |
349 lähtöaika = lue_aika(rivi['departure_time']) |
369 lähtöaika = lue_aika(rivi['departure_time']) |
350 pysäkki = pysäkit[rivi['stop_id']] |
370 pysäkki = pysäkit[rivi['stop_id']] |
351 ajo.reitti.append(Pysähdys(saapumisaika, lähtöaika, pysäkki, ajo)) |
371 ajettu_matka = float(rivi['shape_dist_traveled']) |
|
372 ajo.reitti.append(Pysähdys(saapumisaika, lähtöaika, pysäkki, ajo, ajettu_matka)) |
352 laskettu += 1 |
373 laskettu += 1 |
353 if laskettu % 1000 == 0: |
374 if laskettu % 1000 == 0: |
354 print('\rLadataan aikataulut... %.1f%%' % (laskettu * 100 / rivimäärä), end = ' ', file = stderr) |
375 print('\rLadataan aikataulut... %.1f%%' % (laskettu * 100 / rivimäärä), end = ' ', file = stderr) |
355 print('\rLadataan aikataulut... ladattu', file = stderr) |
376 print('\rLadataan aikataulut... ladattu', file = stderr) |