【问题标题】:How to calculate multiple bands at the same time R raster?如何同时计算多个波段R栅格?
【发布时间】:2016-09-04 06:24:48
【问题描述】:

我正在尝试计算 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)] &lt;- 0 以摆脱 NA 值,但似乎没有帮助。对解决此问题有何见解?

【问题讨论】:

  • 我认为您需要清理该功能。 nd 是什么?命令silent = TRUE 将永远不会执行,因为它位于return(nd) 行之后。您可能想查看此链接How to create a Minimal, Complete, and Verifiable example
  • 很抱歉给您带来了困惑。 “nd”指的是这个函数正在计算的 ndii 值。有什么见解吗?我尝试编写 for 循环,但也无济于事。
  • @YuyunHe 你确定你可以这样堆叠二进制文件吗?

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


【解决方案1】:

有几个问题。您的 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)

【讨论】:

    猜你喜欢
    • 2018-09-20
    • 2013-03-16
    • 2013-12-18
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多