Масштабирование индекса растительности в R - PullRequest
1 голос
/ 27 мая 2020

У меня возникли проблемы с интеграцией метода масштабирования в функцию, вычисляющую индекс растительности для растра. Я пробовал использовать формулу из этого решения . Код будет работать, но я получу два предупреждающих сообщения, а мое изображение будет пустым. Я проверил минимальные и максимальные значения растра, и они прочитали "-Inf" и "Inf" соответственно. Я также попробовал другой способ, используя библиотеку RPMG из этого сообщения , но столкнулся с другой ошибкой. На этот раз после запуска переменной VARI. Я хочу, чтобы метод изменения масштаба был как можно более "мягким", чтобы я мог интегрировать его в другие индексы, такие как Tri angular Greeness Index (TGI). Какие-либо предложения?

Метод 1:

# 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:

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

Метод 2:

# 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)

Ошибка метода 2:

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

1 Ответ

2 голосов
/ 27 мая 2020

Вы можете сделать что-то вроде этого

Пример данных

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.

...