def test_geojson_renderer_render(self):
     renderer = Renderer.factory("geojson")
     renderer.render(
         **{
         'type': 'geojson',
         'opacity': 0.5,
         'filename': self.file_path,
         'epsg': 31370,
         'filetype': 'png',
         'width': 500,
         'height': 500,
         'color': 'steelblue',
         'geojson':{
             "type":"MultiPolygon",
             "coordinates":[[[[103827.44321801752,192484.5100535322],[103826.65621839411,192565.57026445214],[103839.2000972359,192622.4958831761],[103877.27257229008,192673.1911981115],[103981.90807816133,192592.71585010737],[104050.62835409257,192535.07265175506],[104119.78606355426,192526.95860514138],[104157.5529127745,192543.1371434061],[104163.33481632298,192516.068607972],[104043.86794770884,192451.07658289373],[103839.39232099024,192304.2814310426],[103825.49962980268,192434.99411542248],[103827.44321801752,192484.5100535322]]]],
             "crs":{
             "type":"name",
             "properties":{
             "name":"urn:ogc:def:crs:EPSG::31370"}}},
         'bbox': [100000, 100000, 200000, 200000]
      }
     )
     self.assertTrue(os.path.isfile(self.file_path))
     image = Image(filename=self.file_path)
     self.assertIsInstance(image, Image)
 def test_geojson_renderer_render2(self):
     renderer = Renderer.factory("geojson")
     renderer.render(
         **{
             'type': 'geojson',
             'opacity': 0.5,
             'filename': self.file_path,
             'epsg': 31370,
             'filetype': 'png',
             'width': 500,
             'height': 500,
             'color': 'steelblue',
             'geojson': {
                 'crs': {
                     'type': 'name',
                     'properties': {
                         'name': 'EPSG:31370'
                     }
                 },
                 'type': 'MultiPoint',
                 'coordinates': [[103912.03, 192390.11],
                                 [103500, 192390.11]]
             },
             'bbox': [100000, 100000, 200000, 200000]
         })
     self.assertTrue(os.path.isfile(self.file_path))
     image = Image(filename=self.file_path)
     self.assertIsInstance(image, Image)
    def test_wms_renderer_errors(self):
        renderer = Renderer.factory("wms")

        with self.assertRaises(Exception) as context:
            renderer.render(
                **{
                    'type': 'wms',
                    'url': 'http://non_existant/geoserver/wms?',
                    'layers': 'vioe_geoportaal:onbestaande_laag',
                    'filename': 'filename',
                    'epsg': 31370,
                    'filetype': 'png',
                    'width': 500,
                    'height': 500,
                    'bbox': [145000, 195000, 165000, 215000]
                })
        self.assertTrue(context.exception.args[0].startswith(
            'Request could not be executed'))

        with self.assertRaises(Exception) as context:
            renderer.render(
                **{
                    'type': 'wms',
                    'url':
                    'https://geo.onroerenderfgoed.be/geoserver/wee_em_es?',
                    'layers': 'vioe_geoportaal:onbestaande_laag',
                    'filename': 'filename',
                    'epsg': 31370,
                    'filetype': 'png',
                    'width': 500,
                    'height': 500,
                    'bbox': [145000, 195000, 165000, 215000]
                })
        self.assertTrue(context.exception.args[0].startswith(
            'Service not found (status_code 404)'))

        with self.assertRaises(Exception) as context:
            renderer.render(
                **{
                    'type': 'wms',
                    'url': 'https://geo.onroerenderfgoed.be/geoserver/wms?',
                    'layers': 'vioe_geoportaal:onbestaande_laag',
                    'filename': 'filename',
                    'epsg': 31370,
                    'filetype': 'png',
                    'width': 500,
                    'height': 500,
                    'bbox': [145000, 195000, 165000, 215000]
                })
        self.assertTrue(
            context.exception.args[0].startswith('Exception occured'))
    def test_wms_renderer_errors(self):
        renderer = Renderer.factory("wms")

        with self.assertRaises(Exception) as context:
            renderer.render(
                **{
                'type': 'wms',
                'url': 'http://non_existant/geoserver/wms?',
                'layers': 'vioe_geoportaal:onbestaande_laag',
                'filename': 'filename',
                'epsg': 31370,
                'filetype': 'png',
                'width': 500,
                'height': 500,
                'bbox': [145000, 195000, 165000, 215000]
                }
            )
        self.assertTrue(context.exception.args[0].startswith('Request could not be executed'))

        with self.assertRaises(Exception) as context:
            renderer.render(
                **{
                'type': 'wms',
                'url': 'https://geo.onroerenderfgoed.be/geoserver/wee_em_es?',
                'layers': 'vioe_geoportaal:onbestaande_laag',
                'filename': 'filename',
                'epsg': 31370,
                'filetype': 'png',
                'width': 500,
                'height': 500,
                'bbox': [145000, 195000, 165000, 215000]
                }
            )
        self.assertTrue(context.exception.args[0].startswith('Service not found (status_code 404)'))

        with self.assertRaises(Exception) as context:
            renderer.render(
                **{
                'type': 'wms',
                'url': 'https://geo.onroerenderfgoed.be/geoserver/wms?',
                'layers': 'vioe_geoportaal:onbestaande_laag',
                'filename': 'filename',
                'epsg': 31370,
                'filetype': 'png',
                'width': 500,
                'height': 500,
                'bbox': [145000, 195000, 165000, 215000]
                }
            )
        self.assertTrue(context.exception.args[0].startswith('Exception occured'))
 def test_multipoint2_renderer_render(self):
     renderer = Renderer.factory("wkt")
     renderer.render(
         **{
             'type': 'wkt',
             'opacity': 0.5,
             'filename': self.file_path,
             'epsg': 31370,
             'filetype': 'png',
             'width': 500,
             'height': 500,
             'color': '#0000ff',
             'wkt': 'MULTIPOINT (103500 192390.11, 103912.03 192390.11)',
             'bbox': [100000, 100000, 200000, 200000]
         })
     self.assertTrue(os.path.isfile(self.file_path))
     image = Image(filename=self.file_path)
     self.assertIsInstance(image, Image)
 def test_multipoint2_renderer_render(self):
     renderer = Renderer.factory("wkt")
     renderer.render(
         **{
         'type': 'wkt',
         'opacity': 0.5,
         'filename': self.file_path,
         'epsg': 31370,
         'filetype': 'png',
         'width': 500,
         'height': 500,
         'color': '#0000ff',
         'wkt': 'MULTIPOINT (103500 192390.11, 103912.03 192390.11)',
         'bbox': [100000, 100000, 200000, 200000]
      }
     )
     self.assertTrue(os.path.isfile(self.file_path))
     image = Image(filename=self.file_path)
     self.assertIsInstance(image, Image)
 def test_geojson_renderer_render2(self):
     renderer = Renderer.factory("geojson")
     renderer.render(
         **{
         'type': 'geojson',
         'opacity': 0.5,
         'filename': self.file_path,
         'epsg': 31370,
         'filetype': 'png',
         'width': 500,
         'height': 500,
         'color': 'steelblue',
         'geojson':{'crs': {'type': 'name', 'properties': {'name': 'EPSG:31370'}}, 'type': 'MultiPoint', 'coordinates': [[103912.03, 192390.11],[103500, 192390.11]]},
         'bbox': [100000, 100000, 200000, 200000]
      }
     )
     self.assertTrue(os.path.isfile(self.file_path))
     image = Image(filename=self.file_path)
     self.assertIsInstance(image, Image)
 def test_geojson_renderer_render(self):
     renderer = Renderer.factory("geojson")
     renderer.render(
         **{
             'type': 'geojson',
             'opacity': 0.5,
             'filename': self.file_path,
             'epsg': 31370,
             'filetype': 'png',
             'width': 500,
             'height': 500,
             'color': 'steelblue',
             'geojson': {
                 "type":
                 "MultiPolygon",
                 "coordinates": [[[[103827.44321801752, 192484.5100535322],
                                   [103826.65621839411, 192565.57026445214],
                                   [103839.2000972359, 192622.4958831761],
                                   [103877.27257229008, 192673.1911981115],
                                   [103981.90807816133, 192592.71585010737],
                                   [104050.62835409257, 192535.07265175506],
                                   [104119.78606355426, 192526.95860514138],
                                   [104157.5529127745, 192543.1371434061],
                                   [104163.33481632298, 192516.068607972],
                                   [104043.86794770884, 192451.07658289373],
                                   [103839.39232099024, 192304.2814310426],
                                   [103825.49962980268, 192434.99411542248],
                                   [103827.44321801752, 192484.5100535322]]]
                                 ],
                 "crs": {
                     "type": "name",
                     "properties": {
                         "name": "urn:ogc:def:crs:EPSG::31370"
                     }
                 }
             },
             'bbox': [100000, 100000, 200000, 200000]
         })
     self.assertTrue(os.path.isfile(self.file_path))
     image = Image(filename=self.file_path)
     self.assertIsInstance(image, Image)
 def test_logo_renderer_render(self):
     renderer = Renderer.factory("logo")
     renderer.render(
         **{
             'type': 'logo',
             'url':
             'https://www.onroerenderfgoed.be/assets/img/logo-og.png',
             'opacity': 0.5,
             'imagewidth': 100,
             'imageheight': 100,
             'gravity': 'south_west',
             'filename': self.file_path,
             'epsg': 31370,
             'filetype': 'png',
             'width': 500,
             'height': 500,
             'bbox': [145000, 195000, 165000, 215000],
             'offset': '0,0'
         })
     self.assertTrue(os.path.isfile(self.file_path))
     image = Image(filename=self.file_path)
     self.assertIsInstance(image, Image)
 def test_logo_renderer_render(self):
     renderer = Renderer.factory("logo")
     renderer.render(
         **{
         'type': 'logo',
         'url': 'https://www.onroerenderfgoed.be/assets/img/logo-og.png',
         'opacity': 0.5,
          'imagewidth': 100,
          'imageheight': 100,
          'gravity': 'south_west',
         'filename': self.file_path,
         'epsg': 31370,
         'filetype': 'png',
         'width': 500,
         'height': 500,
         'bbox': [145000, 195000, 165000, 215000],
             'offset': '0,0'
      }
     )
     self.assertTrue(os.path.isfile(self.file_path))
     image = Image(filename=self.file_path)
     self.assertIsInstance(image, Image)
示例#11
0
    def generate(config):
        '''
        Creates a map based on a configuration file
        :param config
        :return:
        '''

        temp = tempdir.TempDir()
        images = []
        if not 'filename' in config['params']:
            config['params']['filename'] = os.path.join(temp.name, "result")

        #render layers
        idx = 0
        for layer in config['layers']:
            idx = idx + 1
            renderer = Renderer.factory(layer['type'])
            layer['filetype'] = 'png'
            layer['filename'] = os.path.join(temp.name, str(idx) + '.' + layer['filetype'])

            kwarguments = merge_dicts(config['params'], layer)
            try:
                renderer.render(**kwarguments)
                images.append(layer['filename'])
            except NotImplementedError as e:
                log.warning("Layertype is not yet implemented: " + e.message)
                pass

            except Exception as e:
                log.error('Following layer could not be rendered: ' + str(idx) + ' -->message: ' + e.message)
                raise
        #combine individual layers
        temp_combined = os.path.join(temp.name, 'combined')
        combine_layers(images[::-1], temp_combined)

        #convert filetype
        convert_filetype(temp_combined, config['params']['filename'], config['params']['filetype'])
        return config
 def test_scale_renderer(self):
     renderer = Renderer.factory("scale")
     renderer.render(
         **{
             'type': 'scale',
             'gravity': 'south_west',
             'offset': '10,20',
             'opacity': 1,
             'filename': self.file_path,
             'epsg': 31370,
             'filetype': 'png',
             'width': 750,
             'height': 750,
             'bbox': [100000, 100000, 200000, 200000],
             'font_size': 11,
             'imagewidth': 200,
             'imageheight': 50
         })
     self.assertIsInstance(renderer, ScaleRenderer)
     self.assertEquals(renderer.type(), "scale")
     self.assertTrue(os.path.isfile(self.file_path))
     image = Image(filename=self.file_path)
     self.assertIsInstance(image, Image)
 def test_scale_renderer(self):
     renderer = Renderer.factory("scale")
     renderer.render(
         **{
         'type': 'scale',
          'gravity': 'south_west',
          'offset':'10,20',
          'opacity': 1,
         'filename': self.file_path,
         'epsg': 31370,
         'filetype': 'png',
         'width': 750,
         'height': 750,
         'bbox': [100000, 100000, 200000, 200000],
         'font_size': 11,
         'imagewidth': 200,
         'imageheight': 50
      })
     self.assertIsInstance(renderer, ScaleRenderer)
     self.assertEquals(renderer.type(), "scale")
     self.assertTrue(os.path.isfile(self.file_path))
     image = Image(filename=self.file_path)
     self.assertIsInstance(image, Image)
 def test_logo_renderer(self):
     renderer = Renderer.factory("logo")
     self.assertIsInstance(renderer, LogoRenderer)
     self.assertEquals(renderer.type(), "logo")
 def test_wkt_renderer(self):
     renderer = Renderer.factory("wkt")
     self.assertIsInstance(renderer, WktRenderer)
     self.assertEquals(renderer.type(), "wkt")
 def test_text_renderer(self):
     renderer = Renderer.factory("text")
     self.assertIsInstance(renderer, TextRenderer)
     self.assertEquals(renderer.type(), "text")
 def test_legend_renderer(self):
     renderer = Renderer.factory("legend")
     self.assertIsInstance(renderer, LegendRenderer)
     self.assertEquals(renderer.type(), "legend")
     self.assertRaises(NotImplementedError, renderer.render)
 def test_default_renderer(self):
     renderer = Renderer.factory("")
     self.assertIsInstance(renderer, DefaultRenderer)
     self.assertEquals(renderer.type(), "default")
     self.assertRaises(NotImplementedError, renderer.render)
 def test_wkt_renderer(self):
     renderer = Renderer.factory("wkt")
     self.assertIsInstance(renderer, WktRenderer)
     self.assertEquals(renderer.type(), "wkt")
 def test_default_renderer(self):
     renderer = Renderer.factory("")
     self.assertIsInstance(renderer, DefaultRenderer)
     self.assertEquals(renderer.type(), "default")
     self.assertRaises(NotImplementedError, renderer.render)
 def test_wms_renderer(self):
     renderer = Renderer.factory("wms")
     self.assertIsInstance(renderer, WmsRenderer)
     self.assertEquals(renderer.type(), "wms")
 def test_wms_renderer(self):
     renderer = Renderer.factory("wms")
     self.assertIsInstance(renderer, WmsRenderer)
     self.assertEquals(renderer.type(), "wms")
 def test_text_renderer(self):
     renderer = Renderer.factory("text")
     self.assertIsInstance(renderer, TextRenderer)
     self.assertEquals(renderer.type(), "text")
 def test_geojson_renderer(self):
     renderer = Renderer.factory("geojson")
     self.assertIsInstance(renderer, GeojsonRenderer)
     self.assertEquals(renderer.type(), "geojson")
    def generate(config):
        """
        Creates a map based on a configuration file
        :param config
        :return:
        """

        # generate map
        mapnik_map = mapnik.Map(config['params']['width'], config['params']['height'], '+init=epsg:31370')
        mapnik_map.background = mapnik.Color('white')

        s = mapnik.Style()
        r = mapnik.Rule()
        polygon_symbolizer = mapnik.PolygonSymbolizer()
        polygon_symbolizer.fill = mapnik.Color('steelblue')
        polygon_symbolizer.fill_opacity = 0.5
        r.symbols.append(polygon_symbolizer)
        line_symbolizer = mapnik.LineSymbolizer()
        line_symbolizer.fill = mapnik.Color('rgb(50%,50%,50%)')
        r.symbols.append(line_symbolizer)
        s.rules.append(r)
        mapnik_map.append_style('default', s)
        s = mapnik.Style()
        r = mapnik.Rule()
        point_symbolizer = mapnik.PointSymbolizer()
        point_symbolizer.file = os.path.abspath(os.path.dirname(__file__)) + '/fixtures/pointer.svg'
        r.symbols.append(point_symbolizer)
        s.rules.append(r)
        mapnik_map.append_style('point', s)

        # render layers
        layers = [layer for layer in config['layers'] if layer['type'] in ['geojson']]
        for idx, layer in enumerate(layers):
            renderer = Renderer.factory(layer['type'])
            layer['idx'] = idx
            kwargs = merge_dicts(config['params'], layer)
            try:
                rendered_layer = renderer.render(**kwargs)
                rendered_layer.styles.append('default')
                mapnik_map.layers.append(rendered_layer)
            except Exception as e:
                log.error('Following layer could not be rendered: ' + str(idx))
                log.error(e, exc_info=True)
                raise

        # bbox is the given bbox or the bbox of the layers with a buffer value
        if config['params'].get('bbox') is None:
            mapnik_map.zoom_all()
            extend = mapnik_map.envelope()
            min_width = int(min(extend.maxx - extend.minx, extend.maxy - extend.miny))
            min_width_param = max(len(str(min_width)) - 1, 2)
            extend.width(extend.width() + 10 ** min_width_param)
            bbox_layers = [extend.minx, extend.miny, extend.maxx, extend.maxy]
        else:
            bbox_layers = config['params']['bbox']
            extend = mapnik.Box2d(bbox_layers[0], bbox_layers[1], bbox_layers[2], bbox_layers[3])
        mapnik_map.zoom_to_box(extend)

        # render background
        background_layers = [layer for layer in config['layers'] if layer['type'] == 'wms']
        background = background_layers[0] if len(background_layers) > 0 else None
        if background:
            # printing map to image works differently for wms in comparison to Mapnik rendering
            # rescaling of the bbox is necessary to avoid deformations of the background image
            bbox = rescale_bbox(config['params']['height'], config['params']['width'], bbox_layers)
            config['params']['bbox'] = bbox
            mapnik_map.zoom_to_box(mapnik.Box2d(bbox[0], bbox[1], bbox[2], bbox[3]))
            # rendering the background image
            renderer = Renderer.factory('wms')
            kwargs = merge_dicts(config['params'], background)
            try:
                rendered_layer = renderer.render(**kwargs)
                background = os.path.join(str(config['params']['tempdir']), "background.png")
                with open(background, 'wb') as im:
                    im.write(rendered_layer)
                mapnik_map.background_image = background
            except Exception as e:
                log.error('Background wms could not be rendered')
                log.error(e, exc_info=True)
                raise

        im = mapnik.Image(mapnik_map.width, mapnik_map.height)
        mapnik.render(mapnik_map, im)
        filename = os.path.join(str(config['params']['tempdir']), "result")
        im.save(filename, 'png')

        # add text
        text_layers = [layer for layer in config['layers'] if layer['type'] == 'text']
        for text_layer in text_layers:
            renderer = Renderer.factory('text')
            config['params']['filename'] = filename
            kwargs = merge_dicts(config['params'], text_layer)
            try:
                renderer.render(**kwargs)
            except Exception as e:
                log.error('Text could not be rendered')
                log.error(e, exc_info=True)
                raise

        # add scale
        renderer = Renderer.factory('scale')
        config['params']['filename'] = filename
        scale = {
            "map_scale": mapnik_map.scale(),
            "gravity": "south_west",
            "font_size": 3
        }
        kwargs = merge_dicts(config['params'], scale)
        try:
            renderer.render(**kwargs)
        except Exception as e:
            log.error('Scale could not be rendered')
            log.error(e, exc_info=True)
            raise

        return filename
 def test_legend_renderer(self):
     renderer = Renderer.factory("legend")
     self.assertIsInstance(renderer, LegendRenderer)
     self.assertEquals(renderer.type(), "legend")
     self.assertRaises(NotImplementedError, renderer.render)
 def test_geojson_renderer(self):
     renderer = Renderer.factory("geojson")
     self.assertIsInstance(renderer, GeojsonRenderer)
     self.assertEquals(renderer.type(), "geojson")
 def test_logo_renderer(self):
     renderer = Renderer.factory("logo")
     self.assertIsInstance(renderer, LogoRenderer)
     self.assertEquals(renderer.type(), "logo")