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)
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_wms_renderer(self): renderer = Renderer.factory("wms") self.assertIsInstance(renderer, WmsRenderer) self.assertEquals(renderer.type(), "wms")
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