Wed, 28 Jun 2017 17:04:51 +0300
Yöllä hetken päästä lähteville kirkas väri
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(): |
32
ca1a0ea81cf6
Yhdistetty pysäkki.png ja iso-pysäkki.png
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
35 | if stop_id: |
ca1a0ea81cf6
Yhdistetty pysäkki.png ja iso-pysäkki.png
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
36 | if stop_id not in bus_stops: |
ca1a0ea81cf6
Yhdistetty pysäkki.png ja iso-pysäkki.png
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
37 | print('Representative %r for region %r not found in schedule' % (stop_id, name), file = sys.stderr) |
6 | 38 | else: |
32
ca1a0ea81cf6
Yhdistetty pysäkki.png ja iso-pysäkki.png
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
39 | for district_shape in district_shapes: |
ca1a0ea81cf6
Yhdistetty pysäkki.png ja iso-pysäkki.png
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
40 | if district_shape.sisältää_pisteen(bus_stops[stop_id]): |
ca1a0ea81cf6
Yhdistetty pysäkki.png ja iso-pysäkki.png
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
41 | assert name not in districts |
ca1a0ea81cf6
Yhdistetty pysäkki.png ja iso-pysäkki.png
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
42 | districts[name] = district_shape |
ca1a0ea81cf6
Yhdistetty pysäkki.png ja iso-pysäkki.png
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
43 | district_shapes.remove(district_shape) |
ca1a0ea81cf6
Yhdistetty pysäkki.png ja iso-pysäkki.png
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
44 | bus_stop_districts[stop_id] = name |
ca1a0ea81cf6
Yhdistetty pysäkki.png ja iso-pysäkki.png
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
45 | break |
ca1a0ea81cf6
Yhdistetty pysäkki.png ja iso-pysäkki.png
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
46 | else: |
ca1a0ea81cf6
Yhdistetty pysäkki.png ja iso-pysäkki.png
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
47 | print('Cannot find a shape for %r' % name, file = sys.stderr) |
2 | 48 | |
7
f3791dccfd03
Käännetty tiedostojen nimet englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
6
diff
changeset
|
49 | for stop_id, stop_position in bus_stops.items(): |
2 | 50 | for district, shape in districts.items(): |
5 | 51 | if shape.sisältää_pisteen(stop_position): |
2 | 52 | bus_stop_districts[stop_id] = district |
53 | break | |
54 | else: | |
55 | bus_stop_districts[stop_id] = None | |
56 | ||
32
ca1a0ea81cf6
Yhdistetty pysäkki.png ja iso-pysäkki.png
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
57 | covered = sum(1 if value else 0 for value in bus_stop_districts.values()) |
7
f3791dccfd03
Käännetty tiedostojen nimet englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
6
diff
changeset
|
58 | total = len(bus_stops) |
2 | 59 | print('%.1f%% bus stops covered.' % (covered * 100 / total), file = sys.stderr) |
60 | json.dump(bus_stop_districts, sys.stdout, indent = 2) |