n个栅格图层的堆栈{raster}

4

我有一个关于 stack() 栅格图层的问题。

通常我会像这样使用 stack() 来叠加栅格图层:

stack(RasterLayer1,RasterLayer2,RasterLayer3) # e.g. for 3 Layers

我的问题是,如何在不逐个输入栅格图层的情况下使用stack()函数将它们堆叠起来?
例如:有n个栅格图层(例如12个),所有图层都命名为band
我创建了n-Raster层,现在我想堆叠所有图层,而不需要逐个输入栅格图层的名称。因此,不是输入以下内容:
stack(band1,band2,band3,band4,band5,band6,band7,band8,band9,band10,band11,band12)

我想通过stack(band[n])来缩短代码,但这样并不起作用。

如果我创建一个所有band的列表,我也无法将它们堆叠在一起,因为它们不会出现在我的工作目录中,因为我刚刚创建了它们。

有人能帮帮我吗?


堆栈(stack)接受光栅列表、文件名向量或具有多个波段的单个文件。我们需要更多关于您拥有的信息,是文件夹还是循环?创建对象还是其他?您可以使用lapply、ls和get来收集工作区中自由浮动的名称,但最好稍微解开一下。 - mdsumner
我有一些栅格数据,我使用循环读取它们,重命名并重新采样每个图层。最终,我会得到n个不同于原始栅格数据的栅格图层,这些图层保存在我的工作目录中。这就是为什么list.files()无法工作的原因,因为我没有保存已重命名和重新采样的栅格图层。我甚至不知道是否可能从列表中堆叠(stack())栅格图层,如果它们不在工作目录中。 - A.F.
3个回答

4
如果您的数据在一个目录中,您可以使用搜索模式(例如:*.tif、*.grd等)并将其存储在变量中。
bands <- list.files(path=".",pattern="*.tif",full.names=TRUE,recursive=TRUE)

现在假设你的数据叫做:
band_01.tif
band_02.tif
band_03.tif
band_04.tif
band_05.tif
band_06.tif
band_07.tif

然后,您可以堆叠例如:

data_stack <- stack(bands) #stack all data
data_stack <- stack(bands[1:3]) #stack 1,2 and 3 data
data_stack <- stack(bands[c(1,3,5,7)]) 

2

我建议不要将它们保存在单独的变量中,例如band1, band2,而是将它们存储在列表中。以下是一个示例:

#Create empty rasters
ras1<- raster()
ras2<- raster()

#Initialise and append to list
list_ras <- list()
list_ras[[1]] <- ras1
list_ras[[2]] <- ras2

#Stack single bands
ras_stack <- stack(list_ras[[1]], list_ras[[2]])

#Stack all bands
ras_stack <- stack(list_ras)

1
这里是另一种使用 mget 的方法:
# Generate some data
library(raster)
r <- raster()
r[] <- runif(ncell(r))
for (i in 1:10) assign(paste0("r", i), r)

# create a stack      
stack(mget(ls(pattern = "^r.+")))

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - A.F.
很好,但通常不要这样做。 - mdsumner
你是什么意思?为什么不呢? - A.F.
最好将您的对象放在某种数据结构(即列表)中,而不是让它们全部漂浮在您的工作区中。 - johannes
是的,没错。在这种情况下,我将堆栈保存为图像(.tif)。这就是我需要的全部内容。谢谢! - A.F.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接