-
Notifications
You must be signed in to change notification settings - Fork 0
/
createroute.py
70 lines (55 loc) · 2.25 KB
/
createroute.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import csv
import collections
import urllib.request
import pandas as pd
import geopandas
import json
import time
from shapely.geometry import Point
from shapely.geometry import LineString
API_KEY = ''
STOP_DATA = '../data/aberdeenshire.csv'
OUTPUT_DATA = '../data/aberdeenshire_routes.geojson'
def run():
"""Runs the main script"""
routes = {}
geodata = []
with open(STOP_DATA, 'rt') as mobile_csv:
reader = csv.reader(mobile_csv, delimiter=',', quotechar='"')
next(reader, None) # skip the headers
# make sure the rows are sorted by mobile, route, and arrival time
sorted_rows = sorted(reader, key=lambda row: (row[1], row[2], row[10]))
for (idx, row) in enumerate(sorted_rows):
mobile = row[1]
route = row[2]
longitude = float(row[7])
latitude = float(row[8])
# Add to object
if route not in routes:
# Create an ordered dictionary so we keep track of stop order
routes[route] = collections.OrderedDict()
routes[route][idx] = {
'longitude': str(longitude),
'latitude': str(latitude)
}
for route in routes:
# construct the URL from the stops
url = 'https://api.openrouteservice.org/directions?format=geojson&api_key=' + \
API_KEY + '&profile=driving-car&preference=fastest&coordinates='
for (idx, trip) in enumerate(routes[route]):
url = url + routes[route][trip]['longitude'] + \
',' + routes[route][trip]['latitude'] + '|'
# only continue if there is more than one stop
if len(routes[route]) > 1:
with urllib.request.urlopen(url[:-1]) as response:
res_data = json.load(response)
print(res_data['features'][0]['geometry']['coordinates'])
line = LineString(res_data['features'][0]['geometry']['coordinates'])
geodata.append({'route': route, 'geo': line})
time.sleep(5)
frame = pd.DataFrame(data=geodata)
geodf = geopandas.GeoDataFrame(
frame, crs={'init': 'epsg:4326'}, geometry='geo')
# output route as geojson format file
geodf.to_file(OUTPUT_DATA, driver="GeoJSON")
run()