diff --git a/src/c3nav/mapdata/render/svg.py b/src/c3nav/mapdata/render/svg.py index 2ada99ec..4973b1fb 100644 --- a/src/c3nav/mapdata/render/svg.py +++ b/src/c3nav/mapdata/render/svg.py @@ -20,10 +20,11 @@ def render_svg(level, miny, minx, maxy, maxx, scale=1): for level in levels: buildings_geom = bbox.intersection(unary_union([b.geometry for b in level.buildings.all()])) - svg.add_geometry(buildings_geom, fill_color='#aaaaaa') + # svg.add_geometry(buildings_geom, fill_color='#aaaaaa') for altitudearea in level.altitudeareas.all(): - svg.add_geometry(bbox.intersection(altitudearea.geometry), fill_color='#ececec') + svg.add_geometry(bbox.intersection(altitudearea.geometry), + fill_color='#ffffff', altitude=altitudearea.altitude) for space in level.spaces.all(): if space.outside: @@ -33,10 +34,11 @@ def render_svg(level, miny, minx, maxy, maxx, scale=1): doors_geom = bbox.intersection(unary_union([d.geometry for d in level.doors.all()])) svg.add_geometry(spaces_geom, fill_color='#eeeeee') - svg.add_geometry(doors_geom.difference(spaces_geom), fill_color='#ffffff') + # svg.add_geometry(doors_geom.difference(spaces_geom), fill_color='#ffffff') walls_geom = buildings_geom.difference(spaces_geom).difference(doors_geom) - svg.add_geometry(walls_geom, fill_color='#aaaaaa', stroke_px=0.5, stroke_color='#aaaaaa') + svg.add_geometry(walls_geom, fill_color='#aaaaaa', stroke_px=0.5, stroke_color='#aaaaaa', + elevation=level.default_height) return svg.get_xml() diff --git a/src/c3nav/mapdata/utils/svg.py b/src/c3nav/mapdata/utils/svg.py index 3f66be16..63b5a37b 100644 --- a/src/c3nav/mapdata/utils/svg.py +++ b/src/c3nav/mapdata/utils/svg.py @@ -3,6 +3,7 @@ import xml.etree.ElementTree as ET from itertools import chain from shapely.affinity import scale, translate +from shapely.ops import unary_union class SVGImage: @@ -14,6 +15,8 @@ class SVGImage: self.g = ET.Element('g', {}) self.defs = ET.Element('defs') self.def_i = 0 + self.altitudes = {} + self.last_altitude = None blur_filter = ET.Element('filter', {'id': 'wallblur'}) blur_filter.append(ET.Element('feGaussianBlur', @@ -83,9 +86,22 @@ class SVGImage: self.defs.append(clippath) return defid + def clip_altitudes(self, new_geometry, new_altitude=None): + for altitude, geometry in self.altitudes.items(): + if altitude != new_altitude: + self.altitudes[altitude] = geometry.difference(new_geometry) + if new_altitude is not None: + if self.last_altitude is not None and self.last_altitude > new_altitude: + raise ValueError('Altitudes have to be ascending.') + self.last_altitude = new_altitude + if new_altitude in self.altitudes: + self.altitudes[new_altitude] = unary_union([self.altitudes[new_altitude], new_geometry]) + else: + self.altitudes[new_altitude] = new_geometry + def add_geometry(self, geometry=None, fill_color=None, fill_opacity=None, opacity=None, filter=None, stroke_px=0.0, stroke_width=0.0, stroke_color=None, stroke_opacity=None, stroke_linejoin=None, - clip_path=None): + clip_path=None, altitude=None, elevation=None): if geometry is not None: if not geometry: return @@ -93,6 +109,10 @@ class SVGImage: element = ET.Element('use', {'xlink:href': '#'+geometry}) else: element = self._create_geometry(geometry) + + if altitude is not None or elevation is not None: + self.clip_altitudes(geometry, altitude) + else: element = ET.Element('rect', {'width': '100%', 'height': '100%'}) element.set('fill', fill_color or 'none')