Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
mikoontz-vp opened this issue Mar 22, 2023 · 4 comments
Closed

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

mikoontz-vp opened this issue Mar 22, 2023 · 4 comments

Comments

@mikoontz-vp
Copy link

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
Copy link
Author

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)

@rhijmans
Copy link
Member

rhijmans commented Nov 14, 2023

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

@rhijmans rhijmans reopened this Nov 14, 2023
@mikoontz-vp
Copy link
Author

Awesome, thanks @rhijmans!

@rhijmans
Copy link
Member

I took me a while, but with e069502 it is now possible to add user defined layer specific tags and write/read them to/from GTiff. Note that "time" variables are handled automatically so that they are recognized and recovered as such.

library(terra)
#terra 1.8.2

r <- rast(ncol=5, nrow=5, nlyr=2, vals=1)
m <- cbind(c("one", "two", "three"), c("ABC", "123", "hello"))
metags(r) <- m
metags(r, layer=1) <- c(another_tag="44", `one more`="that value")
metags(r, layer=2) <- c(another_tag="55")

x <- writeRaster(r, "test.tif", overwrite=TRUE)
metags(x)
#    one   three     two 
#  "ABC" "hello"   "123" 
metags(x, 1:2)
#  layer        name      value
#1     1 another_tag         44
#2     1    one more that value
#3     2 another_tag         55
 
metags(x, 1, "one more")
#  layer     name      value
#2     1 one more that value

metags(x, 2, "one more")
#[1] layer name  value
#<0 rows> (or 0-length row.names)

Please let me know if this is not flexible enough for you (by opening a new issue).

netbsd-srcmastr pushed a commit to NetBSD/pkgsrc that referenced this issue Jan 5, 2025
# version 1.8-5

## bug fixes

- `Spatsample(method='stratified', ext=e)` returned the wrong sampling
  coordinates [#1628](rspatial/terra#1628)
  by Barnabas Harris

- `spatSample(method='stratified')` could fail with small sample sizes
  [#1503](rspatial/terra#1503) by karluf

- transparency (alpha) did not work with RGB
  plotting. [#1642](rspatial/terra#1642) by
  Timothée Giraud

- rasterization failed on very large rasters
  [#1636](rspatial/terra#1636) by Mary
  Fisher, [#1463](rspatial/terra#1463) by
  Nic Spono and [#1281](rspatial/terra#1281)
  by Sebastian Dunnett

- `tmpFiles` only looked in the default temp files folder
  [#1630](rspatial/terra#1630) by
  smckenzie1986

- `where.min` did not work well if there were negative values
  [#1634](rspatial/terra#1634) by Michael
  Sumner

- `plet<SpatRaster>` now works for RGB rasters and rasters with a
  color table [#1596](rspatial/terra#1596)
  by Agustin Lobo

- `vect<MULTIPOINT WKT>` did not work properly
  [#1376](rspatial/terra#1376) by
  silasprincipe

- `compareGeom<SpatVector>` did not work
  [#1654](rspatial/terra#1654) by Jason
  Flower

- `buffer<SpatVector>` is now more accurate buffers for lonlat
  polygons [#1616](rspatial/terra#1616) by
  Roberto Amaral-Santos

- `terra:interpNear` used square windows, not circles, beyond 100
  points [#1509](rspatial/terra#1509) by
  Jean-Luc Dupouey

- `vect` read INT64 fields as integers, sometimes leading to
  overflows. [#1666](rspatial/terra#1666) by
  bengannon-fc

- `plot` showed a legend title even if none was requestd if title
  parameters were specified
  . [#1664](rspatial/terra#1664) by Márcia
  Barbosa



## enhancements

n- improved documentation of `writeVector` overwrite when using
  layers. [#1573](rspatial/terra#1573) by
  Todd West

- improved treatment of (supposedly) flipped rasters by Timothée
  Giraud [#1627](rspatial/terra#1627) and
  fchianucci [#1646](rspatial/terra#1646)

- added `map.pal("random")`
  [#1631](rspatial/terra#1631) by Agustin
  Lobo

- expressions can now be used in legend titles
  [#1626](rspatial/terra#1626) by Noah
  Goodkind

- `app` and `tapp` now emit a warning when factors are coerced to
  numeric [#1566](rspatial/terra#1566) by
  shuysman

- `plet<SpatRaster>` now has argument "stretch" for RGB rasters
  [#1596](rspatial/terra#1596) by Agustin

- `%%` and `%/%` now behave the same for SpatRaster as for (base R)
  numbers [#1661](rspatial/terra#1661) by
  Klaus Huebert

## new

- `patches` with option `valus=TRUE` can now distinguish regions based
  on their cell values (instead of only NA vs not-NA)
  [#495](rspatial/terra#495) by Jakub
  Nowosad and [#1632](rspatial/terra#1632)
  by Agustin Lobo

- `rowSums`, `rowMeans`, `colSums` and `colMeans` for SpatRaster

- `metags` for SpatRasterDataset
  [#1624](rspatial/terra#1624) by Andrea
  Manica

- `metags` for layers (bands) of SpatRaster are now saved to and read
  from GTiff files
  [#1071](rspatial/terra#1071) by Mike
  Koontz

- `global` has new effcient functions "anyNA" and "anynotNA"
  [#1540](rspatial/terra#1540) by Kevin J
  Wolz

- `wrap`, `saveRDS` and `serialize` for
  SpatExtent. [#1430](rspatial/terra#1430)
  by BastienFR

- `vect<SpatGraticule>` method suggested in relation to [tidyterra
  #155](dieghernan/tidyterra#155) by Diego
  Hernangómez

- `toMemory<SpatRaster>` and `<SpatRasterDataset>` methods
  [#1660](rspatial/terra#1660) by Derek Friend
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants