compute-regions.py

Mon, 11 Dec 2017 12:55:00 +0200

author
Teemu Piippo <teemu@hecknology.net>
date
Mon, 11 Dec 2017 12:55:00 +0200
changeset 77
83cd29dee853
parent 73
c56b0ef96514
child 88
3b86597c5a88
permissions
-rwxr-xr-x

stop_week

1
22c22ff63e66 Aluemuotoja
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
1 #!/usr/bin/env python3
2
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
2 import sys, json
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
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
cab8d38fe5c6 Kuntauudistus
Teemu Piippo <teemu@hecknology.net>
parents: 32
diff changeset
6 from configparser import ConfigParser
cab8d38fe5c6 Kuntauudistus
Teemu Piippo <teemu@hecknology.net>
parents: 32
diff changeset
7
cab8d38fe5c6 Kuntauudistus
Teemu Piippo <teemu@hecknology.net>
parents: 32
diff changeset
8 representatives = {}
cab8d38fe5c6 Kuntauudistus
Teemu Piippo <teemu@hecknology.net>
parents: 32
diff changeset
9
cab8d38fe5c6 Kuntauudistus
Teemu Piippo <teemu@hecknology.net>
parents: 32
diff changeset
10 region_data = ConfigParser()
cab8d38fe5c6 Kuntauudistus
Teemu Piippo <teemu@hecknology.net>
parents: 32
diff changeset
11 region_data.read('regions.ini')
cab8d38fe5c6 Kuntauudistus
Teemu Piippo <teemu@hecknology.net>
parents: 32
diff changeset
12
cab8d38fe5c6 Kuntauudistus
Teemu Piippo <teemu@hecknology.net>
parents: 32
diff changeset
13 for section in region_data.sections():
cab8d38fe5c6 Kuntauudistus
Teemu Piippo <teemu@hecknology.net>
parents: 32
diff changeset
14 for key, value in region_data[section].items():
cab8d38fe5c6 Kuntauudistus
Teemu Piippo <teemu@hecknology.net>
parents: 32
diff changeset
15 representatives[key] = value
2
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
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
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
18 data = file.read().split('@')
1
22c22ff63e66 Aluemuotoja
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
19
7
f3791dccfd03 Käännetty tiedostojen nimet englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 6
diff changeset
20 bus_stops = {}
2
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
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
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
28
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
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
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
32 for polygon in data[1].splitlines():
1
22c22ff63e66 Aluemuotoja
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
33 polygon = polygon.split('^')
22c22ff63e66 Aluemuotoja
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
34 coordinates = []
22c22ff63e66 Aluemuotoja
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
35 for point in polygon[3].split('~'):
22c22ff63e66 Aluemuotoja
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
36 x, y = point.split(',')
5
a65b680f1774 Paljon asioita
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
37 coordinates.append(Sijainti(float(x), float(y)))
a65b680f1774 Paljon asioita
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
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
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
41
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
42 bus_stop_districts = {}
1
22c22ff63e66 Aluemuotoja
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
43
2
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
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
Teemu Piippo <teemu@hecknology.net>
parents: 5
diff changeset
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
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
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
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
60 for district, shape in districts.items():
5
a65b680f1774 Paljon asioita
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
61 if shape.sisältää_pisteen(stop_position):
2
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
62 bus_stop_districts[stop_id] = district
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
63 break
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
64 else:
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
65 bus_stop_districts[stop_id] = None
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
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
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
69 print('%.1f%% bus stops covered.' % (covered * 100 / total), file = sys.stderr)
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 1
diff changeset
70 json.dump(bus_stop_districts, sys.stdout, indent = 2)

mercurial