Thu, 30 Jul 2020 21:52:31 +0300
destination processing
2 | 1 | #!/usr/bin/env python3 |
2 | import sqlalchemy | |
3 | import sqlalchemy.orm | |
4 | from regions import parse_regions | |
5 | from datamodel import * | |
6 | engine = sqlalchemy.create_engine('sqlite:///gtfs.db') | |
7 | GtfsBase.metadata.create_all(engine) | |
8 | session = sqlalchemy.orm.sessionmaker(bind = engine)() | |
9 | regions = parse_regions('föli.osm') | |
10 | ||
11 | def filter_itinerary(raw_itinerary): | |
12 | encountered = set() | |
13 | for region in raw_itinerary: | |
14 | if region and region not in encountered: | |
15 | yield region | |
16 | encountered.add(region) | |
17 | ||
18 | def get_stoptimes(session): | |
19 | yield from session \ | |
20 | .query(GtfsStopTime) \ | |
21 | .filter(GtfsStopTime.destination == None) \ | |
22 | .limit(1000) | |
23 | ||
24 | def length_left(stoptime): | |
25 | return stoptime.trip.shape.length - stoptime.shape_distance_traveled | |
26 | ||
27 | amount = session.query(GtfsStopTime).filter(GtfsStopTime.destination == None).count() | |
28 | k = 0 | |
29 | got_stoptimes = amount != 0 | |
30 | ||
31 | while got_stoptimes: | |
32 | print('%.2f%%' % (k * 100 / amount)) | |
33 | got_stoptimes = False | |
34 | for stoptime in get_stoptimes(session): | |
35 | got_stoptimes = True | |
36 | k += 1 | |
37 | itinerary = list(filter_itinerary( | |
38 | entry.stop.stop_region | |
39 | for entry in session.query(GtfsStopTime) | |
40 | .filter(GtfsStopTime.trip_id == stoptime.trip_id) | |
41 | .filter(GtfsStopTime.stop_sequence > stoptime.stop_sequence) | |
42 | )) | |
43 | from busroute import destinations_list | |
44 | dests = destinations_list( | |
45 | itinerary = itinerary, | |
46 | trip_length = float(length_left(stoptime)), | |
47 | regions = regions, | |
48 | ) | |
49 | stoptime.destination = '-'.join(dests) | |
50 | session.commit() |