use unary_union instead of the old cascaded_union
This commit is contained in:
parent
8bc5015caf
commit
b6cb29b907
1 changed files with 18 additions and 18 deletions
|
@ -11,7 +11,7 @@ from scipy.sparse.csgraph._shortest_path import dijkstra
|
||||||
from shapely import prepared
|
from shapely import prepared
|
||||||
from shapely.affinity import scale
|
from shapely.affinity import scale
|
||||||
from shapely.geometry import JOIN_STYLE, LineString
|
from shapely.geometry import JOIN_STYLE, LineString
|
||||||
from shapely.ops import cascaded_union
|
from shapely.ops import unary_union
|
||||||
|
|
||||||
from c3nav.mapdata.cache import changed_geometries
|
from c3nav.mapdata.cache import changed_geometries
|
||||||
from c3nav.mapdata.fields import GeometryField
|
from c3nav.mapdata.fields import GeometryField
|
||||||
|
@ -152,7 +152,7 @@ class AltitudeArea(LevelGeometryMixin, models.Model):
|
||||||
stairs = []
|
stairs = []
|
||||||
|
|
||||||
# collect all accessible areas on this level
|
# collect all accessible areas on this level
|
||||||
buildings_geom = cascaded_union(tuple(building.geometry for building in level.buildings.all()))
|
buildings_geom = unary_union(tuple(building.geometry for building in level.buildings.all()))
|
||||||
for space in level.spaces.all():
|
for space in level.spaces.all():
|
||||||
space.orig_geometry = space.geometry
|
space.orig_geometry = space.geometry
|
||||||
if space.outside:
|
if space.outside:
|
||||||
|
@ -160,10 +160,10 @@ class AltitudeArea(LevelGeometryMixin, models.Model):
|
||||||
spaces[space.pk] = space
|
spaces[space.pk] = space
|
||||||
area = space.geometry
|
area = space.geometry
|
||||||
buffered = space.geometry.buffer(0.0001)
|
buffered = space.geometry.buffer(0.0001)
|
||||||
remove = cascaded_union(tuple(c.geometry for c in space.columns.all()) +
|
remove = unary_union(tuple(c.geometry for c in space.columns.all()) +
|
||||||
tuple(o.geometry for o in space.obstacles.all()) +
|
tuple(o.geometry for o in space.obstacles.all()) +
|
||||||
tuple(o.buffered_geometry for o in space.lineobstacles.all()) +
|
tuple(o.buffered_geometry for o in space.lineobstacles.all()) +
|
||||||
tuple(h.geometry for h in space.holes.all()))
|
tuple(h.geometry for h in space.holes.all()))
|
||||||
areas.extend(assert_multipolygon(space.geometry.difference(remove)))
|
areas.extend(assert_multipolygon(space.geometry.difference(remove)))
|
||||||
for stair in space.stairs.all():
|
for stair in space.stairs.all():
|
||||||
substairs = tuple(assert_multilinestring(stair.geometry.intersection(buffered).difference(remove)))
|
substairs = tuple(assert_multilinestring(stair.geometry.intersection(buffered).difference(remove)))
|
||||||
|
@ -171,7 +171,7 @@ class AltitudeArea(LevelGeometryMixin, models.Model):
|
||||||
substair.space = space.pk
|
substair.space = space.pk
|
||||||
stairs.extend(substairs)
|
stairs.extend(substairs)
|
||||||
|
|
||||||
areas = assert_multipolygon(cascaded_union(areas+list(door.geometry for door in level.doors.all())))
|
areas = assert_multipolygon(unary_union(areas+list(door.geometry for door in level.doors.all())))
|
||||||
areas = [AltitudeArea(geometry=area, level=level) for area in areas]
|
areas = [AltitudeArea(geometry=area, level=level) for area in areas]
|
||||||
|
|
||||||
space_areas.update({space.pk: [] for space in level.spaces.all()})
|
space_areas.update({space.pk: [] for space in level.spaces.all()})
|
||||||
|
@ -372,7 +372,7 @@ class AltitudeArea(LevelGeometryMixin, models.Model):
|
||||||
altitude_areas.setdefault(area.altitude, []).append(area.geometry)
|
altitude_areas.setdefault(area.altitude, []).append(area.geometry)
|
||||||
|
|
||||||
for altitude in altitude_areas.keys():
|
for altitude in altitude_areas.keys():
|
||||||
altitude_areas[altitude] = cascaded_union(altitude_areas[altitude])
|
altitude_areas[altitude] = unary_union(altitude_areas[altitude])
|
||||||
for tmpid in contained_areas_without_altitude:
|
for tmpid in contained_areas_without_altitude:
|
||||||
area = areas[tmpid]
|
area = areas[tmpid]
|
||||||
area.altitude = min(altitude_areas.items(), key=lambda aa: aa[1].distance(area.geometry))[0]
|
area.altitude = min(altitude_areas.items(), key=lambda aa: aa[1].distance(area.geometry))[0]
|
||||||
|
@ -394,25 +394,25 @@ class AltitudeArea(LevelGeometryMixin, models.Model):
|
||||||
for space in level.spaces.all():
|
for space in level.spaces.all():
|
||||||
space.geometry = space.orig_geometry
|
space.geometry = space.orig_geometry
|
||||||
|
|
||||||
buildings_geom = cascaded_union(tuple(b.geometry for b in level.buildings.all()))
|
buildings_geom = unary_union(tuple(b.geometry for b in level.buildings.all()))
|
||||||
doors_geom = cascaded_union(tuple(d.geometry for d in level.doors.all()))
|
doors_geom = unary_union(tuple(d.geometry for d in level.doors.all()))
|
||||||
space_geom = cascaded_union(tuple((s.geometry if not s.outside else s.geometry.difference(buildings_geom))
|
space_geom = unary_union(tuple((s.geometry if not s.outside else s.geometry.difference(buildings_geom))
|
||||||
for s in level.spaces.all()))
|
for s in level.spaces.all()))
|
||||||
accessible_area = cascaded_union((doors_geom, space_geom))
|
accessible_area = unary_union((doors_geom, space_geom))
|
||||||
for space in level.spaces.all():
|
for space in level.spaces.all():
|
||||||
accessible_area = accessible_area.difference(space.geometry.intersection(
|
accessible_area = accessible_area.difference(space.geometry.intersection(
|
||||||
cascaded_union(tuple(h.geometry for h in space.holes.all()))
|
unary_union(tuple(h.geometry for h in space.holes.all()))
|
||||||
))
|
))
|
||||||
|
|
||||||
areas_by_altitude = {}
|
areas_by_altitude = {}
|
||||||
for tmpid in level_areas.get(level, []):
|
for tmpid in level_areas.get(level, []):
|
||||||
area = areas[tmpid]
|
area = areas[tmpid]
|
||||||
areas_by_altitude.setdefault(area.altitude, []).append(area.geometry.buffer(0.01))
|
areas_by_altitude.setdefault(area.altitude, []).append(area.geometry.buffer(0.01))
|
||||||
areas_by_altitude = {altitude: [cascaded_union(alt_areas)]
|
areas_by_altitude = {altitude: [unary_union(alt_areas)]
|
||||||
for altitude, alt_areas in areas_by_altitude.items()}
|
for altitude, alt_areas in areas_by_altitude.items()}
|
||||||
|
|
||||||
accessible_area = accessible_area.difference(
|
accessible_area = accessible_area.difference(
|
||||||
cascaded_union(tuple(itertools.chain(*areas_by_altitude.values())))
|
unary_union(tuple(itertools.chain(*areas_by_altitude.values())))
|
||||||
)
|
)
|
||||||
|
|
||||||
stairs = []
|
stairs = []
|
||||||
|
@ -434,7 +434,7 @@ class AltitudeArea(LevelGeometryMixin, models.Model):
|
||||||
scaled = scale(line, xfact=fact, yfact=fact)
|
scaled = scale(line, xfact=fact, yfact=fact)
|
||||||
stairs.append(scaled.buffer(0.0001, JOIN_STYLE.mitre).intersection(geom.buffer(0.0001)))
|
stairs.append(scaled.buffer(0.0001, JOIN_STYLE.mitre).intersection(geom.buffer(0.0001)))
|
||||||
if stairs:
|
if stairs:
|
||||||
stairs = cascaded_union(stairs)
|
stairs = unary_union(stairs)
|
||||||
remaining_space = remaining_space.difference(stairs)
|
remaining_space = remaining_space.difference(stairs)
|
||||||
|
|
||||||
for polygon in assert_multipolygon(remaining_space.buffer(0)):
|
for polygon in assert_multipolygon(remaining_space.buffer(0)):
|
||||||
|
@ -452,7 +452,7 @@ class AltitudeArea(LevelGeometryMixin, models.Model):
|
||||||
|
|
||||||
# plot_geometry(remaining_space, title=space.title)
|
# plot_geometry(remaining_space, title=space.title)
|
||||||
|
|
||||||
areas_by_altitude = {altitude: cascaded_union(alt_areas)
|
areas_by_altitude = {altitude: unary_union(alt_areas)
|
||||||
for altitude, alt_areas in areas_by_altitude.items()}
|
for altitude, alt_areas in areas_by_altitude.items()}
|
||||||
|
|
||||||
level_areas[level] = [AltitudeArea(level=level, geometry=geometry, altitude=altitude)
|
level_areas[level] = [AltitudeArea(level=level, geometry=geometry, altitude=altitude)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue