Source code for hydromt.data_catalog.uri_resolvers.raster_tindex_resolver

"""URIResolver for raster tindex files."""

from logging import Logger, getLogger
from os.path import abspath, dirname, join
from pathlib import Path
from typing import List, Optional, Union

import geopandas as gpd

from hydromt._typing import (
    NoDataStrategy,
    SourceMetadata,
    TimeRange,
    Zoom,
    exec_nodata_strat,
)
from hydromt.data_catalog.uri_resolvers.uri_resolver import URIResolver

logger: Logger = getLogger(__name__)


[docs] class RasterTindexResolver(URIResolver): """Implementation of the URIResolver for raster tindex files.""" name = "raster_tindex"
[docs] def resolve( self, uri: str, *, time_range: Optional[TimeRange] = None, zoom: Optional[Zoom] = None, mask: Optional[gpd.GeoDataFrame] = None, variables: Union[int, tuple[float, str], None] = None, metadata: Optional[SourceMetadata], handle_nodata: NoDataStrategy = NoDataStrategy.RAISE, ) -> List[str]: """Resolve URIs of a raster tindex file. Parameters ---------- uri : str Unique Resource Identifier time_range : Optional[TimeRange], optional left-inclusive start end time of the data, by default None mask : Optional[Geom], optional A geometry defining the area of interest, by default None zoom: Optional[Zoom], optional zoom_level of the dataset, by default None variables : Optional[List[str]], optional Names of variables to return, or all if None, by default None metadata: Optional[SourceMetadata], optional DataSource metadata. handle_nodata : NoDataStrategy, optional how to react when no data is found, by default NoDataStrategy.RAISE Returns ------- List[str] a list of expanded uris Raises ------ NoDataException when no data is found and `handle_nodata` is `NoDataStrategy.RAISE` """ if mask is None: raise ValueError(f"Resolver {self.name} needs a mask") gdf = gpd.read_file(uri) gdf = gdf.iloc[gdf.sindex.query(mask.to_crs(gdf.crs).union_all())] tileindex: Optional[str] = self.options.get("tileindex") if tileindex is None: raise ValueError( f"{self.__class__.__name__} needs options specifying 'tileindex'" ) if gdf.index.size == 0: exec_nodata_strat( f"resolver '{self.name}' found no intersecting tiles.", strategy=handle_nodata, ) return [] # in case of ignore elif tileindex not in gdf.columns: raise IOError( f'Tile index "{tileindex}" column missing in tile index file.' ) else: root = dirname(uri) paths = [] for p in gdf[tileindex]: path = Path(str(p)) if not path.is_absolute(): paths.append(str(Path(abspath(join(root, p))))) return paths