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
|
ramp.altitude = ramp.connected_to[0][0].altitude
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
# todo: implement multiple points
|
||||||
|
|
||||||
if len(ramp.connected_to) > 2:
|
if len(ramp.connected_to) > 2:
|
||||||
ramp.connected_to = sorted(ramp.connected_to, key=lambda item: item[1].area)[-2:]
|
ramp.connected_to = sorted(ramp.connected_to, key=lambda item: item[1].area)[-2:]
|
||||||
|
|
||||||
ramp.point1 = ramp.connected_to[0][1].centroid
|
ramp.points = [
|
||||||
ramp.point2 = ramp.connected_to[1][1].centroid
|
AltitudeAreaPoint(coordinates=ramp.connected_to[0][1].centroid.coords,
|
||||||
ramp.altitude = ramp.connected_to[0][0].altitude
|
altitude=float(ramp.connected_to[0][0].altitude)),
|
||||||
ramp.altitude2 = ramp.connected_to[1][0].altitude
|
AltitudeAreaPoint(coordinates=ramp.connected_to[1][1].centroid.coords,
|
||||||
|
altitude=float(ramp.connected_to[1][0].altitude)),
|
||||||
|
]
|
||||||
|
|
||||||
ramp.tmpid = len(areas)
|
ramp.tmpid = len(areas)
|
||||||
areas.append(ramp)
|
areas.append(ramp)
|
||||||
|
@ -582,13 +586,15 @@ class AltitudeArea(LevelGeometryMixin, models.Model):
|
||||||
area = touches[0].obj
|
area = touches[0].obj
|
||||||
elif touches:
|
elif touches:
|
||||||
min_touches = sum((t.value for t in touches), 0)/4
|
min_touches = sum((t.value for t in touches), 0)/4
|
||||||
area = max(touches, key=lambda item: (item.value > min_touches,
|
area = max(touches, key=lambda item: (
|
||||||
item.obj.altitude2 is not None,
|
item.value > min_touches,
|
||||||
item.obj.altitude,
|
item.obj.points is not None,
|
||||||
item.value)).obj
|
item.obj.altitude or max(p.altitude for p in item.obj.points),
|
||||||
|
item.value
|
||||||
|
)).obj
|
||||||
else:
|
else:
|
||||||
area = min(our_areas,
|
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)
|
area.polygons_to_add.append(polygon)
|
||||||
|
|
||||||
for i_area, area in enumerate(our_areas):
|
for i_area, area in enumerate(our_areas):
|
||||||
|
@ -617,17 +623,16 @@ class AltitudeArea(LevelGeometryMixin, models.Model):
|
||||||
for candidate in all_candidates:
|
for candidate in all_candidates:
|
||||||
new_area = None
|
new_area = None
|
||||||
|
|
||||||
if candidate.altitude2 is None:
|
if candidate.points is None:
|
||||||
for tmpid in level_areas.get(candidate.level, set()):
|
for tmpid in level_areas.get(candidate.level, set()):
|
||||||
area = areas[tmpid]
|
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
|
new_area = area
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
potential_areas = [areas[tmpid] for tmpid in level_areas.get(candidate.level, set())]
|
potential_areas = [areas[tmpid] for tmpid in level_areas.get(candidate.level, set())]
|
||||||
potential_areas = [area for area in potential_areas
|
potential_areas = [area for area in potential_areas
|
||||||
if (candidate.altitude, candidate.altitude2) in ((area.altitude, area.altitude2),
|
if set(p.altitude for p in candidate.points) == set(p.altitude for p in area.points)]
|
||||||
(area.altitude2, area.altitude))]
|
|
||||||
potential_areas = [(area, area.geometry.intersection(unwrap_geom(candidate.geometry)).area)
|
potential_areas = [(area, area.geometry.intersection(unwrap_geom(candidate.geometry)).area)
|
||||||
for area in potential_areas
|
for area in potential_areas
|
||||||
if candidate.geometry_prep.intersects(unwrap_geom(area.geometry))]
|
if candidate.geometry_prep.intersects(unwrap_geom(area.geometry))]
|
||||||
|
@ -644,9 +649,7 @@ class AltitudeArea(LevelGeometryMixin, models.Model):
|
||||||
|
|
||||||
candidate.geometry = new_area.geometry
|
candidate.geometry = new_area.geometry
|
||||||
candidate.altitude = new_area.altitude
|
candidate.altitude = new_area.altitude
|
||||||
candidate.altitude2 = new_area.altitude2
|
candidate.points = new_area.points
|
||||||
candidate.point1 = new_area.point1
|
|
||||||
candidate.point2 = new_area.point2
|
|
||||||
candidate.save()
|
candidate.save()
|
||||||
areas_to_save.discard(new_area.tmpid)
|
areas_to_save.discard(new_area.tmpid)
|
||||||
level_areas[new_area.level].discard(new_area.tmpid)
|
level_areas[new_area.level].discard(new_area.tmpid)
|
||||||
|
|
|
@ -12,15 +12,11 @@ class AltitudeAreaGeometries:
|
||||||
if altitudearea is not None:
|
if altitudearea is not None:
|
||||||
self.geometry = altitudearea.geometry
|
self.geometry = altitudearea.geometry
|
||||||
self.altitude = int(altitudearea.altitude * 1000)
|
self.altitude = int(altitudearea.altitude * 1000)
|
||||||
self.altitude2 = None if altitudearea.altitude2 is None else int(altitudearea.altitude2 * 1000)
|
self.points = altitudearea.points
|
||||||
self.point1 = altitudearea.point1
|
|
||||||
self.point2 = altitudearea.point2
|
|
||||||
else:
|
else:
|
||||||
self.geometry = None
|
self.geometry = None
|
||||||
self.altitude = None
|
self.altitude = None
|
||||||
self.altitude2 = None
|
self.points = None
|
||||||
self.point1 = None
|
|
||||||
self.point2 = None
|
|
||||||
self.base = None
|
self.base = None
|
||||||
self.bottom = None
|
self.bottom = None
|
||||||
self.colors = colors
|
self.colors = colors
|
||||||
|
|
|
@ -227,9 +227,7 @@ class LevelRenderData:
|
||||||
new_altitudearea = AltitudeAreaGeometries()
|
new_altitudearea = AltitudeAreaGeometries()
|
||||||
new_altitudearea.geometry = new_geometry
|
new_altitudearea.geometry = new_geometry
|
||||||
new_altitudearea.altitude = altitudearea.altitude
|
new_altitudearea.altitude = altitudearea.altitude
|
||||||
new_altitudearea.altitude2 = altitudearea.altitude2
|
new_altitudearea.points = altitudearea.points
|
||||||
new_altitudearea.point1 = altitudearea.point1
|
|
||||||
new_altitudearea.point2 = altitudearea.point2
|
|
||||||
|
|
||||||
new_colors = {}
|
new_colors = {}
|
||||||
for color, areas in altitudearea.colors.items():
|
for color, areas in altitudearea.colors.items():
|
||||||
|
|
|
@ -135,7 +135,7 @@ class Router:
|
||||||
if area_clear_geom.is_empty:
|
if area_clear_geom.is_empty:
|
||||||
continue
|
continue
|
||||||
area = RouterAltitudeArea(subgeom, area_clear_geom,
|
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 = tuple(node for node in space_nodes if area.geometry_prep.intersects(node.point))
|
||||||
area.nodes = set(node.i for node in area_nodes)
|
area.nodes = set(node.i for node in area_nodes)
|
||||||
for node in area_nodes:
|
for node in area_nodes:
|
||||||
|
@ -625,13 +625,11 @@ class RouterPoint(BaseRouterProxy):
|
||||||
|
|
||||||
|
|
||||||
class RouterAltitudeArea:
|
class RouterAltitudeArea:
|
||||||
def __init__(self, geometry, clear_geometry, altitude, altitude2, point1, point2):
|
def __init__(self, geometry, clear_geometry, altitude, points):
|
||||||
self.geometry = geometry
|
self.geometry = geometry
|
||||||
self.clear_geometry = clear_geometry
|
self.clear_geometry = clear_geometry
|
||||||
self.altitude = altitude
|
self.altitude = altitude
|
||||||
self.altitude2 = altitude2
|
self.points = points
|
||||||
self.point1 = point1
|
|
||||||
self.point2 = point2
|
|
||||||
self.nodes = frozenset()
|
self.nodes = frozenset()
|
||||||
self.fallback_nodes = {}
|
self.fallback_nodes = {}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue