def test_stack_flatten(self): scenes = ( "landsat:LC08:PRE:TOAR:meta_LC80270312016188_v1", "landsat:LC08:PRE:TOAR:meta_LC80270312016188_v1", # note: just duplicated "landsat:LC08:PRE:TOAR:meta_LC80260322016197_v1", ) scenes, ctxs = zip(*[Scene.from_id(scene) for scene in scenes]) overlap = scenes[0].geometry.intersection(scenes[2].geometry) ctx = ctxs[0].assign(geometry=overlap, bounds="update", resolution=600) scenes = SceneCollection(scenes) unflattened = scenes.stack("nir", ctx) flattened, metas = scenes.stack("nir", ctx, flatten="properties.id", raster_info=True) assert len(flattened) == 2 assert len(metas) == 2 mosaic = scenes.mosaic("nir", ctx) allflat = scenes.stack("nir", ctx, flatten="properties.product") assert (mosaic == allflat).all() for i, scene in enumerate(scenes): scene.properties.foo = i noflat = scenes.stack("nir", ctx, flatten="properties.foo") assert len(noflat) == len(scenes) assert (noflat == unflattened).all()
def test_stack_serial(self): scenes = ("landsat:LC08:PRE:TOAR:meta_LC80270312016188_v1", "landsat:LC08:PRE:TOAR:meta_LC80260322016197_v1") scenes, ctxs = zip(*[Scene.from_id(scene) for scene in scenes]) overlap = scenes[0].geometry.intersection(scenes[1].geometry) ctx = ctxs[0].assign(geometry=overlap, bounds="update", resolution=600) scenes = SceneCollection(scenes) stack, metas = scenes.stack("nir", ctx, raster_info=True) self.assertEqual(stack.shape, (2, 1, 122, 120))
def test_stack(self): scenes = ( "landsat:LC08:PRE:TOAR:meta_LC80270312016188_v1", "landsat:LC08:PRE:TOAR:meta_LC80260322016197_v1", ) scenes, ctxs = zip(*[Scene.from_id(scene) for scene in scenes]) overlap = scenes[0].geometry.intersection(scenes[1].geometry) ctx = ctxs[0].assign(geometry=overlap, bounds="update", resolution=600) scenes = SceneCollection(scenes) stack, metas = scenes.stack("nir", ctx, raster_info=True) assert stack.shape == (2, 1, 122, 120) assert (stack.mask[:, 0, 2, 2]).all() assert len(metas) == 2 assert all(len(m["geoTransform"]) == 6 for m in metas) img_stack = scenes.stack("nir red", ctx, bands_axis=-1) assert img_stack.shape == (2, 122, 120, 2) # no_alpha = scenes.stack("nir", mask_alpha=False) # # assert raster not called with alpha once mocks exist no_mask = scenes.stack("nir", ctx, mask_alpha=False, mask_nodata=False) assert not hasattr(no_mask, "mask") assert no_mask.shape == (2, 1, 122, 120) with pytest.raises(NotImplementedError): scenes.stack("nir red", ctx, bands_axis=0) stack_axis_1 = scenes.stack("nir red", ctx, bands_axis=1) assert stack_axis_1.shape == (2, 2, 122, 120)
def test_stack(self): scenes = ("landsat:LC08:PRE:TOAR:meta_LC80270312016188_v1", "landsat:LC08:PRE:TOAR:meta_LC80260322016197_v1") scenes, ctxs = zip(*[Scene.from_id(scene) for scene in scenes]) overlap = scenes[0].geometry.intersection(scenes[1].geometry) ctx = ctxs[0].assign(geometry=overlap, bounds=overlap.bounds, resolution=600) scenes = SceneCollection(scenes) stack, metas = scenes.stack("nir", ctx, raster_info=True) self.assertEqual(stack.shape, (2, 1, 123, 121)) self.assertTrue((stack.mask[:, 0, 2, 2]).all()) self.assertEqual(len(metas), 2) self.assertTrue(all(len(m["geoTransform"]) == 6 for m in metas)) img_stack = scenes.stack("nir red", ctx, bands_axis=-1) self.assertEqual(img_stack.shape, (2, 123, 121, 2)) # no_alpha = scenes.stack("nir", mask_alpha=False) # # assert raster not called with alpha once mocks exist no_mask = scenes.stack("nir", ctx, mask_alpha=False, mask_nodata=False) self.assertFalse(hasattr(no_mask, "mask")) self.assertEqual(no_mask.shape, (2, 1, 123, 121)) with self.assertRaises(NotImplementedError): scenes.stack("nir red", ctx, bands_axis=0) stack_axis_1 = scenes.stack("nir red", ctx, bands_axis=1) self.assertEqual(stack_axis_1.shape, (2, 2, 123, 121))
def test_stack_scaling(self): scenes = ( "landsat:LC08:PRE:TOAR:meta_LC80270312016188_v1", "landsat:LC08:PRE:TOAR:meta_LC80260322016197_v1", ) scenes, ctxs = zip(*[Scene.from_id(scene) for scene in scenes]) overlap = scenes[0].geometry.intersection(scenes[1].geometry) ctx = ctxs[0].assign(geometry=overlap, bounds="update", resolution=600) scenes = SceneCollection(scenes) stack = scenes.stack("nir alpha", ctx, scaling="raw") assert stack.shape == (2, 2, 122, 120) assert stack.dtype == np.uint16 stack = scenes.stack("nir", ctx, scaling="raw") assert stack.shape == (2, 1, 122, 120) assert stack.dtype == np.uint16 stack = scenes.stack("nir", ctx, scaling=[None]) assert stack.shape == (2, 1, 122, 120) assert stack.dtype == np.uint16
def test_fails_with_different_dtypes(self): scenes = ("landsat:LC08:PRE:TOAR:meta_LC80270312016188_v1", "landsat:LC08:PRE:TOAR:meta_LC80260322016197_v1") scenes, ctxs = zip(*[Scene.from_id(scene) for scene in scenes]) overlap = scenes[0].geometry.intersection(scenes[1].geometry) ctx = ctxs[0].assign(geometry=overlap, bounds="update", resolution=600) scenes = SceneCollection(scenes) scenes[0].properties.bands.nir.dtype = "Byte" with self.assertRaises(ValueError): mosaic, meta = scenes.mosaic("nir", ctx) with self.assertRaises(ValueError): stack, meta = scenes.stack("nir", ctx)
def test_incompatible_dtypes(self): scenes = ( "landsat:LC08:PRE:TOAR:meta_LC80270312016188_v1", "landsat:LC08:PRE:TOAR:meta_LC80260322016197_v1", ) scenes, ctxs = zip(*[Scene.from_id(scene) for scene in scenes]) overlap = scenes[0].geometry.intersection(scenes[1].geometry) ctx = ctxs[0].assign(geometry=overlap, bounds="update", resolution=600) scenes = SceneCollection(scenes) scenes[0].properties.bands.nir.dtype = "Int16" mosaic = scenes.mosaic("nir", ctx) assert mosaic.dtype.type == np.int32 stack, meta = scenes.stack("nir", ctx) assert stack.dtype.type == np.int32