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
|
||||
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():
|
||||
groups.setdefault(group.pk, {}).setdefault('areas', set()).add(area.pk)
|
||||
area._prefetched_objects_cache = {}
|
||||
|
@ -108,10 +112,23 @@ class Router:
|
|||
for node in area_nodes:
|
||||
node.areas.add(area.pk)
|
||||
areas[area.pk] = area
|
||||
space.areas.add(area.pk)
|
||||
|
||||
space._prefetched_objects_cache = {}
|
||||
space = RouterSpace(space)
|
||||
space.nodes = set(node.i for node in space_nodes)
|
||||
for poi in space_obj.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.pois.add(poi.pk)
|
||||
|
||||
space_obj._prefetched_objects_cache = {}
|
||||
|
||||
for area in level.altitudeareas.all():
|
||||
if not space.geometry_prep.intersects(area.geometry):
|
||||
|
@ -150,19 +167,6 @@ class Router:
|
|||
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
|
||||
|
||||
spaces[space.pk] = space
|
||||
|
@ -448,6 +452,8 @@ class RouterLevel(BaseRouterProxy):
|
|||
class RouterSpace(BaseRouterProxy):
|
||||
def __init__(self, space, altitudeareas=None):
|
||||
super().__init__(space)
|
||||
self.areas = set()
|
||||
self.pois = set()
|
||||
self.altitudeareas = altitudeareas if altitudeareas else []
|
||||
self.leave_descriptions = {}
|
||||
self.cross_descriptions = {}
|
||||
|
@ -459,6 +465,32 @@ class RouterSpace(BaseRouterProxy):
|
|||
return area
|
||||
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):
|
||||
pass
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue