def render(self): mapfile_path = get_eoxserver_config().get("wmm", "mapfile") map_ = ms.mapObj(mapfile_path) #TODO: path to map map_.setMetaData("ows_enable_request", "*") map_.setProjection("EPSG:4326") map_.imagecolor.setRGB(0, 0, 0) # set supported CRSs decoder = CRSsConfigReader(get_eoxserver_config()) crss_string = " ".join( map(lambda crs: "EPSG:%d" % crs, decoder.supported_crss_wms) ) map_.setMetaData("ows_srs", crss_string) map_.setMetaData("wms_srs", crss_string) ms_request = ms.create_request(( ("service", "WMS"), ("version", "1.3.0"), ("request", "GetCapabilities"), )) raw_result = map_.dispatch(ms_request) result = result_set_from_raw_data(raw_result) return result, get_content_type(result)
def create_map(self): """ Helper function to create a WCS enabled MapServer mapObj. """ map_ = ms.mapObj() map_.setMetaData("ows_enable_request", "*") maxsize = WCSConfigReader(get_eoxserver_config()).maxsize if maxsize is not None: map_.maxsize = maxsize map_.setMetaData("ows_updateSequence", WCSConfigReader(get_eoxserver_config()).update_sequence) return map_
def create_map(self): """ Helper function to create a WCS enabled MapServer mapObj. """ map_ = ms.mapObj() map_.setMetaData("ows_enable_request", "*") maxsize = WCSConfigReader(get_eoxserver_config()).maxsize if maxsize is not None: map_.maxsize = maxsize map_.setMetaData( "ows_updateSequence", WCSConfigReader(get_eoxserver_config()).update_sequence) return map_
def render(self): mapfile_path = get_eoxserver_config().get("wmm", "mapfile") map_ = ms.mapObj(mapfile_path) #TODO: path to map map_.setMetaData("ows_enable_request", "*") map_.setProjection("EPSG:4326") map_.imagecolor.setRGB(0, 0, 0) # set supported CRSs decoder = CRSsConfigReader(get_eoxserver_config()) crss_string = " ".join( map(lambda crs: "EPSG:%d" % crs, decoder.supported_crss_wms)) map_.setMetaData("ows_srs", crss_string) map_.setMetaData("wms_srs", crss_string) ms_request = ms.create_request(( ("service", "WMS"), ("version", "1.3.0"), ("request", "GetCapabilities"), )) raw_result = map_.dispatch(ms_request) result = result_set_from_raw_data(raw_result) return result, get_content_type(result)
def render(self, layers, bbox, crs, size, frmt, time, elevation, styles): if not time: raise RenderException("Missing mandatory 'time' parameter.") try: time = time.value except AttributeError: raise RenderException( "Parameter 'time' must be a slice and not a range." ) llbbox = self.get_llbbox(bbox, crs) mapfile_path = get_eoxserver_config().get("wmm", "mapfile") map_ = ms.mapObj(mapfile_path) #TODO: path to map map_.setMetaData("ows_enable_request", "*") map_.setProjection("EPSG:4326") map_.imagecolor.setRGB(0, 0, 0) # set supported CRSs decoder = crss.CRSsConfigReader(get_eoxserver_config()) crss_string = " ".join( map(lambda crs: "EPSG:%d" % crs, decoder.supported_crss_wms) ) map_.setMetaData("ows_srs", crss_string) map_.setMetaData("wms_srs", crss_string) datasources = [] datasets = [] for layer_name in layers: layer = map_.getLayerByName(layer_name) if not layer: continue product = layer.metadata.get("wmm_product") filename = self.generate_filename("tif") ds = self.create_dataset( llbbox, time, elevation, size, product, filename ) datasets.append(ds) if layer.type == ms.MS_LAYER_LINE: flavor = layer.metadata.get("wmm_flavor") contour_steps = self.get_contour_intervals( flavor, llbbox, size ) filename = self.generate_filename("shp") self.generate_contours( ds, contour_steps, filename ) layer.connectiontype = ms.MS_OGR layer.connection = filename layer.data, _ = splitext(basename(filename)) datasources.append(filename) ms_request = ms.create_request(( ("service", "WMS"), ("version", "1.3.0"), ("request", "GetMap"), ("layers", ",".join(layers)), ("bbox", "%f,%f,%f,%f" % (bbox[1], bbox[0], bbox[3], bbox[2])), ("crs", crs), ("width", str(size[0])), ("height", str(size[1])), ("styles", ",".join(styles)), ("format", frmt) )) raw_result = ms.dispatch(map_, ms_request) result = result_set_from_raw_data(raw_result) shp_drv = ogr.GetDriverByName("ESRI Shapefile") # cleanup datasources and datasets for filename in datasources: shp_drv.DeleteDataSource(filename) for ds in datasets: driver = ds.GetDriver() for filename in ds.GetFileList(): os.remove(filename) return result, get_content_type(result)
def render_map(self, render_map): # TODO: get layer creators for each layer type in the map map_obj = ms.mapObj() if render_map.bgcolor: map_obj.imagecolor.setHex("#" + render_map.bgcolor.lower()) else: map_obj.imagecolor.setRGB(0, 0, 0) frmt = getFormatRegistry().getFormatByMIME(render_map.format) if not frmt: raise MapRenderError('No such format %r' % render_map.format, code='InvalidFormat', locator='format') outputformat_obj = ms.outputFormatObj(frmt.driver) outputformat_obj.transparent = (ms.MS_ON if render_map.transparent else ms.MS_OFF) outputformat_obj.mimetype = frmt.mimeType if frmt.defaultExt: if frmt.defaultExt.startswith('.'): extension = frmt.defaultExt[1:] else: extension = frmt.defaultExt outputformat_obj.extension = extension map_obj.setOutputFormat(outputformat_obj) # map_obj.setExtent(*render_map.bbox) map_obj.setSize(render_map.width, render_map.height) map_obj.setProjection(render_map.crs) map_obj.setConfigOption('MS_NONSQUARE', 'yes') layers_plus_factories = self._get_layers_plus_factories(render_map) layers_plus_factories_plus_data = [ (layer, factory, factory.create(map_obj, layer)) for layer, factory in layers_plus_factories ] # log the resulting map if logger.isEnabledFor(logging.DEBUG): with tempfile.NamedTemporaryFile() as f: map_obj.save(f.name) f.seek(0) logger.debug(f.read().decode('ascii')) try: # actually render the map image_obj = map_obj.draw() try: image_bytes = image_obj.getBytes() except Exception: tmp_name = '/vsimem/%s' % uuid4().hex image_obj.save(tmp_name, map_obj) with vsi.open(tmp_name) as f: image_bytes = f.read() vsi.unlink(tmp_name) extension = outputformat_obj.extension if extension: if len(render_map.layers) == 1: filename = '%s.%s' % (render_map.layers[0].name, extension) else: filename = 'map.%s' % extension else: filename = None return image_bytes, outputformat_obj.mimetype, filename finally: # disconnect for layer, factory, data in layers_plus_factories_plus_data: factory.destroy(map_obj, layer, data)
def render(self, layers, bbox, crs, size, frmt, time, elevation, styles): if not time: raise RenderException("Missing mandatory 'time' parameter.") try: time = time.value except AttributeError: raise RenderException( "Parameter 'time' must be a slice and not a range.") llbbox = self.get_llbbox(bbox, crs) mapfile_path = get_eoxserver_config().get("wmm", "mapfile") map_ = ms.mapObj(mapfile_path) #TODO: path to map map_.setMetaData("ows_enable_request", "*") map_.setProjection("EPSG:4326") map_.imagecolor.setRGB(0, 0, 0) # set supported CRSs decoder = crss.CRSsConfigReader(get_eoxserver_config()) crss_string = " ".join( map(lambda crs: "EPSG:%d" % crs, decoder.supported_crss_wms)) map_.setMetaData("ows_srs", crss_string) map_.setMetaData("wms_srs", crss_string) datasources = [] datasets = [] for layer_name in layers: layer = map_.getLayerByName(layer_name) if not layer: continue product = layer.metadata.get("wmm_product") filename = self.generate_filename("tif") ds = self.create_dataset(llbbox, time, elevation, size, product, filename) datasets.append(ds) if layer.type == ms.MS_LAYER_LINE: flavor = layer.metadata.get("wmm_flavor") contour_steps = self.get_contour_intervals( flavor, llbbox, size) filename = self.generate_filename("shp") self.generate_contours(ds, contour_steps, filename) layer.connectiontype = ms.MS_OGR layer.connection = filename layer.data, _ = splitext(basename(filename)) datasources.append(filename) ms_request = ms.create_request( (("service", "WMS"), ("version", "1.3.0"), ("request", "GetMap"), ("layers", ",".join(layers)), ("bbox", "%f,%f,%f,%f" % (bbox[1], bbox[0], bbox[3], bbox[2])), ("crs", crs), ("width", str(size[0])), ("height", str(size[1])), ("styles", ",".join(styles)), ("format", frmt))) raw_result = ms.dispatch(map_, ms_request) result = result_set_from_raw_data(raw_result) shp_drv = ogr.GetDriverByName("ESRI Shapefile") # cleanup datasources and datasets for filename in datasources: shp_drv.DeleteDataSource(filename) for ds in datasets: driver = ds.GetDriver() for filename in ds.GetFileList(): os.remove(filename) return result, get_content_type(result)