gtfsc.py

Thu, 30 Jul 2020 21:52:31 +0300

author
Teemu Piippo <teemu@hecknology.net>
date
Thu, 30 Jul 2020 21:52:31 +0300
changeset 2
7378b802ddf8
parent 1
f9788970fa46
permissions
-rwxr-xr-x

destination processing

1
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
1 #!/usr/bin/env python3
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
2 import io
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
3 import sys
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
4 import sqlalchemy
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
5 import sqlalchemy.orm
2
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
6 import datetime
1
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
7 from datamodel import *
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
8
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
9 ROUTE_TYPES = {
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
10 '0': 'tram',
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
11 '1': 'subway',
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
12 '2': 'rail',
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
13 '3': 'bus',
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
14 '4': 'ferry',
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
15 '5': 'cable-tram',
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
16 '6': 'aerial-lift',
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
17 '7': 'funicular',
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
18 '11': 'trolleybus',
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
19 '12': 'monorail',
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
20 }
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
21
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
22 def read_csv(file):
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
23 import csv
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
24 reader = csv.reader(file)
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
25 keys = next(reader)
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
26 for i in range(len(keys)):
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
27 keys[i] = keys[i].replace('\ufeff', '').strip()
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
28 for row in reader:
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
29 yield dict(zip(keys, row))
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
30
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
31 def load_gtfs_routes(gtfs_zip):
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
32 with gtfs_zip.open('routes.txt') as file:
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
33 for row in read_csv(map(bytes.decode, file)):
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
34 route = GtfsRoute(
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
35 id = row['route_id'],
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
36 reference = row['route_short_name'],
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
37 description = row['route_long_name'],
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
38 type = int(row['route_type']),
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
39 )
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
40 yield route.id, route
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
41
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
42 def load_shapes(gtfs_zip):
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
43 from collections import defaultdict
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
44 shapes = dict()
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
45 with gtfs_zip.open('shapes.txt') as file:
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
46 for row in read_csv(map(bytes.decode, file)):
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
47 shape_id = row['shape_id']
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
48 if shape_id not in shapes:
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
49 shapes[shape_id] = GtfsShape(
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
50 id = shape_id,
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
51 shape_coordinates = '',
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
52 length = 0,
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
53 )
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
54 shape = shapes[shape_id]
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
55 if len(shape.shape_coordinates) > 0:
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
56 shape.shape_coordinates += ' '
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
57 shape.shape_coordinates += str.format(
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
58 '{shape_pt_lat} {shape_pt_lon}',
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
59 **row,
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
60 )
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
61 shape.length = max(shape.length, float(row['shape_dist_traveled']))
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
62 return shapes.values()
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
63
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
64 def trip_length(trip, *, shapes):
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
65 if trip.shape_id:
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
66 return dict.get(shapes, trip.shape_id).length * float(profile['metrics']['shape-modifier'])
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
67 else:
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
68 return 0
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
69
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
70 def load_trips(gtfs_zip):
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
71 services = set()
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
72 with gtfs_zip.open('trips.txt') as file:
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
73 for row in read_csv(map(bytes.decode, file)):
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
74 if row['service_id'] not in services:
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
75 set.add(services, row['service_id'])
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
76 yield GtfsService(id = row['service_id'])
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
77 yield GtfsTrip(
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
78 id = row['trip_id'],
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
79 route_id = row['route_id'],
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
80 service = row['service_id'],
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
81 shape_id = dict.get(row, 'shape_id')
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
82 )
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
83
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
84 def load_stops(gtfs_zip):
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
85 with gtfs_zip.open('stops.txt') as file:
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
86 for row in read_csv(map(bytes.decode, file)):
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
87 lat = float(row['stop_lat'])
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
88 lon = float(row['stop_lon'])
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
89 yield GtfsStop(
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
90 stop_id = row['stop_id'],
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
91 stop_name = row['stop_name'],
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
92 stop_latitude = lat,
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
93 stop_longitude = float(row['stop_lon']),
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
94 )
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
95
2
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
96 def parse_time(timetext):
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
97 hour, minute, second = map(int, timetext.split(':'))
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
98 return datetime.timedelta(hours = hour, minutes = minute, seconds = second)
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
99
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
100 def load_stop_times(gtfs_zip):
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
101 with gtfs_zip.open('stop_times.txt') as file:
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
102 for row in read_csv(map(bytes.decode, file)):
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
103 yield GtfsStopTime(
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
104 trip_id = row['trip_id'],
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
105 stop_id = row['stop_id'],
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
106 arrival_time = parse_time(row['arrival_time']),
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
107 departure_time = parse_time(row['departure_time']),
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
108 stop_sequence = int(row['stop_sequence']),
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
109 shape_distance_traveled = float(row['shape_dist_traveled']),
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
110 )
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
111
1
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
112 def gtfs_stop_spatial_testing(session, regions):
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
113 print('Finding out in which regions bus stops are...')
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
114 from compute_regions import RegionTester
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
115 regiontester = RegionTester(regions)
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
116 for bus_stop in session.query(GtfsStop):
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
117 classification = regiontester(
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
118 latitude = bus_stop.stop_latitude,
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
119 longitude = bus_stop.stop_longitude,
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
120 )
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
121 if classification:
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
122 bus_stop.stop_region = classification.region
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
123 bus_stop.stop_region_major = classification.region_class == 'major'
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
124
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
125 def load_with_loading_text(fn, what, device):
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
126 print(
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
127 str.format('Loading {}s... ', what),
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
128 file = device,
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
129 end = '',
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
130 flush = True,
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
131 )
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
132 result = fn()
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
133 print(
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
134 str.format(
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
135 '{n} {what}s',
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
136 n = len(result if type(result) is not tuple else result[0]),
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
137 what = what,
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
138 ),
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
139 file = device,
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
140 )
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
141 return result
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
142
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
143 def load_gtfs(
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
144 gtfs_zip_path,
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
145 *,
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
146 profile,
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
147 session,
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
148 device = sys.stderr
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
149 ):
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
150 from zipfile import ZipFile
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
151 with ZipFile(gtfs_zip_path) as gtfs_zip:
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
152 print('Loading routes...')
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
153 for route_id, route in load_gtfs_routes(gtfs_zip):
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
154 session.add(route)
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
155 print('Loading stops...')
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
156 for stop in load_stops(gtfs_zip):
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
157 session.add(stop)
2
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
158 session.commit()
1
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
159 print('Loading shapes...')
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
160 for shape in load_shapes(gtfs_zip):
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
161 session.add(shape)
2
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
162 session.commit()
1
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
163 print('Loading trips...')
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
164 for trip_or_service in load_trips(gtfs_zip):
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
165 session.add(trip_or_service)
2
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
166 session.commit()
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
167 print('Loading stop times...')
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
168 for i, stop_time in enumerate(load_stop_times(gtfs_zip)):
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
169 if i & 0xffff == 0:
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
170 # commit every now and then to keep RAM usage under control
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
171 session.commit()
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
172 session.add(stop_time)
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
173 session.commit()
1
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
174
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
175 def parse_yesno(value):
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
176 return value and value != 'no'
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
177
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
178 def regions_to_db(regions):
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
179 from itertools import product
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
180 for region in regions.values():
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
181 names = dict()
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
182 for prefix, language in product(
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
183 ['', 'short_', 'internal_'],
2
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
184 ['fi', 'sv', 'en', 'ja'],
1
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
185 ):
2
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
186 key = 'region_' + prefix + 'name_' + language
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
187 value = dict.get(region, prefix + 'name:' + language)
1
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
188 names[key] = value
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
189 yield GtfsRegion(
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
190 **names,
2
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
191 ref = region['ref'],
1
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
192 municipality = dict.get(region, 'municipality'),
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
193 external = parse_yesno(dict.get(region, 'external')),
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
194 )
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
195
2
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
196 def get_args():
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
197 import argparse
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
198 parser = argparse.ArgumentParser()
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
199 parser.add_argument('profile')
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
200 parser.add_argument('gtfs')
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
201 parser.add_argument('--process-only', action = 'store_true')
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
202 return parser.parse_args()
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
203
1
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
204 if __name__ == '__main__':
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
205 from configparser import ConfigParser
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
206 from regions import parse_regions
2
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
207 args = get_args()
1
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
208 profile = ConfigParser()
2
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
209 profile.read(args.profile)
1
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
210 engine = sqlalchemy.create_engine('sqlite:///gtfs.db')
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
211 GtfsBase.metadata.create_all(engine)
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
212 session = sqlalchemy.orm.sessionmaker(bind = engine)()
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
213 regions = parse_regions('föli.osm')
2
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
214 if not args.process_only:
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
215 for region in regions_to_db(regions):
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
216 session.add(region)
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
217 session.commit()
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
218 buses = load_gtfs(args.gtfs, profile = profile, session = session)
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
219 gtfs_stop_spatial_testing(session = session, regions = regions)
1
f9788970fa46 begin work on bus compiler
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
220 session.commit()

mercurial