def run(self): ndv = NDV nbar = self.tile.datasets[DatasetType.ARG25] _log.info("Processing tile [%s]", nbar.path) # Apply PQA if specified pqa = None if self.mask_pqa_apply and DatasetType.PQ25 in self.tile.datasets: pqa = self.tile.datasets[DatasetType.PQ25] mask = None log_mem("Before get PQA mask") if pqa: mask = get_mask_pqa(pqa, self.mask_pqa_mask) data = get_dataset_data_masked(nbar, mask=mask, ndv=ndv) log_mem("After get data (masked)") metadata = get_dataset_metadata(nbar) data = calculate_tassel_cap_index(data, coefficients=TCI_COEFFICIENTS[nbar.satellite][TasselCapIndex.WETNESS]) raster_create(self.output().path, [data], metadata.transform, metadata.projection, numpy.nan, gdal.GDT_Float32)
def create_water_tile(self, tile): arg = tile.datasets[DatasetType.ARG25] pqa = tile.datasets[DatasetType.PQ25] _log.info("ARG tile [%s]", arg) _log.info("PQ tile [%s]", pqa) filename = os.path.basename(arg.path) filename = filename.replace("NBAR", "WETNESS") filename = filename.replace(".vrt", ".tif") filename = os.path.join(self.output_directory, filename) metadata = get_dataset_metadata(arg) data = get_dataset_data_with_pq(arg, Ls57Arg25Bands, pqa) # Calculate TCI Wetness tci = calculate_tassel_cap_index(data, coefficients=TCI_COEFFICIENTS[arg.satellite][TasselCapIndex.WETNESS]) _log.info("TCI shape is %s | min = %s | max = %s", numpy.shape(tci), tci.min(), tci.max()) raster_create(filename, [tci], metadata.transform, metadata.projection, numpy.nan, gdal.GDT_Float32)
def classifier(arg25_dataset, pq25_dataset): """ Runs the classifier designed by SF. """ # Get the metadata md = get_dataset_metadata(arg25_dataset) cols, rows = md.shape # Read the data and mask pixels via the PQ dataset data = get_dataset_data_with_pq(arg25_dataset, pq25_dataset) # Get the wetness coefficients and calculate coef = TCI_COEFFICIENTS[arg25_dataset.satellite][TasselCapIndex.WETNESS] wetness = calculate_tassel_cap_index(data, coef) # NDVI ndvi = calculate_ndvi(data[arg25_dataset.bands.RED], data[arg25_dataset.bands.NEAR_INFRARED], output_ndv=numpy.nan) # Dump the reflectance data, the classifier only needs tc_wetness and ndvi del data # Allocate the result classified = numpy.zeros((rows, cols), dtype='uint8') # Water r1 = wetness > 0 classified[r1] = 1 _tmp = ~r1 #r2 = _tmp & ((wetness >= -250) & (wetness < 0)) r2 = (wetness >= -250) & (wetness < 0) r3 = ndvi <= 0.3 #_tmp2 = _tmp & r2 & ~r3 _tmp2 = _tmp & r2 # non-veg classified[_tmp2 & r3] = 2 _tmp3 = _tmp2 & ~r3 r4 = ndvi <= 0.45 # saltmarsh classified[_tmp3 & r4] = 3 _tmp2 = _tmp3 & ~r4 r5 = ndvi <= 0.6 # mangrove/saltmarsh classified[_tmp2 & r5] = 4 # mangrove classified[_tmp2 & ~r5] = 5 # finished rhs of r2 _tmp2 = _tmp & ~r2 r6 = wetness < -750 r7 = ndvi >= 0.3 _tmp3 = _tmp2 & r6 # saltmarsh classified[_tmp3 & r7] = 3 # non-veg classified[_tmp3 & ~r7] = 2 r8 = ndvi <= 0.3 _tmp3 = _tmp2 & ~r6 # non-veg classified[_tmp3 & r8] = 2 r9 = ndvi <= 0.45 _tmp2 = _tmp3 & ~r8 # saltmarsh classified[_tmp2 & r9] = 3 r10 = ndvi <= 0.6 _tmp3 = _tmp2 & ~r9 # mangrove-saltmarsh classified[_tmp3 & r10] = 4 # mangrove classified[_tmp3 & ~r10] = 5 # set any nulls valid = numpy.isfinite(ndvi) classified[~valid] = 0 return classified
def classifier(arg25_dataset, pq25_dataset): """ Runs the classifier designed by SF. """ # Get the metadata md = get_dataset_metadata(arg25_dataset) cols, rows = md.shape # Read the data and mask pixels via the PQ dataset data = get_dataset_data_with_pq(arg25_dataset, pq25_dataset) # Get the wetness coefficients and calculate coef = TCI_COEFFICIENTS[arg25_dataset.satellite][TasselCapIndex.WETNESS] wetness = calculate_tassel_cap_index(data, coef) # NDVI ndvi = calculate_ndvi(data[arg25_dataset.bands.RED], data[arg25_dataset.bands.NEAR_INFRARED], output_ndv=numpy.nan) # Dump the reflectance data, the classifier only needs tc_wetness and ndvi del data # Allocate the result classified = numpy.zeros((rows,cols), dtype='uint8') # Water r1 = wetness > 0 classified[r1] = 1 _tmp = ~r1 #r2 = _tmp & ((wetness >= -250) & (wetness < 0)) r2 = (wetness >= -250) & (wetness < 0) r3 = ndvi <= 0.3 #_tmp2 = _tmp & r2 & ~r3 _tmp2 = _tmp & r2 # non-veg classified[_tmp2 & r3] = 2 _tmp3 = _tmp2 & ~r3 r4 = ndvi <= 0.45 # saltmarsh classified[_tmp3 & r4] = 3 _tmp2 = _tmp3 & ~r4 r5 = ndvi <= 0.6 # mangrove/saltmarsh classified[_tmp2 & r5] = 4 # mangrove classified[_tmp2 & ~r5] = 5 # finished rhs of r2 _tmp2 = _tmp & ~r2 r6 = wetness < -750 r7 = ndvi >= 0.3 _tmp3 = _tmp2 & r6 # saltmarsh classified[_tmp3 & r7] = 3 # non-veg classified[_tmp3 & ~r7] = 2 r8 = ndvi <= 0.3 _tmp3 = _tmp2 & ~r6 # non-veg classified[_tmp3 & r8] = 2 r9 = ndvi <= 0.45 _tmp2 = _tmp3 & ~r8 # saltmarsh classified[_tmp2 & r9] = 3 r10 = ndvi <= 0.6 _tmp3 = _tmp2 & ~r9 # mangrove-saltmarsh classified[_tmp3 & r10] = 4 # mangrove classified[_tmp3 & ~r10] = 5 # set any nulls valid = numpy.isfinite(ndvi) classified[~valid] = 0 return classified