Thu, 29 Mar 2018 23:55:36 +0300
updates
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 |
52 | 6 | from configparser import ConfigParser |
7 | ||
8 | representatives = {} | |
9 | ||
10 | region_data = ConfigParser() | |
11 | region_data.read('regions.ini') | |
12 | ||
13 | for section in region_data.sections(): | |
14 | for key, value in region_data[section].items(): | |
15 | representatives[key] = value | |
2 | 16 | |
7
f3791dccfd03
Käännetty tiedostojen nimet englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
6
diff
changeset
|
17 | with open('regions.gmp') as file: |
2 | 18 | data = file.read().split('@') |
1 | 19 | |
7
f3791dccfd03
Käännetty tiedostojen nimet englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
6
diff
changeset
|
20 | bus_stops = {} |
2 | 21 | |
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
27
diff
changeset
|
22 | 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
|
23 | 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
|
24 | 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
|
25 | 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
|
26 | reference = row['stop_id'] |
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
27
diff
changeset
|
27 | bus_stops[reference] = location |
2 | 28 | |
29 | district_shapes = [] | |
73
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
52
diff
changeset
|
30 | districts = {} |
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
52
diff
changeset
|
31 | |
2 | 32 | for polygon in data[1].splitlines(): |
1 | 33 | polygon = polygon.split('^') |
34 | coordinates = [] | |
35 | for point in polygon[3].split('~'): | |
36 | x, y = point.split(',') | |
5 | 37 | coordinates.append(Sijainti(float(x), float(y))) |
38 | district_shapes.append(Monikulmio(*coordinates)) | |
73
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
52
diff
changeset
|
39 | if polygon[0] != 'undefined': |
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
52
diff
changeset
|
40 | districts[polygon[0]] = district_shapes[-1] |
2 | 41 | |
42 | bus_stop_districts = {} | |
1 | 43 | |
2 | 44 | 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
|
45 | if stop_id: |
ca1a0ea81cf6
Yhdistetty pysäkki.png ja iso-pysäkki.png
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
46 | 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
|
47 | print('Representative %r for region %r not found in schedule' % (stop_id, name), file = sys.stderr) |
6 | 48 | else: |
32
ca1a0ea81cf6
Yhdistetty pysäkki.png ja iso-pysäkki.png
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
49 | 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
|
50 | 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
|
51 | assert name not in districts |
ca1a0ea81cf6
Yhdistetty pysäkki.png ja iso-pysäkki.png
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
52 | districts[name] = district_shape |
ca1a0ea81cf6
Yhdistetty pysäkki.png ja iso-pysäkki.png
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
53 | district_shapes.remove(district_shape) |
ca1a0ea81cf6
Yhdistetty pysäkki.png ja iso-pysäkki.png
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
54 | 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
|
55 | break |
ca1a0ea81cf6
Yhdistetty pysäkki.png ja iso-pysäkki.png
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
56 | else: |
ca1a0ea81cf6
Yhdistetty pysäkki.png ja iso-pysäkki.png
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
57 | print('Cannot find a shape for %r' % name, file = sys.stderr) |
2 | 58 | |
7
f3791dccfd03
Käännetty tiedostojen nimet englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
6
diff
changeset
|
59 | for stop_id, stop_position in bus_stops.items(): |
2 | 60 | for district, shape in districts.items(): |
5 | 61 | if shape.sisältää_pisteen(stop_position): |
2 | 62 | bus_stop_districts[stop_id] = district |
63 | break | |
64 | else: | |
65 | bus_stop_districts[stop_id] = None | |
66 | ||
32
ca1a0ea81cf6
Yhdistetty pysäkki.png ja iso-pysäkki.png
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
67 | 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
|
68 | total = len(bus_stops) |
2 | 69 | print('%.1f%% bus stops covered.' % (covered * 100 / total), file = sys.stderr) |
70 | json.dump(bus_stop_districts, sys.stdout, indent = 2) |