include additional distance at origin and destination
This commit is contained in:
parent
ee83d56a5c
commit
28f4eaeb28
2 changed files with 33 additions and 6 deletions
|
@ -17,7 +17,7 @@ def describe_location(location, locations):
|
||||||
|
|
||||||
class Route:
|
class Route:
|
||||||
def __init__(self, router, origin, destination, path_nodes, options,
|
def __init__(self, router, origin, destination, path_nodes, options,
|
||||||
origin_addition, destination_addition):
|
origin_addition, destination_addition, origin_xyz, destination_xyz):
|
||||||
self.router = router
|
self.router = router
|
||||||
self.origin = origin
|
self.origin = origin
|
||||||
self.destination = destination
|
self.destination = destination
|
||||||
|
@ -25,6 +25,8 @@ class Route:
|
||||||
self.options = options
|
self.options = options
|
||||||
self.origin_addition = origin_addition
|
self.origin_addition = origin_addition
|
||||||
self.destination_addition = destination_addition
|
self.destination_addition = destination_addition
|
||||||
|
self.origin_xyz = origin_xyz
|
||||||
|
self.destination_xyz = destination_xyz
|
||||||
|
|
||||||
def serialize(self, locations):
|
def serialize(self, locations):
|
||||||
nodes = [[node, None] for node in self.path_nodes]
|
nodes = [[node, None] for node in self.path_nodes]
|
||||||
|
@ -34,12 +36,22 @@ class Route:
|
||||||
if self.destination_addition and any(self.destination_addition):
|
if self.destination_addition and any(self.destination_addition):
|
||||||
nodes.append(self.destination_addition)
|
nodes.append(self.destination_addition)
|
||||||
|
|
||||||
|
if self.origin_xyz is not None:
|
||||||
|
origin_distance = np.linalg.norm(self.router.nodes[nodes[0][0]].xyz - self.origin_xyz)
|
||||||
|
else:
|
||||||
|
origin_distance = 0
|
||||||
|
|
||||||
|
if self.destination_xyz is not None:
|
||||||
|
destination_distance = np.linalg.norm(self.router.nodes[nodes[-1][0]].xyz - self.destination_xyz)
|
||||||
|
else:
|
||||||
|
destination_distance = 0
|
||||||
|
|
||||||
items = deque()
|
items = deque()
|
||||||
last_node = None
|
last_node = None
|
||||||
last_item = None
|
last_item = None
|
||||||
distance = 0
|
|
||||||
duration = 0
|
|
||||||
walk_factor = self.options.walk_factor
|
walk_factor = self.options.walk_factor
|
||||||
|
distance = origin_distance
|
||||||
|
duration = origin_distance * walk_factor
|
||||||
for i, (node, edge) in enumerate(nodes):
|
for i, (node, edge) in enumerate(nodes):
|
||||||
if edge is None:
|
if edge is None:
|
||||||
edge = self.router.edges[last_node, node] if last_node else None
|
edge = self.router.edges[last_node, node] if last_node else None
|
||||||
|
@ -52,6 +64,9 @@ class Route:
|
||||||
last_item = item
|
last_item = item
|
||||||
last_node = node
|
last_node = node
|
||||||
|
|
||||||
|
distance += destination_distance
|
||||||
|
duration += destination_distance * walk_factor
|
||||||
|
|
||||||
# descriptions for waytypes
|
# descriptions for waytypes
|
||||||
next_item = None
|
next_item = None
|
||||||
for item in reversed(items):
|
for item in reversed(items):
|
||||||
|
@ -76,7 +91,7 @@ class Route:
|
||||||
next_item = item
|
next_item = item
|
||||||
|
|
||||||
# add description for last space
|
# add description for last space
|
||||||
remaining_distance = 0
|
remaining_distance = destination_distance
|
||||||
for item in reversed(items):
|
for item in reversed(items):
|
||||||
if item.descriptions:
|
if item.descriptions:
|
||||||
break
|
break
|
||||||
|
|
|
@ -157,6 +157,7 @@ class Router:
|
||||||
|
|
||||||
poi = RouterPoint(poi)
|
poi = RouterPoint(poi)
|
||||||
altitudearea = space.altitudearea_for_point(poi.geometry)
|
altitudearea = space.altitudearea_for_point(poi.geometry)
|
||||||
|
poi.altitude = altitudearea.get_altitude(poi.geometry)
|
||||||
poi_nodes = altitudearea.nodes_for_point(poi.geometry, all_nodes=nodes)
|
poi_nodes = altitudearea.nodes_for_point(poi.geometry, all_nodes=nodes)
|
||||||
poi.nodes = set(i for i in poi_nodes.keys())
|
poi.nodes = set(i for i in poi_nodes.keys())
|
||||||
poi.nodes_addition = poi_nodes
|
poi.nodes_addition = poi_nodes
|
||||||
|
@ -274,6 +275,7 @@ class Router:
|
||||||
location = RouterPoint(location)
|
location = RouterPoint(location)
|
||||||
space = self.space_for_point(location.level.pk, point, restrictions)
|
space = self.space_for_point(location.level.pk, point, restrictions)
|
||||||
altitudearea = space.altitudearea_for_point(point)
|
altitudearea = space.altitudearea_for_point(point)
|
||||||
|
location.altitude = altitudearea.get_altitude(point)
|
||||||
location_nodes = altitudearea.nodes_for_point(point, all_nodes=self.nodes)
|
location_nodes = altitudearea.nodes_for_point(point, all_nodes=self.nodes)
|
||||||
location.nodes = set(i for i in location_nodes.keys())
|
location.nodes = set(i for i in location_nodes.keys())
|
||||||
location.nodes_addition = location_nodes
|
location.nodes_addition = location_nodes
|
||||||
|
@ -397,8 +399,12 @@ class Router:
|
||||||
origin_addition = origin.nodes_addition.get(origin_node)
|
origin_addition = origin.nodes_addition.get(origin_node)
|
||||||
destination_addition = destination.nodes_addition.get(destination_node)
|
destination_addition = destination.nodes_addition.get(destination_node)
|
||||||
|
|
||||||
|
# get additional distance at origin and destination
|
||||||
|
origin_xyz = origin.xyz if isinstance(origin, RouterPoint) else None
|
||||||
|
destination_xyz = destination.xyz if isinstance(destination, RouterPoint) else None
|
||||||
|
|
||||||
return Route(self, origin, destination, path_nodes, options,
|
return Route(self, origin, destination, path_nodes, options,
|
||||||
origin_addition, destination_addition)
|
origin_addition, destination_addition, origin_xyz, destination_xyz)
|
||||||
|
|
||||||
|
|
||||||
CustomLocationDescription = namedtuple('CustomLocationDescription', ('space', 'altitude'))
|
CustomLocationDescription = namedtuple('CustomLocationDescription', ('space', 'altitude'))
|
||||||
|
@ -449,7 +455,13 @@ class RouterArea(BaseRouterProxy):
|
||||||
|
|
||||||
|
|
||||||
class RouterPoint(BaseRouterProxy):
|
class RouterPoint(BaseRouterProxy):
|
||||||
pass
|
def __init__(self, *args, **kwargs):
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
self.altitude = None
|
||||||
|
|
||||||
|
@cached_property
|
||||||
|
def xyz(self):
|
||||||
|
return np.array((self.x, self.y, self.altitude))
|
||||||
|
|
||||||
|
|
||||||
class RouterAltitudeArea:
|
class RouterAltitudeArea:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue