router: index pois and areas
This commit is contained in:
parent
64f5d34b66
commit
f02a90caf6
1 changed files with 49 additions and 17 deletions
|
@ -97,7 +97,11 @@ class Router:
|
||||||
node.i = i
|
node.i = i
|
||||||
nodes.extend(space_nodes)
|
nodes.extend(space_nodes)
|
||||||
|
|
||||||
for area in space.areas.all():
|
space_obj = space
|
||||||
|
space = RouterSpace(space)
|
||||||
|
space.nodes = set(node.i for node in space_nodes)
|
||||||
|
|
||||||
|
for area in space_obj.areas.all():
|
||||||
for group in area.groups.all():
|
for group in area.groups.all():
|
||||||
groups.setdefault(group.pk, {}).setdefault('areas', set()).add(area.pk)
|
groups.setdefault(group.pk, {}).setdefault('areas', set()).add(area.pk)
|
||||||
area._prefetched_objects_cache = {}
|
area._prefetched_objects_cache = {}
|
||||||
|
@ -108,10 +112,23 @@ class Router:
|
||||||
for node in area_nodes:
|
for node in area_nodes:
|
||||||
node.areas.add(area.pk)
|
node.areas.add(area.pk)
|
||||||
areas[area.pk] = area
|
areas[area.pk] = area
|
||||||
|
space.areas.add(area.pk)
|
||||||
|
|
||||||
space._prefetched_objects_cache = {}
|
for poi in space_obj.pois.all():
|
||||||
space = RouterSpace(space)
|
for group in poi.groups.all():
|
||||||
space.nodes = set(node.i for node in space_nodes)
|
groups.setdefault(group.pk, {}).setdefault('pois', set()).add(poi.pk)
|
||||||
|
poi._prefetched_objects_cache = {}
|
||||||
|
|
||||||
|
poi = RouterPoint(poi)
|
||||||
|
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 = set(i for i in poi_nodes.keys())
|
||||||
|
poi.nodes_addition = poi_nodes
|
||||||
|
pois[poi.pk] = poi
|
||||||
|
space.pois.add(poi.pk)
|
||||||
|
|
||||||
|
space_obj._prefetched_objects_cache = {}
|
||||||
|
|
||||||
for area in level.altitudeareas.all():
|
for area in level.altitudeareas.all():
|
||||||
if not space.geometry_prep.intersects(area.geometry):
|
if not space.geometry_prep.intersects(area.geometry):
|
||||||
|
@ -150,19 +167,6 @@ class Router:
|
||||||
RouterEdge(fallback_node, nearest_node, 0)
|
RouterEdge(fallback_node, nearest_node, 0)
|
||||||
)
|
)
|
||||||
|
|
||||||
for poi in space.pois.all():
|
|
||||||
for group in poi.groups.all():
|
|
||||||
groups.setdefault(group.pk, {}).setdefault('pois', set()).add(poi.pk)
|
|
||||||
poi._prefetched_objects_cache = {}
|
|
||||||
|
|
||||||
poi = RouterPoint(poi)
|
|
||||||
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 = set(i for i in poi_nodes.keys())
|
|
||||||
poi.nodes_addition = poi_nodes
|
|
||||||
pois[poi.pk] = poi
|
|
||||||
|
|
||||||
space.src.geometry = accessible_geom
|
space.src.geometry = accessible_geom
|
||||||
|
|
||||||
spaces[space.pk] = space
|
spaces[space.pk] = space
|
||||||
|
@ -448,6 +452,8 @@ class RouterLevel(BaseRouterProxy):
|
||||||
class RouterSpace(BaseRouterProxy):
|
class RouterSpace(BaseRouterProxy):
|
||||||
def __init__(self, space, altitudeareas=None):
|
def __init__(self, space, altitudeareas=None):
|
||||||
super().__init__(space)
|
super().__init__(space)
|
||||||
|
self.areas = set()
|
||||||
|
self.pois = set()
|
||||||
self.altitudeareas = altitudeareas if altitudeareas else []
|
self.altitudeareas = altitudeareas if altitudeareas else []
|
||||||
self.leave_descriptions = {}
|
self.leave_descriptions = {}
|
||||||
self.cross_descriptions = {}
|
self.cross_descriptions = {}
|
||||||
|
@ -459,6 +465,32 @@ class RouterSpace(BaseRouterProxy):
|
||||||
return area
|
return area
|
||||||
return min(self.altitudeareas, key=lambda area: area.geometry.distance(point))
|
return min(self.altitudeareas, key=lambda area: area.geometry.distance(point))
|
||||||
|
|
||||||
|
def areas_for_point(self, areas, point, restrictions=None):
|
||||||
|
point = Point(point.x, point.y)
|
||||||
|
areas = {pk: area for pk, area in areas.items()
|
||||||
|
if pk in self.areas and area.can_describe and area.access_restriction_id not in restrictions}
|
||||||
|
|
||||||
|
contained = tuple(area for area in areas.values() if area.geometry_prep.contains(point))
|
||||||
|
if contained:
|
||||||
|
return tuple((area, True) for area in sorted(contained, key=lambda area: area.geometry.area))
|
||||||
|
|
||||||
|
near = ((area, area.geometry.distance(point)) for area in areas.values())
|
||||||
|
near = tuple((area, distance) for area, distance in near if distance < 5)
|
||||||
|
if not near:
|
||||||
|
return ()
|
||||||
|
return ((min(near, key=operator.itemgetter(1))[0], False), )
|
||||||
|
|
||||||
|
def poi_for_point(self, pois, point, restrictions=None):
|
||||||
|
point = Point(point.x, point.y)
|
||||||
|
pois = {pk: poi for pk, poi in pois.items()
|
||||||
|
if pk in self.pois and poi.can_describe and poi.access_restriction_id not in restrictions}
|
||||||
|
|
||||||
|
near = ((poi, poi.geometry.distance(point)) for poi in pois.values())
|
||||||
|
near = tuple((poi, distance) for poi, distance in near if distance < 5)
|
||||||
|
if not near:
|
||||||
|
return None
|
||||||
|
return min(near, key=operator.itemgetter(1))[0]
|
||||||
|
|
||||||
|
|
||||||
class RouterArea(BaseRouterProxy):
|
class RouterArea(BaseRouterProxy):
|
||||||
pass
|
pass
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue