team-3/src/c3nav/routing/route.py

80 lines
2.5 KiB
Python
Raw Normal View History

# flake8: noqa
2016-12-19 15:11:11 +01:00
import copy
2017-11-27 15:01:58 +01:00
from collections import OrderedDict, deque
2016-12-19 15:11:11 +01:00
2016-12-17 13:24:42 +01:00
import numpy as np
2017-11-27 15:41:25 +01:00
from django.utils.functional import cached_property
2016-12-19 15:11:11 +01:00
from django.utils.translation import ugettext_lazy as _
2016-12-17 13:24:42 +01:00
2016-12-17 14:46:15 +01:00
class Route:
2017-11-27 15:01:58 +01:00
def __init__(self, router, origin, destination, distance, path_nodes):
self.router = router
self.origin = origin
self.destination = destination
self.distance = distance
self.path_nodes = path_nodes
2016-12-19 15:11:11 +01:00
2016-12-29 20:06:57 +01:00
def serialize(self):
2017-11-27 15:01:58 +01:00
items = deque()
last_node = None
last_item = None
2017-11-27 16:49:12 +01:00
distance = 0
2017-11-27 15:01:58 +01:00
for i, node in enumerate(self.path_nodes):
2017-11-27 16:49:12 +01:00
edge = self.router.edges[last_node, node] if last_node else None
item = RouteItem(self, self.router.nodes[node], edge, last_item)
if edge:
distance += edge.distance
2017-11-27 15:01:58 +01:00
items.append(item)
last_item = item
last_node = node
2016-12-29 20:06:57 +01:00
return OrderedDict((
('origin', self.origin.serialize(detailed=False)),
('destination', self.destination.serialize(detailed=False)),
2017-11-27 16:49:12 +01:00
('distance', round(distance, 2)),
2017-11-27 15:01:58 +01:00
('items', tuple(item.serialize() for item in items)),
2016-12-29 20:06:57 +01:00
))
2016-12-19 15:11:11 +01:00
2017-11-27 15:01:58 +01:00
class RouteItem:
def __init__(self, route, node, edge, last_item):
self.route = route
self.node = node
self.edge = edge
self.last_item = last_item
2016-12-17 14:46:15 +01:00
2017-11-27 15:41:25 +01:00
@cached_property
def waytype(self):
if self.edge and self.edge.waytype:
return self.route.router.waytypes[self.edge.waytype]
@cached_property
def space(self):
return self.route.router.spaces[self.node.space]
@cached_property
def level(self):
return self.route.router.levels[self.space.level_id]
2016-12-29 20:06:57 +01:00
def serialize(self):
2017-11-27 15:41:25 +01:00
result = OrderedDict((
2017-11-27 15:01:58 +01:00
('id', self.node.pk),
2017-11-27 16:42:35 +01:00
('coordinates', (self.node.x, self.node.y, self.node.altitude)),
2017-11-27 15:01:58 +01:00
('waytype', (self.route.router.waytypes[self.edge.waytype].serialize(detailed=False)
if self.edge and self.edge.waytype else None)),
2016-12-29 20:06:57 +01:00
))
2017-11-27 15:41:25 +01:00
if self.waytype:
result['waytype'] = self.waytype.serialize(detailed=False)
if not self.last_item or self.space.pk != self.last_item.space.pk:
result['space'] = self.space.serialize(detailed=False, describe_only=True)
2017-11-27 15:41:25 +01:00
if not self.last_item or self.level.pk != self.last_item.level.pk:
result['level'] = self.level.serialize(detailed=False, describe_only=True)
2017-11-27 15:41:25 +01:00
return result
2016-12-29 20:06:57 +01:00
2016-12-17 13:24:42 +01:00
class NoRoute:
distance = np.inf