如何在R栅格的同时计算多个波段?

时间:2016-05-09 14:48:06

标签: r if-statement raster r-raster rgdal

我正在尝试计算一个72波段的栅格。如果前36个波段值(近红外波段)大于后36个波段值(短波红外波段),则将其指定为0;如果没有,则继续执行以下功能。我尝试了其他编写方式(基本上是相同的逻辑),并出现相同的错误。这是我写的功能:

raster_stack <- stack("NIR.bin", "SWIR.bin")
#ndii = NIR - SWIR/NIR+SWIR

fun <- function(x) {
       x[is.na(x)] <- 0;
       if (x[37:72] >= x[1:36]){
           0} else {
               ndii <- ((x[1:36]-x[37:72]) / (x[1:36]+x[37:72]));
               silent=TRUE;
               return(ndii)
              }
}
ndii <- calc(raster_stack, fun)

错误信息总是这一个:

  

setValues(out,x)出错:值必须是数字,整数,逻辑   或因素

我添加了x[is.na(x)] <- 0来摆脱NA值,但似乎没有帮助。解决这个问题的任何见解?

1 个答案:

答案 0 :(得分:0)

有几个问题。您的if语句不好,因为您正在比较36个值。此外,您需要将数据视为矩阵。

library(raster)
raster_stack <- stack("NIR.bin", "SWIR.bin")
#ndii = NIR - SWIR/NIR+SWIR

fun <- function(x) {
    y <- (x[,1:36]-x[,37:72]) / (x[,1:36] + x[,37:72])
    i <- x[,37:72] >= x[,1:36]
    y[i] <- 0
    y
}
ndii <- calc(raster_stack, fun)