def __init__(self, source, nodata=None, lock: Optional[RLock] = None): self.source = source if nodata is None: nodata = self.source.ds.nodatavals[self.source.bidx - 1] self._nodata = num2numpy(nodata, source.dtype) self._lock = lock
def open(self) -> Iterator[GeoRasterReader]: """Context manager which returns a :class:`BandDataSource`""" activate_from_config() # check if settings changed and apply new lock = self._lock locked = False if lock is None else lock.acquire(blocking=True) try: _LOG.debug("opening %s", self.filename) with rasterio.DatasetReader(rasterio.path.parse_path( str(self.filename)), sharing=False) as src: override = False transform = src.transform if transform.is_identity: override = True transform = self.get_transform(src.shape) try: crs = _rasterio_crs(src) except ValueError: override = True crs = self.get_crs() bandnumber = self.get_bandnumber(src) band = rasterio.band(src, bandnumber) nodata = src.nodatavals[band.bidx - 1] if src.nodatavals[ band.bidx - 1] is not None else self.nodata nodata = num2numpy(nodata, band.dtype) if locked: locked = False lock.release() if override: warnings.warn( f"""Broken/missing geospatial data was found in file: "{self.filename}" Will use approximate metadata for backwards compatibility reasons (#673). This behaviour is deprecated. Future versions will raise an error.""", category=DeprecationWarning) yield OverrideBandDataSource(band, nodata=nodata, crs=crs, transform=transform, lock=lock) else: yield BandDataSource(band, nodata=nodata, lock=lock) except Exception as e: _LOG.error("Error opening source dataset: %s", self.filename) raise e finally: if locked: lock.release()
def __init__(self, source: rasterio.Band, nodata, crs: geometry.CRS, transform: Affine, lock: Optional[RLock] = None): self.source = source self._nodata = num2numpy(nodata, source.dtype) self._crs = crs self._transform = transform self._lock = lock
def open(self) -> Iterator[GeoRasterReader]: """Context manager which returns a :class:`BandDataSource`""" activate_from_config() # check if settings changed and apply new lock = self._lock locked = False if lock is None else lock.acquire(blocking=True) try: _LOG.debug("opening %s", self.filename) with rasterio.open(self.filename, sharing=False) as src: override = False transform = src.transform if transform.is_identity: override = True transform = self.get_transform(src.shape) try: crs = geometry.CRS(_rasterio_crs_wkt(src)) except ValueError: override = True crs = self.get_crs() # The [1.0a1-1.0a8] releases of rasterio had a bug that means it # cannot read multiband data into a numpy array during reprojection # We override it here to force the reading and reprojection into separate steps # TODO: Remove when we no longer care about those versions of rasterio bandnumber = self.get_bandnumber(src) band = rasterio.band(src, bandnumber) nodata = src.nodatavals[band.bidx - 1] if src.nodatavals[ band.bidx - 1] is not None else self.nodata nodata = num2numpy(nodata, band.dtype) if locked: locked = False lock.release() if override: yield OverrideBandDataSource(band, nodata=nodata, crs=crs, transform=transform, lock=lock) else: yield BandDataSource(band, nodata=nodata, lock=lock) except Exception as e: _LOG.error("Error opening source dataset: %s", self.filename) raise e finally: if locked: lock.release()
def __init__( self, dataset: xr.Dataset, var_name: str, no_data: Optional[float], ) -> None: """ Initialises the BandDataSource class. The BandDataSource class to read array slices out of the xr.Dataset. :param xr.Dataset dataset: The xr.Dataset :param str var_name: The variable name of the xr.DataArray :param float no_data: The no data value if known """ self.ds = dataset self._var_name = var_name self.da = dataset.data_vars[var_name] self._is_2d = len(self.da.dims) == 2 self._nbands = 1 if self._is_2d else self.da[self.da.dims[0]].size if self._nbands == 0: raise ValueError("Dataset has 0 bands.") # Set nodata value if "nodata" in self.da.attrs and self.da.nodata: if isinstance(self.da.nodata, list): self._nodata = self.da.nodata[0] else: self._nodata = self.da.nodata else: self._nodata = no_data if not self._nodata: raise ValueError("nodata not found in dataset and product definition") self._nodata = num2numpy(self._nodata, self.dtype)
def test_num2numpy(): assert num2numpy(None, 'int8') is None assert num2numpy(-1, 'int8').dtype == np.dtype('int8') assert num2numpy(-1, 'int8').dtype == np.int8(-1) assert num2numpy(-1, 'uint8') is None assert num2numpy(256, 'uint8') is None assert num2numpy(-1, 'uint16') is None assert num2numpy(-1, 'uint32') is None assert num2numpy(-1, 'uint8', ignore_range=True) == np.uint8(255) assert num2numpy(0, 'uint8') == 0 assert num2numpy(255, 'uint8') == 255 assert num2numpy(-128, 'int8') == -128 assert num2numpy(127, 'int8') == 127 assert num2numpy(128, 'int8') is None assert num2numpy(3.3, np.dtype('float32')).dtype == np.dtype('float32') assert num2numpy(3.3, np.float32).dtype == np.dtype('float32') assert num2numpy(3.3, np.float64).dtype == np.dtype('float64')
def __init__(self, source: rasterio.Band, nodata, crs: geometry.CRS, transform: Affine): self.source = source self._nodata = num2numpy(nodata, source.dtype) self._crs = crs self._transform = transform
def __init__(self, source, nodata=None): self.source = source if nodata is None: nodata = self.source.ds.nodatavals[self.source.bidx - 1] self._nodata = num2numpy(nodata, source.dtype)