itienary_processing.py

changeset 2
7378b802ddf8
child 3
10ce28475e9c
equal deleted inserted replaced
1:f9788970fa46 2:7378b802ddf8
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()

mercurial