繁体   English   中英

在 R 中重新调整植被指数

[英]Rescaling vegetation index in R

我在为栅格计算植被指数的 function 中集成重新缩放方法时遇到了一些麻烦。 我尝试使用此解决方案中的公式。 代码会运行,但我会收到两条警告消息,并且我的图像会是空白的。 我检查了栅格最小值和最大值,它们分别读取“-Inf”“Inf”。 我还尝试了使用这篇文章中的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

你可以做这样的事情

示例数据

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

Function。 注意.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)

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

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的最小值或最大值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM