def create_mosaic(dataset_in, clean_mask=None, no_data=-9999, dtype=None, intermediate_product=None, **kwargs): """ Creates a most-recent-to-oldest mosaic of the input dataset. Parameters ---------- dataset_in: xarray.Dataset A dataset retrieved from the Data Cube; should contain: coordinates: time, latitude, longitude variables: variables to be mosaicked (e.g. red, green, and blue bands) clean_mask: np.ndarray An ndarray of the same shape as `dataset_in` - specifying which values to mask out. If no clean mask is specified, then all values are kept during compositing. no_data: int or float The no data value. dtype: str or numpy.dtype A string denoting a Python datatype name (e.g. int, float) or a NumPy dtype (e.g. np.int16, np.float32) to convert the data to. Returns ------- dataset_out: xarray.Dataset Compositited data with the format: coordinates: latitude, longitude variables: same as dataset_in """ dataset_in = dataset_in.copy(deep=True) # Default to masking nothing. if clean_mask is None: clean_mask = create_default_clean_mask(dataset_in) # Mask data with clean_mask. All values where clean_mask==False are set to no_data. for key in list(dataset_in.data_vars): dataset_in[key].values[np.invert(clean_mask)] = no_data dataset_in_dtypes = None if dtype is None: # Save dtypes because masking with Dataset.where() converts to float64. band_list = list(dataset_in.data_vars) dataset_in_dtypes = {} for band in band_list: dataset_in_dtypes[band] = dataset_in[band].dtype if intermediate_product is not None: dataset_out = intermediate_product.copy(deep=True) else: dataset_out = None time_slices = reversed(range(len( dataset_in.time))) if 'reverse_time' in kwargs else range( len(dataset_in.time)) for index in time_slices: dataset_slice = dataset_in.isel(time=index).drop('time') if dataset_out is None: dataset_out = dataset_slice.copy(deep=True) utilities.clear_attrs(dataset_out) else: for key in list(dataset_in.data_vars): dataset_out[key].values[dataset_out[key].values == -9999] = dataset_slice[key].values[ dataset_out[key].values == -9999] dataset_out[key].attrs = OrderedDict() # Handle datatype conversions. dataset_out = restore_or_convert_dtypes(dtype, band_list, dataset_in_dtypes, dataset_out, no_data) return dataset_out
def create_min_ndvi_mosaic(dataset_in, clean_mask=None, no_data=-9999, dtype=None, intermediate_product=None, **kwargs): """ Method for calculating the pixel value for the min ndvi value. Parameters ---------- dataset_in: xarray.Dataset A dataset retrieved from the Data Cube; should contain: coordinates: time, latitude, longitude variables: variables to be mosaicked (e.g. red, green, and blue bands) clean_mask: np.ndarray An ndarray of the same shape as `dataset_in` - specifying which values to mask out. If no clean mask is specified, then all values are kept during compositing. no_data: int or float The no data value. dtype: str or numpy.dtype A string denoting a Python datatype name (e.g. int, float) or a NumPy dtype (e.g. np.int16, np.float32) to convert the data to. Returns ------- dataset_out: xarray.Dataset Compositited data with the format: coordinates: latitude, longitude variables: same as dataset_in """ dataset_in = dataset_in.copy(deep=True) # Default to masking nothing. if clean_mask is None: clean_mask = create_default_clean_mask(dataset_in) dataset_in_dtypes = None if dtype is None: # Save dtypes because masking with Dataset.where() converts to float64. band_list = list(dataset_in.data_vars) dataset_in_dtypes = {} for band in band_list: dataset_in_dtypes[band] = dataset_in[band].dtype # Mask out clouds and scan lines. dataset_in = dataset_in.where((dataset_in != -9999) & clean_mask) if intermediate_product is not None: dataset_out = intermediate_product.copy(deep=True) else: dataset_out = None time_slices = range(len(dataset_in.time)) for timeslice in time_slices: dataset_slice = dataset_in.isel(time=timeslice).drop('time') ndvi = (dataset_slice.nir - dataset_slice.red) / (dataset_slice.nir + dataset_slice.red) ndvi.values[np.invert(clean_mask)[timeslice, ::]] = 1000000000 dataset_slice['ndvi'] = ndvi if dataset_out is None: dataset_out = dataset_slice.copy(deep=True) utilities.clear_attrs(dataset_out) else: for key in list(dataset_slice.data_vars): dataset_out[key].values[ dataset_slice.ndvi.values < dataset_out.ndvi.values] = dataset_slice[key].values[ dataset_slice.ndvi.values < dataset_out.ndvi.values] # Handle datatype conversions. dataset_out = restore_or_convert_dtypes(dtype, None, dataset_in_dtypes, dataset_out, no_data) return dataset_out