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], iters) for node0, node1, iters in edges.values()], edge_color_iter) return json.dumps({"edges": all_edges + shortest_path}) run_server()