【问题标题】:Rescaling vegetation index in R在 R 中重新调整植被指数
【发布时间】:2020-05-27 00:09:59
【问题描述】:

我在为栅格计算植被指数的函数中集成重新缩放方法时遇到了一些问题。我尝试使用来自this solution 的公式。代码会运行,但我会收到两条警告消息,并且我的图像会是空白的。我检查了栅格最小值和最大值,它们分别读取“-Inf”“Inf”。我还尝试了使用this post 中的RPMG 库的另一种方法,但遇到了另一个错误。这次是在运行 VARI 变量之后。我希望将重新缩放方法保持为“平淡无奇”,以便可以将其集成到其他指数中,例如三角绿化指数 (TGI)。有什么建议么?

方法一:

# Visable Atmospherically Resistant Index
VARI.Overlay <- function(b1, b2, b3){
  VARI.Calc <- (b1 - b3) / (b1 + b3 -b2)
  VARI.Scale <- ((VARI.Calc - min(VARI.Calc)) / (max(VARI.Calc) - min(VARI.Calc)) - 0.5 ) * 2
  return(VARI.Scale)
}
VARI <- overlay(img[[1]], img[[2]], img[[3]], fun = VARI.Overlay)

image(VARI, main = 'VARI')

方法一错误:

1: In min(x) : no non-missing arguments to min; returning Inf
2: In max(x) : no non-missing arguments to max; returning -Inf

方法二:

# Visable Atmospherically Resistant Index
VARI.Overlay <- function(b1, b2, b3){
  VARI.Calc <- (b1 - b3) / (b1 + b3 -b2)
  VARI.min <- min(VARI.Calc)
  VARI.max <- max(VARI.Calc)
  VARI.Scale <- RESCALE(VARI.Calc, -1, 1, VARI.min, VARI.max)
  return(VARI.Scale)
}
VARI <- overlay(img[[1]], img[[2]], img[[3]], fun = VARI.Overlay)

方法二错误:

Error in (function (x, fun, filename = "", recycle = TRUE, forcefun = FALSE,  : 
  cannot use this formula, probably because it is not vectorized

【问题讨论】:

    标签: r geospatial raster rescale


    【解决方案1】:

    你可以这样做

    示例数据

    library(raster)
    d <- brick(system.file("external/rlogo.grd", package="raster"))
    

    功能。注意!is.finite。这是为了捕捉(b1 + b3 - b2) == 0 的情况。 发生这种情况时,最大值变为Inf,结果不好。

    varifun <- function(b1, b2, b3){
      x <- (b1 - b3) / (b1 + b3 -b2)
      x[!is.finite(x)] <- NA
      x
    }
    
    v <- overlay(d, fun=varifun)
    

    现在计算最小值和最大值。您必须在上面的函数中这样做,因为这将对数据集的块进行操作,因此每个块可能会获得不同的最小值和最大值。大概你想要这些用于整个数据集。

    vmn <- cellStats(v, "min", na.rm=TRUE)
    vmx <- cellStats(v, "max", na.rm=TRUE)
    

    现在合并

    vari <- 2 * ((v - vmn) / (vmx - vmn) - 0.5)
    vari
    #class      : RasterLayer 
    #dimensions : 77, 101, 7777  (nrow, ncol, ncell)
    #resolution : 1, 1  (x, y)
    #extent     : 0, 101, 0, 77  (xmin, xmax, ymin, ymax)
    #crs        : +proj=merc +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
    #source     : memory
    #names      : layer 
    #values     : -1, 1  (min, max)
    

    顺便说一句,您从方法 1 中得到的消息不是错误。这些消息源于仅计算 NA 的最小值或最大值。

    【讨论】:

    • 感谢您发现除以零。那讲得通。我仍然对为什么不能在函数中使用 vmnvmx 感到困惑。你说的我明白,但为什么要分块操作呢?
    • 栅格方法以块的形式运行,以允许处理无法加载到内存中的大型数据集。在这个例子中,可能只有 1 个块,所以它不重要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 2015-09-23
    • 2019-05-18
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    相关资源
    最近更新 更多