Пример #1
0
    def find_layers(self, root) -> List[str]:
        """
        :param root: Name of layer to find
        :return: XML 'Layer' Element, or None if not found
        """

        content_meta = root.find(".//contentmetadata")
        if content_meta is None:
            raise UnsupportedFormatError()

        # Get names of available coverages
        coverage_offers = content_meta.findall("coverageofferingbrief")

        cover_names = [(c, c.find("name")) for c in coverage_offers]
        if not cover_names:  # No coverages are offered
            raise MissingLayerError(f"WCS Layer {self.layer} not found because no coverages were found")

        coverages = None
        try:
            coverages = self.config.get("service", dict()).get("coverages")
            coverages = coverages.split(",") if coverages else None
            coverages = list(map(str.lower, coverages)) if coverages else None
        except AttributeError:
            logger.error("Unable to get coverages from WCS provider configuration.")

        if coverages:
            covers = [c for c, n in cover_names if n is not None and n.text in coverages]
        else:
            covers = [c for c, n in cover_names if n is not None and self.layer == n.text]

        if not covers:  # Requested coverage is not offered
            raise MissingLayerError("Unable to find requested WCS layer")

        return covers
Пример #2
0
    def find_layers(self, root):
        """
        :param root: Name of layer to find
        :return: XML 'Layer' Element, or None if not found
        """
        contents = root.find(".//contents")
        if contents is None:
            raise UnsupportedFormatError()

        # Flatten nested layers to single list
        layers = contents.findall("layer")
        sublayers = layers
        while sublayers:
            sublayers = [
                layer for layer in sublayers
                for layer in layer.findall("layer")
            ]
            layers.extend(sublayers)

        # Get layer names
        layer_names = [(layer, layer.find("identifier")) for layer in layers]
        logger.debug("WMTS layers offered: {}".format(
            [name.text for layer, name in layer_names if name is not None]))

        requested_layer = self.get_layer_name()
        layers = [
            layer for layer, name in layer_names
            if name is not None and requested_layer == name.text
        ]
        if not layers:
            raise MissingLayerError(
                "Unable to find WMTS layer in layer names list")

        return layers
Пример #3
0
    def find_layers(self, root):
        """
        :param root: Name of layer to find
        :return: XML 'Layer' Element, or None if not found
        """
        feature_type_list = root.find(".//featuretypelist")
        if feature_type_list is None:
            raise UnsupportedFormatError()

        feature_types = feature_type_list.findall("featuretype")

        # Get layer names
        feature_names = [(ft, ft.find("name")) for ft in feature_types]
        logger.debug("WFS layers offered: {}".format(
            [name.text for feature, name in feature_names if name]))
        features = [
            feature for feature, name in feature_names
            if name is not None and self.layer == name.text
        ]

        if not features:
            raise MissingLayerError(
                f"Unable to find {self.layer} in offered WFS layers: "
                f"{[name.text for feature, name in feature_names if name]}")

        return features
Пример #4
0
    def get_layer_name(self) -> str:

        try:
            layer_name = (
                self.config.get("sources", {})
                .get("default", {})
                .get("req", {})
                .get("layers")  # TODO: Can there be more than one layer name in the WMS/WMTS config?
            )
        except AttributeError:
            logger.error("Unable to get layer name from provider configuration.")
            raise ServiceError()

        if layer_name is None:
            raise MissingLayerError("Unable to find WMTS layer, no layer name found in config")

        layer_name = layer_name.lower()
        return layer_name
Пример #5
0
    def find_layers(self, root):
        """
        :param root: Name of layer to find
        :return: XML 'Layer' Element, or None if not found
        """
        capability = root.find(".//capability")
        if capability is None:
            raise UnsupportedFormatError()

        # Flatten nested layers to single list
        layers = capability.findall("layer")
        sublayers = layers
        while len(sublayers) > 0:
            sublayers = [
                layer for layer in sublayers
                for layer in layer.findall("layer")
            ]
            layers.extend(sublayers)

        # Get layer names
        layer_names = [(layer, layer.find("name")) for layer in layers]
        logger.debug("WMS layers offered: {}".format(
            [name.text for layer, name in layer_names if name]))

        requested_layer = self.get_layer_name()
        layers = [
            layer for layer, name in layer_names
            if name is not None and requested_layer == name.text
        ]

        # TODO: Verify this fix is correct
        if not layers:
            raise MissingLayerError(
                f"Unable to find requested WMS layer '{requested_layer}'"
                f" in layer list: {' '.join(str(ln.text) for ln, _ in layer_names)}"
            )

        return layers