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
|
import json
import algorithms
import store
from lib import run_server, get, post, read_html
nodes = None
@get('/')
def index():
global nodes
nodes = store.extract_osm_nodes("university.osm")
return read_html('templates/index.html')
@get('/show-area')
def show_area():
rect = dict()
for (k, node) in enumerate(store.select_nodes_in_rectangle(nodes, 58.3984, 58.3990, 15.5733, 15.576)):
rect[node.id] = node.coord_tuple()
return json.dumps(rect)
def color_edges(nodes, colorer):
""" Color all edges in a list of nodes with a coloring function. """
return [{"path": [[node0.lat, node0.lng],
[node1.lat, node1.lng]],
"color": colorer(colorer_t)}
for node0, node1, colorer_t in nodes]
@post('/shortest-path')
def shortest_path(body):
body = json.loads(body)
source_id = algorithms.get_closest_node_id(nodes, store.Node(-1, body['lat1'], body['lng1']))
target_id = algorithms.get_closest_node_id(nodes, store.Node(-1, body['lat2'], body['lng2']))
path, total_iters, edges = algorithms.find_shortest_path(nodes, source_id, target_id)
def shortest_path_color(_):
""" Color edge as the shortest path. """
return "#2674CA"
def edge_color_iter(iters):
""" Color edge depending on how many iterations were taken to get there. """
return algorithms.lerp_color("#ff0000", "#00cc00", iters/total_iters)
shortest_path = color_edges([(nodes[path[i+0]], nodes[path[i+1]], None)
for i in range(len(path)-1)],
shortest_path_color)
all_edges = color_edges([(nodes[node0], nodes[node1], iterations)
for node0, node1, iterations in edges.values()],
edge_color_iter)
return json.dumps({"edges": all_edges + shortest_path})
run_server()
|