Wed, 28 Jun 2017 12:20:05 +0300
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
- gtfs.zip ei enää tarvitse avata
1 | 1 | #!/usr/bin/env python3 |
2 | 2 | import sys, json |
3 | from misc import * | |
7
f3791dccfd03
Käännetty tiedostojen nimet englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
6
diff
changeset
|
4 | from geometry import * |
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
27
diff
changeset
|
5 | from zipfile import ZipFile |
2 | 6 | |
7
f3791dccfd03
Käännetty tiedostojen nimet englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
6
diff
changeset
|
7 | with open('regions.gmp') as file: |
2 | 8 | data = file.read().split('@') |
1 | 9 | |
7
f3791dccfd03
Käännetty tiedostojen nimet englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
6
diff
changeset
|
10 | with open('region-representatives.json') as file: |
2 | 11 | representatives = json.load(file) |
12 | ||
7
f3791dccfd03
Käännetty tiedostojen nimet englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
6
diff
changeset
|
13 | bus_stops = {} |
2 | 14 | |
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
27
diff
changeset
|
15 | with ZipFile('gtfs.zip') as archive: |
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
27
diff
changeset
|
16 | with archive.open('stops.txt') as file: |
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
27
diff
changeset
|
17 | for row in read_csv(map(bytes.decode, file)): |
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
27
diff
changeset
|
18 | location = Sijainti(float(row['stop_lat']), float(row['stop_lon'])) |
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
27
diff
changeset
|
19 | reference = row['stop_id'] |
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
27
diff
changeset
|
20 | bus_stops[reference] = location |
2 | 21 | |
22 | district_shapes = [] | |
23 | for polygon in data[1].splitlines(): | |
1 | 24 | polygon = polygon.split('^') |
25 | coordinates = [] | |
26 | for point in polygon[3].split('~'): | |
27 | x, y = point.split(',') | |
5 | 28 | coordinates.append(Sijainti(float(x), float(y))) |
29 | district_shapes.append(Monikulmio(*coordinates)) | |
2 | 30 | |
31 | districts = {} | |
32 | bus_stop_districts = {} | |
1 | 33 | |
2 | 34 | for name, stop_id in representatives.items(): |
35 | if stop_id is None: | |
36 | continue | |
7
f3791dccfd03
Käännetty tiedostojen nimet englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
6
diff
changeset
|
37 | if stop_id not in bus_stops: |
f3791dccfd03
Käännetty tiedostojen nimet englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
6
diff
changeset
|
38 | print('Representative %r for region %r not found in schedule' % (stop_id, name), file = sys.stderr) |
2 | 39 | else: |
6 | 40 | for district_shape in district_shapes: |
7
f3791dccfd03
Käännetty tiedostojen nimet englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
6
diff
changeset
|
41 | if district_shape.sisältää_pisteen(bus_stops[stop_id]): |
6 | 42 | assert name not in districts |
43 | districts[name] = district_shape | |
44 | district_shapes.remove(district_shape) | |
45 | bus_stop_districts[stop_id] = name | |
46 | break | |
47 | else: | |
7
f3791dccfd03
Käännetty tiedostojen nimet englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
6
diff
changeset
|
48 | print('Cannot find a shape for %r' % name, file = sys.stderr) |
2 | 49 | |
7
f3791dccfd03
Käännetty tiedostojen nimet englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
6
diff
changeset
|
50 | for stop_id, stop_position in bus_stops.items(): |
2 | 51 | for district, shape in districts.items(): |
5 | 52 | if shape.sisältää_pisteen(stop_position): |
2 | 53 | bus_stop_districts[stop_id] = district |
54 | break | |
55 | else: | |
56 | bus_stop_districts[stop_id] = None | |
57 | ||
58 | covered = sum(int(bool(k)) for k in bus_stop_districts.values()) | |
7
f3791dccfd03
Käännetty tiedostojen nimet englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
6
diff
changeset
|
59 | total = len(bus_stops) |
2 | 60 | print('%.1f%% bus stops covered.' % (covered * 100 / total), file = sys.stderr) |
61 | json.dump(bus_stop_districts, sys.stdout, indent = 2) |