def test_export2tiff_data_band_tuple_time_tuple(self): data = np.arange(10 * 3 * 2 * 6, dtype=float).reshape(10, 3, 2, 6) bands = (1, 4) times = (2, 8) bands_selection = np.arange(bands[0], bands[1] + 1) times_selection = np.arange(times[0], times[1] + 1) subset = data[times_selection][..., bands_selection].squeeze() eop = EOPatch.load(self.PATCH_FILENAME) eop.data['data'] = data with tempfile.TemporaryDirectory() as tmp_dir_name: tmp_file_name = 'temp_file.tiff' task = ExportToTiff((FeatureType.DATA, 'data'), folder=tmp_dir_name, band_indices=bands, date_indices=times, image_dtype=data.dtype) task.execute(eop, filename=tmp_file_name) # split times and bands in raster and mimic the initial shape raster = read_data(os.path.join(tmp_dir_name, tmp_file_name)) raster = raster.reshape(raster.shape[0], raster.shape[1], len(times_selection), len(bands_selection)) raster = np.moveaxis(raster, -2, 0) self.assertTrue(np.all(subset == raster))
def test_export2tiff_order(self): data = np.arange(10 * 3 * 2 * 6, dtype=float).reshape(10, 3, 2, 6) bands = [2, 3, 0] times = [1, 7] # create ordered subset ordered_subset = [] for t in times: for b in bands: ordered_subset.append(data[t][..., b]) ordered_subset = np.array(ordered_subset) ordered_subset = np.moveaxis(ordered_subset, 0, -1) eop = EOPatch.load(self.PATCH_FILENAME) eop.data['data'] = data with tempfile.TemporaryDirectory() as tmp_dir_name: tmp_file_name = 'temp_file.tiff' task = ExportToTiff((FeatureType.DATA, 'data'), folder=tmp_dir_name, band_indices=bands, date_indices=times, image_dtype=data.dtype) task.execute(eop, filename=tmp_file_name) raster = read_data(os.path.join(tmp_dir_name, tmp_file_name)) self.assertTrue(np.all(ordered_subset == raster))
def setUpClass(cls): geojson = read_data(os.path.join(cls.INPUT_FOLDER, 'cies_islands.json')) cls.area = shape(geojson) cls.test_cases = [ cls.SplitterTestCase('BBoxSplitter', BBoxSplitter([cls.area], CRS.WGS84, 5, reduce_bbox_sizes=True), bbox_len=19), cls.SplitterTestCase('OsmSplitter', OsmSplitter([cls.area], CRS.WGS84, 15, reduce_bbox_sizes=True), bbox_len=24), cls.SplitterTestCase('TileSplitter', TileSplitter( [cls.area], CRS.WGS84, ('2017-10-01', '2018-03-01'), tile_split_shape=40, data_source=DataSource.SENTINEL2_L1C, instance_id=cls.INSTANCE_ID, reduce_bbox_sizes=True), bbox_len=13) ]
def test_export2tiff_mask_tuple_string(self): eop = EOPatch.load(self.PATCH_FILENAME) dates = np.array(eop.timestamp) mask = np.arange(len(dates) * 3 * 2 * 1).reshape(len(dates), 3, 2, 1) eop.mask['mask'] = mask indices = [2, 4] # day time gets floored times = (datetime_to_iso(dates[indices[0]]), datetime_to_iso(dates[indices[1]])) selection = np.nonzero( np.where((dates >= iso_to_datetime(times[0])) & (dates <= iso_to_datetime(times[1])), dates, 0)) subset = mask[selection].squeeze() with tempfile.TemporaryDirectory() as tmp_dir_name: tmp_file_name = 'temp_file.tiff' task = ExportToTiff((FeatureType.MASK, 'mask'), folder=tmp_dir_name, date_indices=times) task.execute(eop, filename=tmp_file_name) # rasterio saves `bands` to the last dimension, move it up front raster = read_data(os.path.join(tmp_dir_name, tmp_file_name)) raster = np.moveaxis(raster, -1, 0) self.assertTrue(np.all(subset == raster))
def test_img_read(self): W, H = 2048, 2048 formats = [('tif', 13577.49), ('jpg', 52.41), ('png', 52.34), ('jp2', 47.09)] for ext, exp_mean in formats: with self.subTest(msg=ext): filename = os.path.join(self.INPUT_FOLDER, 'ml.{}'.format(ext)) img = read_data(filename) self.assertEqual(np.shape(img), (W, H, 3) if ext != 'jp2' else (343, 343, 3), "{} image dimension mismatch".format(ext)) self.assertAlmostEqual(np.mean(img), exp_mean, delta=1e-1, msg="{} image has incorrect values".format(ext)) new_filename = os.path.join(self.OUTPUT_FOLDER, os.path.split(filename)[-1]) write_data(new_filename, img) new_img = read_data(new_filename) if ext != 'jpg': self.assertTrue(np.array_equal(img, new_img), msg="Original and new image are not the same")
def test_img_read(self): W, H = 2048, 2048 exts = frozenset(['tif', 'jpg', 'png']) for ext in exts: with self.subTest(msg=ext): filepath = '{}/ml.{}'.format(self.INPUT_FOLDER, ext) img = read_data(filepath) w, h, d = np.shape(img) self.assertEqual(w, W, "Width mismatch") self.assertEqual(h, H, "Height mismatch") self.assertEqual(d, 3, "Expected RGB")
def test_export2tiff_mask_timeless(self): mask_timeless = np.arange(3 * 3 * 1).reshape(3, 3, 1) subset = mask_timeless.squeeze() eop = EOPatch.load(self.PATCH_FILENAME) eop.mask_timeless['mask_timeless'] = mask_timeless with tempfile.TemporaryDirectory() as tmp_dir_name: tmp_file_name = 'temp_file.tiff' task = ExportToTiff((FeatureType.MASK_TIMELESS, 'mask_timeless'), folder=tmp_dir_name) task.execute(eop, filename=tmp_file_name) raster = read_data(os.path.join(tmp_dir_name, tmp_file_name)) self.assertTrue(np.all(subset == raster))
def test_img_read(self): W, H = 2048, 2048 formats = [('tif', 13577.49), ('jpg', 52.41), ('png', 52.34), ('jp2', 47.09)] for ext, exp_mean in formats: with self.subTest(msg=ext): filepath = '{}/ml.{}'.format(self.INPUT_FOLDER, ext) img = read_data(filepath) self.assertEqual(np.shape(img), (W, H, 3) if ext != 'jp2' else (343, 343, 3), "{} image dimension mismatch".format(ext)) self.assertAlmostEqual( np.mean(img), exp_mean, delta=1e-1, msg="{} image has incorrect values".format(ext))
def test_export2tiff_mask_single(self): mask = np.arange(5 * 3 * 3 * 1).reshape(5, 3, 3, 1) times = [4] subset = mask[times].squeeze() eop = EOPatch.load(self.PATCH_FILENAME) eop.mask['mask'] = mask with tempfile.TemporaryDirectory() as tmp_dir_name: tmp_file_name = 'temp_file.tiff' task = ExportToTiff((FeatureType.MASK, 'mask'), folder=tmp_dir_name, date_indices=times) task.execute(eop, filename=tmp_file_name) raster = read_data(os.path.join(tmp_dir_name, tmp_file_name)) self.assertTrue(np.all(subset == raster))
def test_export2tiff_scalar_timeless_list(self): scalar_timeless = np.arange(5) bands = [3, 0, 2] subset = scalar_timeless[bands] eop = EOPatch.load(self.PATCH_FILENAME) eop.scalar_timeless['scalar_timeless'] = scalar_timeless with tempfile.TemporaryDirectory() as tmp_dir_name: tmp_file_name = 'temp_file.tiff' task = ExportToTiff( (FeatureType.SCALAR_TIMELESS, 'scalar_timeless'), folder=tmp_dir_name, band_indices=bands) task.execute(eop, filename=tmp_file_name) raster = read_data(os.path.join(tmp_dir_name, tmp_file_name)) self.assertTrue(np.all(subset == raster))
def test_export2tiff_data_timeless_band_list(self): data_timeless = np.arange(3 * 2 * 5, dtype=float).reshape(3, 2, 5) bands = [2, 4, 1, 0] subset = data_timeless[..., bands].squeeze() eop = EOPatch.load(self.PATCH_FILENAME) eop.data_timeless['data_timeless'] = data_timeless with tempfile.TemporaryDirectory() as tmp_dir_name: tmp_file_name = 'temp_file.tiff' task = ExportToTiff((FeatureType.DATA_TIMELESS, 'data_timeless'), folder=tmp_dir_name, band_indices=bands, image_dtype=data_timeless.dtype) task.execute(eop, filename=tmp_file_name) raster = read_data(os.path.join(tmp_dir_name, tmp_file_name)) self.assertTrue(np.all(subset == raster))
def test_export2tiff_mask_list(self): mask = np.arange(5 * 3 * 2 * 1).reshape(5, 3, 2, 1) times = [4, 2] subset = mask[times].squeeze() eop = EOPatch.load(self.PATCH_FILENAME) eop.mask['mask'] = mask with tempfile.TemporaryDirectory() as tmp_dir_name: tmp_file_name = 'temp_file.tiff' task = ExportToTiff((FeatureType.MASK, 'mask'), folder=tmp_dir_name, date_indices=times) task.execute(eop, filename=tmp_file_name) # rasterio saves `bands` to the last dimension, move it up front raster = read_data(os.path.join(tmp_dir_name, tmp_file_name)) raster = np.moveaxis(raster, -1, 0) self.assertTrue(np.all(subset == raster))
def test_export2tiff_scalar_band_single_time_single(self): scalar = np.arange(10 * 6, dtype=float).reshape(10, 6) bands = [3] times = [7] subset = scalar[times][..., bands].squeeze() eop = EOPatch.load(self.PATCH_FILENAME) eop.scalar['scalar'] = scalar with tempfile.TemporaryDirectory() as tmp_dir_name: tmp_file_name = 'temp_file.tiff' task = ExportToTiff((FeatureType.SCALAR, 'scalar'), folder=tmp_dir_name, band_indices=bands, date_indices=times, image_dtype=scalar.dtype) task.execute(eop, filename=tmp_file_name) raster = read_data(os.path.join(tmp_dir_name, tmp_file_name)) self.assertTrue(np.all(subset == raster))
def load_truth(self): return [tuple(item) for item in read_data(self.get_filename())]