summaryrefslogtreecommitdiffstats
path: root/server.py
blob: 1f4a93d1dfab4d5cad2a8e71dc9b254b02f74202 (plain) (blame)
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()