terra icon indicating copy to clipboard operation
terra copied to clipboard

support for adding a dictionary of layer-specific metadata tags?

Open mikoontz-vp opened this issue 1 year ago • 3 comments

I'm following up on this StackOverflow answer (https://stackoverflow.com/questions/71367060/write-rasterstack-and-preserve-metadata-in-r) and the request to make a feature request here if this is functionality that we might find useful.

It's my understanding that python's rasterio can write arbitrary metadata to the layers of multiband raster as a dictionary when writing a GTIFF to disk. E.g., to include a "start_date" tag for each layer of a 6-band raster that each represents a new year, we might write:

# need input_raster_array and input_raster_profile
with rasterio.open(
    output_filename, "w", **(input_raster_profile)
) as dst:
    dst.write(input_raster_array)
    for index in range(0, 6):
        year = 2017 + index
        dst.update_tags(index + 1, **{'start_date': f"{year}-01-01"})

I know that we can now write band names on disk (which is great!) and I think the extra tagging functionality would also add to metadata management.

mikoontz-vp avatar Mar 22 '23 20:03 mikoontz-vp

I've figured out a workaround to use the {reticulate} interface to Python's {rasterio} package. The following will add a tag called start_date to the first band of the raster in the local file "my_file.tif":

# reticulate::py_install("rasterio")
rasterio = reticulate::import("rasterio")
src = rasterio$open("my_file.tif", mode = "r+")

src$update_tags(1, start_date="2019-01-01")

# Tags will be written when the file is closed for writing
src$close()

# Make sure it works
print(src$tags(1))

# Use {terra} to confirm it works
terra::meta("my_file.tif", layers = TRUE)

mikoontz-vp avatar Nov 13 '23 23:11 mikoontz-vp

file level tags can now be set with metags<- but I need to expand that to layer level tags.

rhijmans avatar Nov 14 '23 04:11 rhijmans

Awesome, thanks @rhijmans!

mikoontz-vp avatar Nov 14 '23 15:11 mikoontz-vp