buses.py

changeset 22
3d094a804af8
parent 21
6a0394d5a159
child 23
3a495bc4b7b5
equal deleted inserted replaced
21:6a0394d5a159 22:3d094a804af8
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)

mercurial