From 0c39da645581bbdcd9148e970ce3e8bba36b3cb5 Mon Sep 17 00:00:00 2001 From: Hartmut Holzgraefe Date: Sun, 24 Apr 2016 23:26:51 +0200 Subject: [PATCH 1/2] add support for rendering an extra overlay on top of the base map --- ocitysmap/__init__.py | 1 + ocitysmap/layoutlib/single_page_renderers.py | 18 ++++++++++++++++++ render.py | 16 ++++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/ocitysmap/__init__.py b/ocitysmap/__init__.py index 31b6f59..a58d372 100644 --- a/ocitysmap/__init__.py +++ b/ocitysmap/__init__.py @@ -111,6 +111,7 @@ class RenderingConfiguration: self.language = None # str (locale) self.stylesheet = None # Obj Stylesheet + self.overlay = None # Obj Stylesheet self.paper_width_mm = None self.paper_height_mm = None diff --git a/ocitysmap/layoutlib/single_page_renderers.py b/ocitysmap/layoutlib/single_page_renderers.py index 48e5a62..7824b79 100644 --- a/ocitysmap/layoutlib/single_page_renderers.py +++ b/ocitysmap/layoutlib/single_page_renderers.py @@ -41,6 +41,7 @@ from ocitysmap.indexlib.renderer import StreetIndexRenderer from indexlib.indexer import StreetIndex from indexlib.commons import IndexDoesNotFitError, IndexEmptyError import draw_utils +from ocitysmap.maplib.map_canvas import MapCanvas LOG = logging.getLogger('ocitysmap') @@ -143,6 +144,14 @@ class SinglePageRenderer(Renderer): float(self._map_coords[3]), # H dpi ) + # Prepare map overlay + if self.rc.overlay: + self._overlay_canvas = MapCanvas(self.rc.overlay, + self.rc.bounding_box, + float(self._map_coords[2]), # W + float(self._map_coords[3]), # H + dpi) + # Prepare the grid self.grid = self._create_grid(self._map_canvas) @@ -402,11 +411,20 @@ class SinglePageRenderer(Renderer): # Draw the rescaled Map ctx.save() rendered_map = self._map_canvas.get_rendered_map() + LOG.debug('Map:') LOG.debug('Mapnik scale: 1/%f' % rendered_map.scale_denominator()) LOG.debug('Actual scale: 1/%f' % self._map_canvas.get_actual_scale()) mapnik.render(rendered_map, ctx) ctx.restore() + # Draw the rescaled Overlay + if self.rc.overlay: + ctx.save() + rendered_overlay = self._overlay_canvas.get_rendered_map() + LOG.debug('Overlay:') + mapnik.render(rendered_overlay, ctx) + ctx.restore() + # Draw a rectangle around the map ctx.rectangle(0, 0, map_coords_dots[2], map_coords_dots[3]) ctx.stroke() diff --git a/render.py b/render.py index 4f681ea..52bbf6f 100755 --- a/render.py +++ b/render.py @@ -83,6 +83,10 @@ def main(): metavar='NAME', help='specify which stylesheet to use. Defaults to the ' 'first specified in the configuration file.') + parser.add_option('--overlay', dest='overlay', + metavar='NAME', + help='specify which overlay stylesheet to use. ' + 'Defaults to none') parser.add_option('-l', '--layout', dest='layout', metavar='NAME', default=KNOWN_RENDERERS_NAMES[0].split()[0], @@ -156,6 +160,17 @@ def main(): % (ex, ', '.join(map(lambda s: s.name, mapper.STYLESHEET_REGISTRY)))) + # Parse overlay stylesheet (defaults to none) + if options.overlay is None: + overlay = None + else: + try: + overlay = mapper.get_stylesheet_by_name(options.overlay) + except LookupError, ex: + parser.error("%s. Available stylesheets: %s." + % (ex, ', '.join(map(lambda s: s.name, + mapper.STYLESHEET_REGISTRY)))) + # Parse rendering layout if options.layout is None: cls_renderer = ocitysmap.layoutlib.renderers.get_renderers()[0] @@ -226,6 +241,7 @@ def main(): rc.bounding_box = bbox rc.language = options.language rc.stylesheet = stylesheet + rc.overlay = overlay if options.orientation == 'portrait': rc.paper_width_mm = paper_descr[1] rc.paper_height_mm = paper_descr[2] From 8a42d904ca73fd5467808b93ec86cec2fcd7134a Mon Sep 17 00:00:00 2001 From: Hartmut Holzgraefe Date: Sat, 30 Apr 2016 08:41:17 +0200 Subject: [PATCH 2/2] missing render step for overlay added --- ocitysmap/layoutlib/single_page_renderers.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ocitysmap/layoutlib/single_page_renderers.py b/ocitysmap/layoutlib/single_page_renderers.py index 7824b79..84a2a64 100644 --- a/ocitysmap/layoutlib/single_page_renderers.py +++ b/ocitysmap/layoutlib/single_page_renderers.py @@ -166,6 +166,11 @@ class SinglePageRenderer(Renderer): # Commit the internal rendering stack of the map self._map_canvas.render() + if self.rc.overlay: + self._overlay_canvas.render() + + + def _create_index_rendering(self, on_the_side): """