|    151 			return 'ferry-terminal' | 
   150 			return 'ferry-terminal' | 
|    152 		else: | 
   151 		else: | 
|    153 			return 'bus-stop' | 
   152 			return 'bus-stop' | 
|    154  | 
   153  | 
|    155 class BusHalt: | 
   154 class BusHalt: | 
|    156 	def __init__(self, arrival_time, departure_time, stop, trip, traveled_distance): | 
   155 	def __init__(self, arrival_time, departure_time, stop, trip, traveled_distance, visitnumber): | 
|    157 		self.arrival_time, self.departure_time, self.stop, self.trip = arrival_time, departure_time, \ | 
   156 		self.arrival_time, self.departure_time, self.stop, self.trip = arrival_time, departure_time, \ | 
|    158 			stop, trip | 
   157 			stop, trip | 
|    159 		self.traveled_distance = traveled_distance | 
   158 		self.traveled_distance = traveled_distance | 
|    160 		self.uuid = uuid.uuid4() | 
   159 		self.visitnumber = visitnumber | 
|    161 	@property | 
   160 	@property | 
|    162 	def is_arrival(self): | 
   161 	def is_arrival(self): | 
|    163 		if profile['regions']['use-regions']: | 
   162 		if profile['regions']['use-regions']: | 
|    164 			if not hasattr(self, 'cachedIsArrival'): | 
   163 			if not hasattr(self, 'cachedIsArrival'): | 
|    165 				if self.stop.region: | 
   164 				if self.stop.region: | 
|    183 		return datetime.datetime.combine(date, datetime.time()) + self.departure_time | 
   182 		return datetime.datetime.combine(date, datetime.time()) + self.departure_time | 
|    184 	def arrival_datetime(self, date): | 
   183 	def arrival_datetime(self, date): | 
|    185 		import datetime | 
   184 		import datetime | 
|    186 		return datetime.datetime.combine(date, datetime.time()) + self.arrival_time | 
   185 		return datetime.datetime.combine(date, datetime.time()) + self.arrival_time | 
|    187 	def __repr__(self): | 
   186 	def __repr__(self): | 
|    188 		return 'BusHalt(%r, %r, %r, %r)' % (self.arrival_time, self.departure_time, self.stop, self.trip) | 
   187 		return 'BusHalt(%r, %r, %r, %r, %r, %r)' % (self.arrival_time, self.departure_time, self.stop, self.trip, self.traveled_distance, self.visitnumber) | 
|    189 	def sign(self, long = False): | 
   188 	def sign(self, long = False): | 
|    190 		from busroute import reduce_schedule | 
   189 		from busroute import reduce_schedule | 
|    191 		return reduce_schedule( | 
   190 		return reduce_schedule( | 
|    192 			route = self.trip.concise_schedule(self), | 
   191 			route = self.trip.concise_schedule(self), | 
|    193 			trip_length = self.trip.length - self.traveled_distance, | 
   192 			trip_length = self.trip.length - self.traveled_distance, | 
|    194 			long = long, | 
   193 			long = long, | 
|    195 		) | 
   194 		) | 
|         | 
   195 	@property | 
|         | 
   196 	def primary_key(self): | 
|         | 
   197 		arrival_time = self.trip.schedule[0].arrival_time; | 
|         | 
   198 		return self.trip.block_id + '-' + str(int(arrival_time.seconds)) + '-' + str(self.visitnumber) | 
|    196  | 
   199  | 
|    197 class BusStopCluster: | 
   200 class BusStopCluster: | 
|    198 	def __init__(self): | 
   201 	def __init__(self): | 
|    199 		self.stops = set() | 
   202 		self.stops = set() | 
|    200 		self.cached_center = None | 
   203 		self.cached_center = None | 
|    500 				trip = all_trips[transform_trip_reference(row['trip_id'])] | 
   503 				trip = all_trips[transform_trip_reference(row['trip_id'])] | 
|    501 				arrival_time = read_time(row['arrival_time']) | 
   504 				arrival_time = read_time(row['arrival_time']) | 
|    502 				departure_time = read_time(row['departure_time']) | 
   505 				departure_time = read_time(row['departure_time']) | 
|    503 				stop = bus_stops[row['stop_id']] | 
   506 				stop = bus_stops[row['stop_id']] | 
|    504 				traveled_distance = float(row.get('shape_dist_traveled', 1)) * float(profile['metrics']['shape-modifier']) | 
   507 				traveled_distance = float(row.get('shape_dist_traveled', 1)) * float(profile['metrics']['shape-modifier']) | 
|    505 				trip.schedule.append(BusHalt(arrival_time, departure_time, stop, trip, traveled_distance)) | 
   508 				visitnumber = len(trip.schedule) + 1 | 
|         | 
   509 				trip.schedule.append(BusHalt(arrival_time, departure_time, stop, trip, traveled_distance, visitnumber)) | 
|    506 				stop.involved_trips.add(trip) | 
   510 				stop.involved_trips.add(trip) | 
|    507 				progress += 1 | 
   511 				progress += 1 | 
|    508 				if progress % 1000 == 0: | 
   512 				if progress % 1000 == 0: | 
|    509 					print('\rLoading schedules... %.1f%%' % (progress * 100 / row_count), end = ' ', file = stderr) | 
   513 					print('\rLoading schedules... %.1f%%' % (progress * 100 / row_count), end = ' ', file = stderr) | 
|    510 		print('\rLoading schedules... complete', file = stderr) | 
   514 		print('\rLoading schedules... complete', file = stderr) | 
|    550 				if len(trip.schedule) >= 2: | 
   554 				if len(trip.schedule) >= 2: | 
|    551 					bus_speed_coefficient = 750 # metriƤ minuutissa | 
   555 					bus_speed_coefficient = 750 # metriƤ minuutissa | 
|    552 					last_leg_distance = trip.schedule[-1].traveled_distance - trip.schedule[-2].traveled_distance | 
   556 					last_leg_distance = trip.schedule[-1].traveled_distance - trip.schedule[-2].traveled_distance | 
|    553 					trip.schedule[-1].arrival_time = trip.schedule[-2].departure_time + timedelta(minutes = last_leg_distance / bus_speed_coefficient) | 
   557 					trip.schedule[-1].arrival_time = trip.schedule[-2].departure_time + timedelta(minutes = last_leg_distance / bus_speed_coefficient) | 
|    554  | 
   558  | 
|    555 		global trips_by_vehicle_info | 
        | 
|    556 		trips_by_vehicle_info = {} | 
        | 
|    557 		for trip in all_trips.values(): | 
        | 
|    558 			trips_by_vehicle_info[(trip.block_id, trip.schedule[0].arrival_time)] = trip | 
        | 
|    559 		# Add services to all bus stops | 
   559 		# Add services to all bus stops | 
|    560 		for route in routes.values(): | 
   560 		for route in routes.values(): | 
|    561 			for trip in route.trips: | 
   561 			for trip in route.trips: | 
|    562 				for halt in trip.schedule: | 
   562 				for halt in trip.schedule: | 
|    563 					halt.stop.services.add(route.service) | 
   563 					halt.stop.services.add(route.service) |