diff --git a/src/c3nav/mapdata/models/geometry/level.py b/src/c3nav/mapdata/models/geometry/level.py index 19213e96..95c7aa42 100644 --- a/src/c3nav/mapdata/models/geometry/level.py +++ b/src/c3nav/mapdata/models/geometry/level.py @@ -479,13 +479,17 @@ class AltitudeArea(LevelGeometryMixin, models.Model): ramp.altitude = ramp.connected_to[0][0].altitude continue + # todo: implement multiple points + if len(ramp.connected_to) > 2: ramp.connected_to = sorted(ramp.connected_to, key=lambda item: item[1].area)[-2:] - ramp.point1 = ramp.connected_to[0][1].centroid - ramp.point2 = ramp.connected_to[1][1].centroid - ramp.altitude = ramp.connected_to[0][0].altitude - ramp.altitude2 = ramp.connected_to[1][0].altitude + ramp.points = [ + AltitudeAreaPoint(coordinates=ramp.connected_to[0][1].centroid.coords, + altitude=float(ramp.connected_to[0][0].altitude)), + AltitudeAreaPoint(coordinates=ramp.connected_to[1][1].centroid.coords, + altitude=float(ramp.connected_to[1][0].altitude)), + ] ramp.tmpid = len(areas) areas.append(ramp) @@ -582,13 +586,15 @@ class AltitudeArea(LevelGeometryMixin, models.Model): area = touches[0].obj elif touches: min_touches = sum((t.value for t in touches), 0)/4 - area = max(touches, key=lambda item: (item.value > min_touches, - item.obj.altitude2 is not None, - item.obj.altitude, - item.value)).obj + area = max(touches, key=lambda item: ( + item.value > min_touches, + item.obj.points is not None, + item.obj.altitude or max(p.altitude for p in item.obj.points), + item.value + )).obj else: area = min(our_areas, - key=lambda a: a.orig_geometry.distance(center)-(0 if a.altitude2 is None else 0.6)) + key=lambda a: a.orig_geometry.distance(center)-(0 if a.points is None else 0.6)) area.polygons_to_add.append(polygon) for i_area, area in enumerate(our_areas): @@ -617,17 +623,16 @@ class AltitudeArea(LevelGeometryMixin, models.Model): for candidate in all_candidates: new_area = None - if candidate.altitude2 is None: + if candidate.points is None: for tmpid in level_areas.get(candidate.level, set()): area = areas[tmpid] - if area.altitude2 is None and area.altitude == candidate.altitude: + if area.points is None and area.altitude == candidate.altitude: new_area = area break else: potential_areas = [areas[tmpid] for tmpid in level_areas.get(candidate.level, set())] potential_areas = [area for area in potential_areas - if (candidate.altitude, candidate.altitude2) in ((area.altitude, area.altitude2), - (area.altitude2, area.altitude))] + if set(p.altitude for p in candidate.points) == set(p.altitude for p in area.points)] potential_areas = [(area, area.geometry.intersection(unwrap_geom(candidate.geometry)).area) for area in potential_areas if candidate.geometry_prep.intersects(unwrap_geom(area.geometry))] @@ -644,9 +649,7 @@ class AltitudeArea(LevelGeometryMixin, models.Model): candidate.geometry = new_area.geometry candidate.altitude = new_area.altitude - candidate.altitude2 = new_area.altitude2 - candidate.point1 = new_area.point1 - candidate.point2 = new_area.point2 + candidate.points = new_area.points candidate.save() areas_to_save.discard(new_area.tmpid) level_areas[new_area.level].discard(new_area.tmpid) diff --git a/src/c3nav/mapdata/render/geometry/altitudearea.py b/src/c3nav/mapdata/render/geometry/altitudearea.py index f7ffc65a..fe50d266 100644 --- a/src/c3nav/mapdata/render/geometry/altitudearea.py +++ b/src/c3nav/mapdata/render/geometry/altitudearea.py @@ -12,15 +12,11 @@ class AltitudeAreaGeometries: if altitudearea is not None: self.geometry = altitudearea.geometry self.altitude = int(altitudearea.altitude * 1000) - self.altitude2 = None if altitudearea.altitude2 is None else int(altitudearea.altitude2 * 1000) - self.point1 = altitudearea.point1 - self.point2 = altitudearea.point2 + self.points = altitudearea.points else: self.geometry = None self.altitude = None - self.altitude2 = None - self.point1 = None - self.point2 = None + self.points = None self.base = None self.bottom = None self.colors = colors diff --git a/src/c3nav/mapdata/render/renderdata.py b/src/c3nav/mapdata/render/renderdata.py index 930c726c..f2818002 100644 --- a/src/c3nav/mapdata/render/renderdata.py +++ b/src/c3nav/mapdata/render/renderdata.py @@ -227,9 +227,7 @@ class LevelRenderData: new_altitudearea = AltitudeAreaGeometries() new_altitudearea.geometry = new_geometry new_altitudearea.altitude = altitudearea.altitude - new_altitudearea.altitude2 = altitudearea.altitude2 - new_altitudearea.point1 = altitudearea.point1 - new_altitudearea.point2 = altitudearea.point2 + new_altitudearea.points = altitudearea.points new_colors = {} for color, areas in altitudearea.colors.items(): diff --git a/src/c3nav/routing/router.py b/src/c3nav/routing/router.py index 2ad56e3f..d61b2f4b 100644 --- a/src/c3nav/routing/router.py +++ b/src/c3nav/routing/router.py @@ -135,7 +135,7 @@ class Router: if area_clear_geom.is_empty: continue area = RouterAltitudeArea(subgeom, area_clear_geom, - area.altitude, area.altitude2, area.point1, area.point2) + area.altitude, area.points) area_nodes = tuple(node for node in space_nodes if area.geometry_prep.intersects(node.point)) area.nodes = set(node.i for node in area_nodes) for node in area_nodes: @@ -625,13 +625,11 @@ class RouterPoint(BaseRouterProxy): class RouterAltitudeArea: - def __init__(self, geometry, clear_geometry, altitude, altitude2, point1, point2): + def __init__(self, geometry, clear_geometry, altitude, points): self.geometry = geometry self.clear_geometry = clear_geometry self.altitude = altitude - self.altitude2 = altitude2 - self.point1 = point1 - self.point2 = point2 + self.points = points self.nodes = frozenset() self.fallback_nodes = {}