xr.Dataset: A merged xarray Dataset containing two data masks:
- 'valid_data_mask': A mask indicating valid (1) and no data (0).
- 'quality_data_mask': A mask indicating high quality (1) and low quality (0).
Source code in darts-acquisition/src/darts_acquisition/planet.py
@stopuhr.funkuhr("Loading Planet masks",printer=logger.debug,print_kwargs=True)defload_planet_masks(fpath:str|Path)->xr.Dataset:"""Load the valid and quality data masks from a Planet scene. Args: fpath (str | Path): The file path to the Planet scene from which to derive the masks. Raises: FileNotFoundError: If no matching UDM-2 TIFF file is found in the specified path. Returns: xr.Dataset: A merged xarray Dataset containing two data masks: - 'valid_data_mask': A mask indicating valid (1) and no data (0). - 'quality_data_mask': A mask indicating high quality (1) and low quality (0). """# Convert to Path object if a string is providedfpath=fpathifisinstance(fpath,Path)elsePath(fpath)logger.debug(f"Loading data masks from {fpath.resolve()}")# Get imagepathudm_path=next(fpath.glob("*_udm2.tif"),None)ifnotudm_path:udm_path=next(fpath.glob("*_udm2_clip.tif"),None)ifnotudm_path:raiseFileNotFoundError(f"No matching UDM-2 TIFF files found in {fpath.resolve()} (.glob('*_udm2.tif'))")# See udm classes here: https://developers.planet.com/docs/data/udm-2/da_udm=xr.open_dataarray(udm_path)invalids=da_udm.sel(band=8).fillna(0)!=0low_quality=da_udm.sel(band=[2,3,4,5,6]).max(axis=0)==1high_quality=~low_quality&~invalidsqa_ds=xr.Dataset(coords={c:da_udm.coords[c]forcinda_udm.coords})qa_ds["quality_data_mask"]=(xr.zeros_like(da_udm.sel(band=8)).where(invalids,0).where(low_quality,1).where(high_quality,2))qa_ds["quality_data_mask"].attrs={"data_source":"planet","long_name":"Quality data mask","description":"0 = Invalid, 1 = Low Quality, 2 = High Quality",}returnqa_ds