compute-regions.py

changeset 7
f3791dccfd03
parent 6
88cfb916c852
child 27
f89504285945
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/compute-regions.py	Sat Jun 10 16:45:41 2017 +0300
@@ -0,0 +1,59 @@
+#!/usr/bin/env python3
+import sys, json
+from misc import *
+from geometry import *
+
+with open('regions.gmp') as file:
+	data = file.read().split('@')
+
+with open('region-representatives.json') as file:
+	representatives = json.load(file)
+
+bus_stops = {}
+
+with open('gtfs/stops.txt') as file:
+	for rivi in lue_csv(file):
+		sijainti = Sijainti(float(rivi['stop_lat']), float(rivi['stop_lon']))
+		tunniste = rivi['stop_id']
+		bus_stops[tunniste] = sijainti
+
+district_shapes = []
+for polygon in data[1].splitlines():
+	polygon = polygon.split('^')
+	coordinates = []
+	for point in polygon[3].split('~'):
+		x, y = point.split(',')
+		coordinates.append(Sijainti(float(x), float(y)))
+	district_shapes.append(Monikulmio(*coordinates))
+
+districts = {}
+bus_stop_districts = {}
+
+for name, stop_id in representatives.items():
+	if stop_id is None:
+		continue
+	if stop_id not in bus_stops:
+		print('Representative %r for region %r not found in schedule' % (stop_id, name), file = sys.stderr)
+	else:
+		for district_shape in district_shapes:
+			if district_shape.sisältää_pisteen(bus_stops[stop_id]):
+				assert name not in districts
+				districts[name] = district_shape
+				district_shapes.remove(district_shape)
+				bus_stop_districts[stop_id] = name
+				break
+		else:
+			print('Cannot find a shape for %r' % name, file = sys.stderr)
+
+for stop_id, stop_position in bus_stops.items():
+	for district, shape in districts.items():
+		if shape.sisältää_pisteen(stop_position):
+			bus_stop_districts[stop_id] = district
+			break
+	else:
+		bus_stop_districts[stop_id] = None
+
+covered = sum(int(bool(k)) for k in bus_stop_districts.values())
+total = len(bus_stops)
+print('%.1f%% bus stops covered.' % (covered * 100 / total), file = sys.stderr)
+json.dump(bus_stop_districts, sys.stdout, indent = 2)

mercurial