Write chunk array as GeoTIFFΒΆ

Or: How to safe a single layer chunk array as georeferenced raster with MultiRasterIO?

[4]:
import pandas as pd
from pathlib import Path
import rasterio

from eobox.raster import MultiRasterIO
from eobox import sampledata


year = 2008
dataset = sampledata.get_dataset("lsts")
layers_paths = [Path(p) for p in dataset["raster_files"]]
layers_df = pd.Series([p.stem for p in layers_paths]).str.split("_", expand=True) \
.rename({0: "sceneid", 1:"band"}, axis=1)

layers_df["date"] = pd.to_datetime(layers_df.sceneid.str[9:16], format="%Y%j")
layers_df["uname"] = layers_df.sceneid.str[:3] + "_" + layers_df.date.dt.strftime("%Y-%m-%d") + "_" + layers_df.band.str[::]
layers_df["path"] = layers_paths

layers_df = layers_df.sort_values(["date", "band"])
layers_df = layers_df.reset_index(drop=True)

df_layers = layers_df[(layers_df.date >= str(year)) & (layers_df.date < str(year+1))]
df_layers = df_layers.reset_index(drop=True)
df_layers.head()
[4]:
sceneid band date uname path
0 LT50350322008110PAC01 b3 2008-04-19 LT5_2008-04-19_b3 /home/ben/anaconda/envs/eocube/lib/python3.6/s...
1 LT50350322008110PAC01 b4 2008-04-19 LT5_2008-04-19_b4 /home/ben/anaconda/envs/eocube/lib/python3.6/s...
2 LT50350322008110PAC01 b5 2008-04-19 LT5_2008-04-19_b5 /home/ben/anaconda/envs/eocube/lib/python3.6/s...
3 LT50350322008110PAC01 fmask 2008-04-19 LT5_2008-04-19_fmask /home/ben/anaconda/envs/eocube/lib/python3.6/s...
4 LE70350322008118EDC00 b3 2008-04-27 LE7_2008-04-27_b3 /home/ben/anaconda/envs/eocube/lib/python3.6/s...
[11]:
mrio = MultiRasterIO(df_layers.path.values) \
    .windows_from_blocksize(2**5)
n_chunks = len(mrio.windows)
print("Number of chunks : ", n_chunks)

write_to_disk = False

with rasterio.open(mrio._get_template_for_given_resolution(mrio.dst_res, "path")) as src_layer:
    pass # later we need src_layer for src_layer.window_transform(win)

for ji in range(n_chunks):
    dst_path = f"./xxx_uncontrolled_99_chunk_ji{ji:02}.tif"
    chunk_arrays_ji = mrio.get_arrays(ji)
    chunk_layer_ji = chunk_arrays_ji[:,:,[0]]
    print("shape of chunk_layer_ji : ", chunk_layer_ji.shape)
    win = mrio.windows[ji]
    kwargs = mrio._get_template_for_given_resolution(
        res=mrio.dst_res, return_="meta").copy()
    kwargs.update({"height": win.height,
                   "width": win.width,
                   "transform": src_layer.window_transform(win)})
    kwargs["dtype"] = chunk_layer_ji.dtype
    with rasterio.open(dst_path, "w", **kwargs) as dst:
        dst.write(chunk_layer_ji[:,:,0], 1)
        print(f"Chunk written to path: {dst_path}")
Number of chunks :  4
shape of chunk_layer_ji :  (32, 32, 1)
Chunk written to path: ./xxx_uncontrolled_99_chunk_ji00.tif
shape of chunk_layer_ji :  (32, 29, 1)
Chunk written to path: ./xxx_uncontrolled_99_chunk_ji01.tif
shape of chunk_layer_ji :  (29, 32, 1)
Chunk written to path: ./xxx_uncontrolled_99_chunk_ji02.tif
shape of chunk_layer_ji :  (29, 29, 1)
Chunk written to path: ./xxx_uncontrolled_99_chunk_ji03.tif