Esempio n. 1
0
    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
Esempio n. 2
0
    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
Esempio n. 3
0
    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], ....]
Esempio n. 4
0
    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
Esempio n. 5
0
    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
Esempio n. 6
0
    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