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
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
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
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
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