使用 terra 中的 ifel 将每个图层保存为单独的文件

问题描述 投票:0回答:1

我有一个由数十层组成的大型光栅堆栈。我想使用

ifel
将每个图层直接保存到磁盘,但是
filename
中的
ifel
函数会创建一个输出文件。
ifel
的帮助文件指向
writeRaster
获取其他参数,但在
writeRaster
中,每个层都是单独保存的,这正是我想要的。

r <- rast(nrows=5, ncols=5, xmin=0, xmax=1, ymin=0, ymax=1)
values(r) <- c(-10:0, NA, NA, NA, 0:10)

s<-r*1.2

r.stack<-c(r, s)
names(r.stack)<-c("r", "s")
t <- rast(nrows=5, ncols=5, xmin=0, xmax=1, ymin=0, ymax=1)

values(t) <- c(rep(1, 5), rep(2, 5), rep(3, 5), rep(2, 5), rep(3, 5))

x <- ifel(t==3, 5, r.stack,
          filename=paste("test",names(r.stack), ".tiff", sep=""))
#Warning message:
#[cover] only the first filename supplied is used

输出:具有两个图层的单个 .tiff 文件

所需输出:每个层有两个 .tiff 文件,以层名称命名

writeRaster(x,filename=paste("test",names(r.stack), ".tiff", sep=""))
r raster terra
1个回答
0
投票

filename
ifel()
内部的工作方式有所不同,因为它只能写入单个输出文件。在本例中,它旨在保存对单个输入对象所做的修改。

另一方面,

writeRaster()
接受:

单个文件名,或与 nlyr(x) 一样多的文件名,为每层写入一个文件。

为了达到您想要的结果:

library(terra)

# Create modified version of t SpatRaster
x <- ifel(t == 3, 5, r.stack)

# Write each layer in x to woring directory
writeRaster(x, 
            filename = paste("test", names(r.stack), ".tiff", sep = ""),
            overwrite = TRUE)

# List all tiff files starting with "test" in working directory
list.files(pattern = "^test.*\\.tiff$")
# [1] "testr.tiff" "tests.tiff"

rast("testr.tiff")
# class       : SpatRaster 
# dimensions  : 5, 5, 1  (nrow, ncol, nlyr)
# resolution  : 0.2, 0.2  (x, y)
# extent      : 0, 1, 0, 1  (xmin, xmax, ymin, ymax)
# coord. ref. : lon/lat WGS 84 (EPSG:4326) 
# source      : testr.tiff 
# name        :   r 
# min value   : -10 
# max value   :   5 

rast("tests.tiff")
# class       : SpatRaster 
# dimensions  : 5, 5, 1  (nrow, ncol, nlyr)
# resolution  : 0.2, 0.2  (x, y)
# extent      : 0, 1, 0, 1  (xmin, xmax, ymin, ymax)
# coord. ref. : lon/lat WGS 84 (EPSG:4326) 
# source      : tests.tiff 
# name        :   s 
# min value   : -12 
# max value   :   6
© www.soinside.com 2019 - 2024. All rights reserved.