def test_read_with_reproject(tmpdir): from datacube.testutils import mk_test_image from datacube.testutils.io import write_gtiff from pathlib import Path pp = Path(str(tmpdir)) xx = mk_test_image(128, 64, nodata=None) assert (xx != -999).all() tile = AlbersGS.tile_geobox((17, -40))[:64, :128] mm = write_gtiff(pp / 'tst-read-with-reproject-128x64-int16.tif', xx, crs=str(tile.crs), resolution=tile.resolution[::-1], offset=tile.transform * (0, 0), nodata=-999) assert mm.gbox == tile def _read(gbox, resampling='nearest', fallback_nodata=None, dst_nodata=-999): with RasterFileDataSource(mm.path, 1, nodata=fallback_nodata).open() as rdr: yy = np.full(gbox.shape, dst_nodata, dtype=rdr.dtype) roi = read_time_slice(rdr, yy, gbox, resampling, dst_nodata) return yy, roi gbox = gbx.pad(mm.gbox, 10) gbox = gbx.zoom_out(gbox, 0.873) yy, roi = _read(gbox) assert roi[0].start > 0 and roi[1].start > 0 assert (yy[0] == -999).all() yy_expect, _ = rio_slurp(mm.path, gbox) np.testing.assert_array_equal(yy, yy_expect) gbox = gbx.zoom_out(mm.gbox[3:-3, 10:-10], 2.1) yy, roi = _read(gbox) assert roi_shape(roi) == gbox.shape assert not (yy == -999).any() gbox = GeoBox.from_geopolygon(mm.gbox.extent.to_crs(epsg3857).buffer(50), resolution=mm.gbox.resolution) assert gbox.extent.contains(mm.gbox.extent.to_crs(epsg3857)) assert gbox.crs != mm.gbox.crs yy, roi = _read(gbox) assert roi[0].start > 0 and roi[1].start > 0 assert (yy[0] == -999).all() gbox = gbx.zoom_out(gbox, 4) yy, roi = _read(gbox, resampling='average') nvalid = (yy != -999).sum() nempty = (yy == -999).sum() assert nvalid > nempty
def test_compute_reproject_roi(): src = AlbersGS.tile_geobox((15, -40)) dst = geometry.GeoBox.from_geopolygon( src.extent.to_crs(epsg3857).buffer(10), resolution=src.resolution) rr = compute_reproject_roi(src, dst) assert rr.roi_src == np.s_[0:src.height, 0:src.width] assert 0 < rr.scale < 1 assert rr.is_st is False assert rr.transform.linear is None assert rr.scale in rr.scale2 # check pure translation case roi_ = np.s_[113:-100, 33:-10] rr = compute_reproject_roi(src, src[roi_]) assert rr.roi_src == roi_normalise(roi_, src.shape) assert rr.scale == 1 assert rr.is_st is True rr = compute_reproject_roi(src, src[roi_], padding=0, align=0) assert rr.roi_src == roi_normalise(roi_, src.shape) assert rr.scale == 1 assert rr.scale2 == (1, 1) # check pure translation case roi_ = np.s_[113:-100, 33:-10] rr = compute_reproject_roi(src, src[roi_], align=256) assert rr.roi_src == np.s_[0:src.height, 0:src.width] assert rr.scale == 1 roi_ = np.s_[113:-100, 33:-10] rr = compute_reproject_roi(src, src[roi_]) assert rr.scale == 1 assert roi_shape(rr.roi_src) == roi_shape(rr.roi_dst) assert roi_shape(rr.roi_dst) == src[roi_].shape
def test_roi_tools(): from datacube.utils.geometry import ( roi_is_empty, roi_is_full, roi_shape, roi_normalise, roi_boundary, roi_from_points, roi_center, roi_pad, roi_intersect, scaled_down_roi, scaled_up_roi, scaled_down_shape, ) from numpy import s_ assert roi_shape(s_[2:4, 3:4]) == (2, 1) assert roi_shape(s_[:4, :7]) == (4, 7) assert roi_is_empty(s_[:4, :5]) is False assert roi_is_empty(s_[1:1, :10]) is True assert roi_is_empty(s_[7:3, :10]) is True assert roi_is_empty(s_[:3]) is False assert roi_is_empty(s_[4:4]) is True assert roi_is_full(s_[:3], 3) is True assert roi_is_full(s_[:3, 0:4], (3, 4)) is True assert roi_is_full(s_[:, 0:4], (33, 4)) is True assert roi_is_full(s_[1:3, 0:4], (3, 4)) is False assert roi_is_full(s_[1:3, 0:4], (2, 4)) is False assert roi_is_full(s_[0:4, 0:4], (3, 4)) is False roi = s_[0:8, 0:4] roi_ = scaled_down_roi(roi, 2) assert roi_shape(roi_) == (4, 2) assert scaled_down_roi(scaled_up_roi(roi, 3), 3) == roi assert scaled_down_shape(roi_shape(roi), 2) == roi_shape(scaled_down_roi(roi, 2)) assert roi_shape(scaled_up_roi(roi, 10000, (40, 50))) == (40, 50) assert roi_normalise(s_[3:4], 40) == s_[3:4] assert roi_normalise(s_[:4], (40, )) == s_[0:4] assert roi_normalise(s_[:], (40, )) == s_[0:40] assert roi_normalise(s_[:-1], (3, )) == s_[0:2] assert roi_normalise(s_[-2:-1, :], (10, 20)) == s_[8:9, 0:20] assert roi_normalise(s_[-2:-1, :, 3:4], (10, 20, 100)) == s_[8:9, 0:20, 3:4] assert roi_center(s_[0:3]) == 1.5 assert roi_center(s_[0:2, 0:6]) == (1, 3) roi = s_[0:2, 4:13] xy = roi_boundary(roi) assert xy.shape == (4, 2) assert roi_from_points(xy, (2, 13)) == roi assert roi_intersect(roi, roi) == roi assert roi_intersect(s_[0:3], s_[1:7]) == s_[1:3] assert roi_intersect(s_[0:3], (s_[1:7], )) == s_[1:3] assert roi_intersect((s_[0:3], ), s_[1:7]) == (s_[1:3], ) assert roi_intersect(s_[4:7, 5:6], s_[0:1, 7:8]) == s_[4:4, 6:6] assert roi_pad(s_[0:4], 1, 4) == s_[0:4] assert roi_pad(s_[0:4, 1:5], 1, (4, 6)) == s_[0:4, 0:6] assert roi_pad(s_[2:3, 1:5], 10, (7, 9)) == s_[0:7, 0:9]