buses.py

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

mercurial