将对象添加到循环列表中的问题

时间:2019-04-13 11:12:28

标签: r list raster

很抱歉,如果不合适。我检查了所有其他帖子,但无法解决。

我正在尝试将堆叠的栅格对象划分为每个波段,并将它们添加到列表中,如下所示:

library(rgdal)
satImage <- "pla18_rgbn_ndvi_7stack_16bit.img"


x <- vector("list", 35)

for (i in 1:35) {

  psi <- raster(satImage, band = i)
  x[[i]] <- psi

}

但是它会产生如下列表:

> View(x)
> x
[[1]]
NULL

[[2]]
NULL

[[3]]
NULL

...

[[34]]
NULL

[[35]]
class       : RasterLayer 
band        : 35  (of  35  bands)
dimensions  : 13084, 18025, 235839100  (nrow, ncol, ncell)
resolution  : 3, 3  (x, y)
extent      : 581337, 635412, 4425114, 4464366  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=utm +zone=35 +ellps=WGS84 +towgs84=0,0,0,-0,-0,-0,0 +units=m +no_defs 
data source : E:/betul/35bantli/pla18_rgbn_ndvi_7stack_16bit.img 
names       : pla18_rgbn_ndvi_7stack_16bit 
values      : 55, 65535  (min, max)

我想要列表中所有其他34个波段。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

我认为您正在寻找的是这个

library(raster)
satImage <- "pla18_rgbn_ndvi_7stack_16bit.img"
s <- stack(satImage)
x <- as.list(s)

现在有示例数据(问问题时请始终使用R附带的示例数据):

f <- system.file("external/rlogo.grd", package="raster") 
s <- stack(f)
x <- as.list(s)

检查“乐队”号码

sapply(x, bandnr)
#[1] 1 2 3

如果您知道乐队的数量(在这种情况下为3个),那么您正在做的事情应该可以工作(但是上面的内容更优雅):

f <- system.file("external/rlogo.grd", package="raster")
n <- 3    
x <- vector("list", n)
for (i in 1:n) {
    x[[i]] <- raster(f, band = i)
}

最后:您不提供上下文,但是最好创建一个RasterStack(如上所示),或者最好创建一个RasterBrick,而不是创建一个{{ 1}}个对象

答案 1 :(得分:-2)

使用“ tif”文件时,问题已解决。