move all other code to AltitudeArea.points, no multi-point implementation yet
This commit is contained in:
parent
27ba0c0eaa
commit
2bc044e91f
4 changed files with 25 additions and 30 deletions
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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():
|
||||
|
|
|
@ -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 = {}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue