Thu, 30 Jul 2020 21:52:31 +0300
destination processing
#!/usr/bin/env python3 import sqlalchemy import sqlalchemy.orm from regions import parse_regions from datamodel import * engine = sqlalchemy.create_engine('sqlite:///gtfs.db') GtfsBase.metadata.create_all(engine) session = sqlalchemy.orm.sessionmaker(bind = engine)() regions = parse_regions('föli.osm') def filter_itinerary(raw_itinerary): encountered = set() for region in raw_itinerary: if region and region not in encountered: yield region encountered.add(region) def get_stoptimes(session): yield from session \ .query(GtfsStopTime) \ .filter(GtfsStopTime.destination == None) \ .limit(1000) def length_left(stoptime): return stoptime.trip.shape.length - stoptime.shape_distance_traveled amount = session.query(GtfsStopTime).filter(GtfsStopTime.destination == None).count() k = 0 got_stoptimes = amount != 0 while got_stoptimes: print('%.2f%%' % (k * 100 / amount)) got_stoptimes = False for stoptime in get_stoptimes(session): got_stoptimes = True k += 1 itinerary = list(filter_itinerary( entry.stop.stop_region for entry in session.query(GtfsStopTime) .filter(GtfsStopTime.trip_id == stoptime.trip_id) .filter(GtfsStopTime.stop_sequence > stoptime.stop_sequence) )) from busroute import destinations_list dests = destinations_list( itinerary = itinerary, trip_length = float(length_left(stoptime)), regions = regions, ) stoptime.destination = '-'.join(dests) session.commit()