R:编写RasterStack并保留图层名称

kgu*_*uay 16 r raster netcdf geotiff

我有一个光栅堆栈,stk由R中的三个光栅图像组成.这是一个简单的例子

# set up a raster stack with three layers
> library(raster)
> r <- raster(nrows=10,ncols=10)
> r[] <- rnorm(100)
> stk <- stack(r,r,r)

# layer names are set by default
> names(stk)
[1] "layer.1" "layer.2" "layer.3"
Run Code Online (Sandbox Code Playgroud)

我为栅格图层指定了名称:

# set layer names to "one", "two" and "three"
> names(stk) <- c('one','two','three')

> names(stk)
[1] "one" "two" "three"
Run Code Online (Sandbox Code Playgroud)

当我使用以下命令将RasterStack写入GeoTiff(多层)时:

writeRaster(stk,"myStack.tif", format="GTiff")
Run Code Online (Sandbox Code Playgroud)

根据文件名重命名图层(见> names(stk)下文).

当我读入光栅堆栈时:

> stk <- stack("myStack.tif")

# the layer names have been set automatically based on the filename
# they should be "one", "two" and "three"
> names(stk)
[1] "myStack.1" "myStack.2" "myStack.3"
Run Code Online (Sandbox Code Playgroud)

在R中编写RasterStacks时,您知道如何保留图层名称吗?我曾尝试将堆栈写入GeoTIFF和NetCDF格式.

谢谢,凯文

Ser*_*gio 13

您可以使用terrastar

使用土地

如果将堆栈转换为包rast中的对象,则会保留名称terra

然后您可以使用 raster::writeRaster 或 terra::writeRaster,无论哪种方式,名称都会保留!

library(terra)
x <- rast(stk)
terra::writeRaster(x, "file.tif")
y <- raster::brick("file.tif") 
#y <- terra::rast("file.tif")
#y <- stars::read_stars("file.tif")
names(y)
Run Code Online (Sandbox Code Playgroud)

使用星星

library(stars)
x <- st_as_stars(stk)
write_stars(x, "file2.tif")
y <- raster::brick("file2.tif")
#y <- terra::rast("file2.tif")
#y <- stars::read_stars("file2.tif")
names(y)
Run Code Online (Sandbox Code Playgroud)


ble*_*ner 8

您可以使用本机栅格格式:

myRaster <- writeRaster(stk,"myStack.grd", format="raster")
Run Code Online (Sandbox Code Playgroud)

栅格网格格式由二进制.gri文件和.grd头文件组成.这将保留您的图层名称.但请注意,.gri二进制文件未压缩.

如果您需要在其他程序中打开raster grd文件,则很可能需要编写其他头文件.我通常使用ENVI标头格式来做到这一点.

hdr(myRaster, format = "ENVI")
Run Code Online (Sandbox Code Playgroud)

例如,要从qgis打开文件,您将选择.gri文件(二进制文件),它应该可以工作.

  • 是否可以将图层名称与数据存储在一个文件中?或者 GeoTIFF 根本不支持图层命名? (2认同)

don*_*los 6

有点晚了,但可能会帮助其他人寻找可能的解决方案:

writeRaster(stk, filename=names(stk), bylayer=TRUE,format="GTiff")
Run Code Online (Sandbox Code Playgroud)

  • 这会将每一层写入一个单独的文件,而不是根据 OP 的问题,将所有层及其名称写入一个堆栈中。 (2认同)