Sat, 23 Sep 2017 01:23:25 +0300
Ruotsia
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 = [] | |
30 | for polygon in data[1].splitlines(): | |
1 | 31 | polygon = polygon.split('^') |
32 | coordinates = [] | |
33 | for point in polygon[3].split('~'): | |
34 | x, y = point.split(',') | |
5 | 35 | coordinates.append(Sijainti(float(x), float(y))) |
36 | district_shapes.append(Monikulmio(*coordinates)) | |
2 | 37 | |
38 | districts = {} | |
39 | bus_stop_districts = {} | |
1 | 40 | |
2 | 41 | 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
|
42 | if stop_id: |
ca1a0ea81cf6
Yhdistetty pysäkki.png ja iso-pysäkki.png
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
43 | 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
|
44 | print('Representative %r for region %r not found in schedule' % (stop_id, name), file = sys.stderr) |
6 | 45 | else: |
32
ca1a0ea81cf6
Yhdistetty pysäkki.png ja iso-pysäkki.png
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
46 | 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
|
47 | 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
|
48 | assert name not in districts |
ca1a0ea81cf6
Yhdistetty pysäkki.png ja iso-pysäkki.png
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
49 | districts[name] = district_shape |
ca1a0ea81cf6
Yhdistetty pysäkki.png ja iso-pysäkki.png
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
50 | district_shapes.remove(district_shape) |
ca1a0ea81cf6
Yhdistetty pysäkki.png ja iso-pysäkki.png
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
51 | 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
|
52 | break |
ca1a0ea81cf6
Yhdistetty pysäkki.png ja iso-pysäkki.png
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
53 | else: |
ca1a0ea81cf6
Yhdistetty pysäkki.png ja iso-pysäkki.png
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
54 | print('Cannot find a shape for %r' % name, file = sys.stderr) |
2 | 55 | |
7
f3791dccfd03
Käännetty tiedostojen nimet englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
6
diff
changeset
|
56 | for stop_id, stop_position in bus_stops.items(): |
2 | 57 | for district, shape in districts.items(): |
5 | 58 | if shape.sisältää_pisteen(stop_position): |
2 | 59 | bus_stop_districts[stop_id] = district |
60 | break | |
61 | else: | |
62 | bus_stop_districts[stop_id] = None | |
63 | ||
32
ca1a0ea81cf6
Yhdistetty pysäkki.png ja iso-pysäkki.png
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
64 | 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
|
65 | total = len(bus_stops) |
2 | 66 | print('%.1f%% bus stops covered.' % (covered * 100 / total), file = sys.stderr) |
67 | json.dump(bus_stop_districts, sys.stdout, indent = 2) |