--- a/buses.py Tue Jun 13 00:47:24 2017 +0300 +++ b/buses.py Tue Jun 20 09:37:43 2017 +0300 @@ -11,9 +11,10 @@ return tunniste class Ajovuoro: - def __init__(self, tunniste, linja, palvelu, kyltti, suunta): + def __init__(self, tunniste, linja, palvelu, kyltti, suunta, length): self.tunniste, self.linja, self.palvelu, self.kyltti, self.suunta = tunniste, linja, \ palvelu, kyltti, suunta + self.length = length self.reitti = [] self.nimi = muunna_ajovuoro_tunniste(tunniste) def __repr__(self): @@ -108,7 +109,7 @@ # ja jos tämä ajo pysähtyy tällä pysäkillä, ei kuitenkaan saapuen # päätepysäkille, stop = trip.pysäkkiReitillä(self) - if stop and stop is not trip.reitti[-1]: + if stop and not stop.isArrival(): # stop is not trip.reitti[-1]: # ja jos tämä pysähdys on tulevaisuudessa, stop_time = datetime.combine(date, time()) + stop.saapumisaika if stop_time >= nyt(): @@ -123,9 +124,19 @@ return result class Pysähdys: - def __init__(self, saapumisaika, lähtöaika, pysäkki, ajo): + def __init__(self, saapumisaika, lähtöaika, pysäkki, ajo, ajettu_matka): self.saapumisaika, self.lähtöaika, self.pysäkki, self.ajo = saapumisaika, lähtöaika, \ pysäkki, ajo + self.ajettu_matka = ajettu_matka + def isArrival(self): + iterator = iter(self.ajo.reitti) + stop = next(iterator) + while stop is not self: + stop = next(iterator) + for stop in iterator: + if stop.pysäkki.alue != self.pysäkki.alue: + return False + return True def __repr__(self): return 'Pysähdys(%r, %r, %r, %r)' % (self.saapumisaika, self.lähtöaika, self.pysäkki, self.ajo) @@ -147,16 +158,25 @@ print('%d linjaa' % len(linjat), file = stderr) print('Ladataan ajot... ', file = stderr, end = '', flush = True) + +shape_distances = {} +with open('gtfs/shapes.txt') as file: + for row in lue_csv(file): + shape_distances[row['shape_id']] = max(shape_distances.get(row['shape_id'], 0), float(row['shape_dist_traveled'])) + with open('gtfs/trips.txt') as tiedosto: for rivi in lue_csv(tiedosto, muunnokset = {'direction_id': lambda k: Suunta(int(k))}): if rivi['service_id'] not in palvelut: palvelut[rivi['service_id']] = Palvelu(rivi['service_id']) linja = linjat_per_tunniste[rivi['route_id']] - ajo = Ajovuoro(tunniste = rivi['trip_id'], + ajo = Ajovuoro( + tunniste = rivi['trip_id'], linja = linja, palvelu = palvelut[rivi['service_id']], kyltti = rivi['trip_headsign'], - suunta = rivi['direction_id']) + suunta = rivi['direction_id'], + length = shape_distances[rivi['shape_id']] + ) assert ajo.nimi not in ajot ajot[ajo.nimi] = ajo print('%d ajoa' % len(ajot), file = stderr) @@ -348,7 +368,8 @@ saapumisaika = lue_aika(rivi['arrival_time']) lähtöaika = lue_aika(rivi['departure_time']) pysäkki = pysäkit[rivi['stop_id']] - ajo.reitti.append(Pysähdys(saapumisaika, lähtöaika, pysäkki, ajo)) + ajettu_matka = float(rivi['shape_dist_traveled']) + ajo.reitti.append(Pysähdys(saapumisaika, lähtöaika, pysäkki, ajo, ajettu_matka)) laskettu += 1 if laskettu % 1000 == 0: print('\rLadataan aikataulut... %.1f%%' % (laskettu * 100 / rivimäärä), end = ' ', file = stderr)