From 31c4feca73e0dcd53c23d66e5c52cf25c10c7718 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Sat, 5 Aug 2017 14:50:07 +0200 Subject: [PATCH] improve altitude area performance again using lookup table --- src/c3nav/mapdata/models/geometry/level.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/c3nav/mapdata/models/geometry/level.py b/src/c3nav/mapdata/models/geometry/level.py index c8eea86e..17db277a 100644 --- a/src/c3nav/mapdata/models/geometry/level.py +++ b/src/c3nav/mapdata/models/geometry/level.py @@ -116,6 +116,8 @@ class AltitudeArea(LevelGeometryMixin, models.Model): areas = assert_multipolygon(cascaded_union(areas+list(door.geometry for door in level.doors.all()))) areas = [AltitudeArea(geometry=area, level=level) for area in areas] + space_areas = {space.pk: [] for space in level.spaces.all()} + # assign spaces to areas for area in areas: area.spaces = set() @@ -123,10 +125,11 @@ class AltitudeArea(LevelGeometryMixin, models.Model): for space in level.spaces.all(): if area.geometry.intersects(space.geometry): area.spaces.add(space.pk) + space_areas[space.pk].append(area) # divide areas using stairs for stair in stairs: - for i, area in enumerate(tuple(areas)): + for area in space_areas[stair.space]: if stair.space not in area.spaces or not stair.intersects(area.geometry): continue @@ -136,14 +139,19 @@ class AltitudeArea(LevelGeometryMixin, models.Model): area.geometry = divided[0] if len(divided) == 2: new_area = AltitudeArea(geometry=divided[1], level=level) - new_area.spaces = area.spaces + new_area.spaces = [] new_area.connected_to = [area] area.connected_to.append(new_area) areas.append(new_area) for subarea in (area, new_area): if len(subarea.spaces) > 1: - subarea.spaces = set(space for space in subarea.spaces + spaces_before = subarea.spaces + subarea.spaces = set(space for space in area.spaces if spaces[space].geometry.intersects(subarea.geometry)) + for space in spaces_before-subarea.spaces: + space_areas[space].remove(subarea) + for space in subarea.spaces-spaces_before: + space_areas[space].append(subarea) break