def __init__(self, params, bbox, region, tile_size, proj_srs, cap_file=None): """!Initialize data needed for iteration through tiles. """ self.version = params['wms_version'] self.srs_param = params['srs'] proj = params['proj_name'] + "=" + GetSRSParamVal(params['srs']) self.url = params['url'] + ("SERVICE=WMS&REQUEST=GetMap&VERSION=%s&LAYERS=%s&WIDTH=%s&HEIGHT=%s&STYLES=%s&TRANSPARENT=%s" % ( params['wms_version'], params['layers'], tile_size['cols'], tile_size['rows'], params['styles'], params['transparent'])) if params['bgcolor']: self.url += "&BGCOLOR=" + params['bgcolor'] self.url += "&" + proj + "&" + "FORMAT=" + params['format'] self.bbox = bbox self.proj_srs = proj_srs self.tile_rows = tile_size['rows'] self.tile_cols = tile_size['cols'] if params['urlparams'] != "": self.url += "&" + params['urlparams'] cols = int(region['cols']) rows = int(region['rows']) # computes parameters of tiles self.num_tiles_x = cols / self.tile_cols self.last_tile_x_size = cols % self.tile_cols self.tile_length_x = float( self.tile_cols) / float(cols) * (self.bbox['maxx'] - self.bbox['minx']) self.last_tile_x = False if self.last_tile_x_size != 0: self.last_tile_x = True self.num_tiles_x = self.num_tiles_x + 1 self.num_tiles_y = rows / self.tile_rows self.last_tile_y_size = rows % self.tile_rows self.tile_length_y = float( self.tile_rows) / float(rows) * (self.bbox['maxy'] - self.bbox['miny']) self.last_tile_y = False if self.last_tile_y_size != 0: self.last_tile_y = True self.num_tiles_y = self.num_tiles_y + 1 self.tile_bbox = dict(self.bbox) self.tile_bbox['maxx'] = self.bbox['minx'] + self.tile_length_x self.i_x = 0 self.i_y = 0 self.map_region = self.bbox self.map_region['cols'] = cols self.map_region['rows'] = rows
def _getQueryBbox(self, bbox, proj, srs_param, version): """!Creates query bbox (used in request URL) Mostly bbox is not modified but if WMS standard is 1.3.0 and projection is geographic, the bbox x and y are in most cases flipped. """ # CRS:84 and CRS:83 are exception (CRS:83 and CRS:27 need to be tested) if srs_param in [84, 83] or version != '1.3.0': return bbox elif Srs(GetSRSParamVal(srs_param)).axisorder == 'yx': return self._flipBbox(bbox) return bbox
def _getMatSets(self, root, layer_name, srs): """!Get matrix sets which are available for chosen layer and have required EPSG. """ contents = root.find(self.xml_ns.NsWmts('Contents')) layers = contents.findall(self.xml_ns.NsWmts('Layer')) ch_layer = None for layer in layers: layer_id = layer.find(self.xml_ns.NsOws('Identifier')).text if layer_id == layer_name: ch_layer = layer break if ch_layer is None: grass.fatal( _("Layer '%s' was not found in capabilities file") % layer_name) mat_set_links = ch_layer.findall( self.xml_ns.NsWmts('TileMatrixSetLink')) suitable_mat_sets = [] tileMatrixSets = contents.findall(self.xml_ns.NsWmts('TileMatrixSet')) for link in mat_set_links: mat_set_link_id = link.find( self.xml_ns.NsWmts('TileMatrixSet')).text for mat_set in tileMatrixSets: mat_set_id = mat_set.find(self.xml_ns.NsOws('Identifier')).text if mat_set_id != mat_set_link_id: continue mat_set_srs = self._getMatSetSrs(mat_set) if Srs(mat_set_srs).getcode() == (GetSRSParamVal(srs)).upper(): suitable_mat_sets.append([mat_set, link]) if not suitable_mat_sets: grass.fatal( _("Layer '%s' is not available with %s code.") % (layer_name, "EPSG:" + str(srs))) return suitable_mat_sets # [[TileMatrixSet, TileMatrixSetLink], ....]
def _createXML(self): """!Create XML for GDAL WMS driver @return path to XML file """ self._debug("_createXML", "started") gdal_wms = etree.Element("GDAL_WMS") service = etree.SubElement(gdal_wms, "Service") name = etree.Element("name") service.set("name", "WMS") version = etree.SubElement(service, "Version") version.text = self.params["wms_version"] server_url = etree.SubElement(service, "ServerUrl") server_url.text = self.params["url"] srs = etree.SubElement(service, self.params["proj_name"]) srs.text = GetSRSParamVal(self.params["srs"]) image_format = etree.SubElement(service, "ImageFormat") image_format.text = self.params["format"] image_format = etree.SubElement(service, "Transparent") image_format.text = self.params["transparent"] layers = etree.SubElement(service, "Layers") layers.text = self.params["layers"] styles = etree.SubElement(service, "Styles") styles.text = self.params["styles"] data_window = etree.SubElement(gdal_wms, "DataWindow") upper_left_x = etree.SubElement(data_window, "UpperLeftX") upper_left_x.text = str(self.bbox["minx"]) upper_left_y = etree.SubElement(data_window, "UpperLeftY") upper_left_y.text = str(self.bbox["maxy"]) lower_right_x = etree.SubElement(data_window, "LowerRightX") lower_right_x.text = str(self.bbox["maxx"]) lower_right_y = etree.SubElement(data_window, "LowerRightY") lower_right_y.text = str(self.bbox["miny"]) size_x = etree.SubElement(data_window, "SizeX") size_x.text = str(self.region["cols"]) size_y = etree.SubElement(data_window, "SizeY") size_y.text = str(self.region["rows"]) # RGB + alpha self.temp_map_bands_num = 4 block_size_x = etree.SubElement(gdal_wms, "BandsCount") block_size_x.text = str(self.temp_map_bands_num) block_size_x = etree.SubElement(gdal_wms, "BlockSizeX") block_size_x.text = str(self.tile_size["cols"]) block_size_y = etree.SubElement(gdal_wms, "BlockSizeY") block_size_y.text = str(self.tile_size["rows"]) if self.params["username"] and self.params["password"]: user_password = etree.SubElement(gdal_wms, "UserPwd") user_password.text = "%s:%s" % ( self.params["username"], self.params["password"], ) xml_file = self._tempfile() etree.ElementTree(gdal_wms).write(xml_file) self._debug("_createXML", "finished -> %s" % xml_file) return xml_file
def _createXML(self): """!Create XML for GDAL WMS driver @return path to XML file """ self._debug("_createXML", "started") gdal_wms = etree.Element("GDAL_WMS") service = etree.SubElement(gdal_wms, "Service") name = etree.Element("name") service.set("name", "WMS") version = etree.SubElement(service, "Version") version.text = self.params['wms_version'] server_url = etree.SubElement(service, "ServerUrl") server_url.text = self.params['url'] srs = etree.SubElement(service, self.params['proj_name']) srs.text = GetSRSParamVal(self.params['srs']) image_format = etree.SubElement(service, "ImageFormat") image_format.text = self.params['format'] image_format = etree.SubElement(service, "Transparent") image_format.text = self.params['transparent'] layers = etree.SubElement(service, "Layers") layers.text = self.params['layers'] styles = etree.SubElement(service, "Styles") styles.text = self.params['styles'] data_window = etree.SubElement(gdal_wms, "DataWindow") upper_left_x = etree.SubElement(data_window, "UpperLeftX") upper_left_x.text = str(self.bbox['minx']) upper_left_y = etree.SubElement(data_window, "UpperLeftY") upper_left_y.text = str(self.bbox['maxy']) lower_right_x = etree.SubElement(data_window, "LowerRightX") lower_right_x.text = str(self.bbox['maxx']) lower_right_y = etree.SubElement(data_window, "LowerRightY") lower_right_y.text = str(self.bbox['miny']) size_x = etree.SubElement(data_window, "SizeX") size_x.text = str(self.region['cols']) size_y = etree.SubElement(data_window, "SizeY") size_y.text = str(self.region['rows']) # RGB + alpha self.temp_map_bands_num = 4 block_size_x = etree.SubElement(gdal_wms, "BandsCount") block_size_x.text = str(self.temp_map_bands_num) block_size_x = etree.SubElement(gdal_wms, "BlockSizeX") block_size_x.text = str(self.tile_size['cols']) block_size_y = etree.SubElement(gdal_wms, "BlockSizeY") block_size_y.text = str(self.tile_size['rows']) xml_file = self._tempfile() etree.ElementTree(gdal_wms).write(xml_file) self._debug("_createXML", "finished -> %s" % xml_file) return xml_file
def __init__(self, params, bbox, region, tile_size, proj_srs, cap_file=None): """!Initialize data needed for iteration through tiles.""" self.version = params["wms_version"] self.srs_param = params["srs"] proj = params["proj_name"] + "=" + GetSRSParamVal(params["srs"]) self.url = params["url"] + ( "SERVICE=WMS&REQUEST=GetMap&VERSION=%s&LAYERS=%s&WIDTH=%s&HEIGHT=%s&STYLES=%s&TRANSPARENT=%s" % ( params["wms_version"], params["layers"], tile_size["cols"], tile_size["rows"], params["styles"], params["transparent"], )) if params["bgcolor"]: self.url += "&BGCOLOR=" + params["bgcolor"] self.url += "&" + proj + "&" + "FORMAT=" + params["format"] self.bbox = bbox self.proj_srs = proj_srs self.tile_rows = tile_size["rows"] self.tile_cols = tile_size["cols"] if params["urlparams"] != "": self.url += "&" + params["urlparams"] cols = int(region["cols"]) rows = int(region["rows"]) # computes parameters of tiles self.num_tiles_x = cols // self.tile_cols self.last_tile_x_size = cols % self.tile_cols self.tile_length_x = (float(self.tile_cols) / float(cols) * (self.bbox["maxx"] - self.bbox["minx"])) self.last_tile_x = False if self.last_tile_x_size != 0: self.last_tile_x = True self.num_tiles_x = self.num_tiles_x + 1 self.num_tiles_y = rows // self.tile_rows self.last_tile_y_size = rows % self.tile_rows self.tile_length_y = (float(self.tile_rows) / float(rows) * (self.bbox["maxy"] - self.bbox["miny"])) self.last_tile_y = False if self.last_tile_y_size != 0: self.last_tile_y = True self.num_tiles_y = self.num_tiles_y + 1 self.tile_bbox = dict(self.bbox) self.tile_bbox["maxx"] = self.bbox["minx"] + self.tile_length_x self.i_x = 0 self.i_y = 0 self.map_region = self.bbox self.map_region["cols"] = cols self.map_region["rows"] = rows