Функция, которая не создает объект SpatialGridDataFrame

Я пытаюсь создать функцию, которая преобразует цифровой номер спутниковых изображений в яркость, но я не знаю, почему мой конечный объект является числовым, а не объектом SpatialGridDataFrame, если я указал в своем классе функций (results) == "SpatialGridDataFrame". Мой код:

пакеты

require(raster)
require(sp)

RasterLayer моделируется

r <- raster(nrows=10, ncols=10)
r <- setValues(r, 1:ncell(r))
plot(r)

band2<- as(r, 'SpatialGridDataFrame')  ### convert in SpatialGridDataFrame

Функция от DN к сиянию

radconvL<-function(x, band = 2)
{
     Lmax <- switch(as.character(band), 
                    "2" = 120.64,
                    "3" = 151.31,
                    "4" = 157.57,
                    "5" = 69.03,
                    NA)

     if (is.na(Lmax)) stop("invalid band")

     Lmin = 0
     Qmax = 127
     x <- as.vector(as.matrix(x))
     results <- x

     x <- Lmin + ((Lmax-Lmin)*x)/Qmax
     if (class(results) == "SpatialGridDataFrame")
         results@data[, 1] <- x
     else if (is.data.frame(x))
         results <- data.frame(matrix(x, nrow = nrow(results),
             ncol = ncol(results)))
     else results <- x
     print(paste(band, Lmax))
     print(results)
     results
}
-

Попробуйте функцию

teste2<-radconvL(band2, band = 2)
str(test2)## Numeric!!!! Why???

Может ли кто-нибудь помочь мне?

Спасибо,

Александр

1 ответ

Я покажу, как вы можете сделать эту работу:

radconvL <- function(x, band = 2) {
     Lmax <- switch(band, 
                    "2" = 120.64,
                    "3" = 151.31,
                    "4" = 157.57,
                    "5" = 69.03,
                    NA)

     if (is.na(Lmax)) stop("invalid band")
     Lmin = 0
     Qmax = 127
     Lmin + ((Lmax-Lmin)*x)/Qmax
}

library(raster)
b <- brick(system.file("external/rlogo.grd", package="raster"))
test <- radconvL(b[[2]], band = 2)

test это RasterLayer, но если вам нужна SpatialGridDataFrame (почему?) использовать:

sptest <- as(test, 'SpatialGridDataFrame')

Это не прямой ответ на ваш вопрос, но очень трудно понять, почему вы делаете некоторые вещи, которые вы делаете в функции. Например, вы делаете:

 x <- as.vector(as.matrix(x))
 results <- x
 x <- Lmin + ((Lmax-Lmin)*x)/Qmax

так results а также x являются вектором, но тогда вы делаете:

if (class(results) == "SpatialGridDataFrame")
#(...)
else if (is.data.frame(x))
#(...)
else results <- x

Насколько это актуально, когда мы знаем, что x это вектор (а не SpatialGridDataFrame или data.frame)? Это всегда собирается сделать results равно x, Таким образом, очевидно, что результат всегда будет числовым.

Вы заявляете, что делаете: class(results) == "SpatialGridDataFrame", но вы этого не делаете. В любом случае, это не сработало бы (это сродни тому, чтобы положить на него велосипед с "автомобилем"; это волшебным образом не даст ему четыре колеса и двигатель внезапно).

Если вы хотите ускорить процесс загрузки всех значений в память, вы можете сделать:

radconvL <- function(x, band = 2) {
     Lmax <- switch(band, 
                    "2" = 120.64,
                    "3" = 151.31,
                    "4" = 157.57,
                    "5" = 69.03,
                    NA)

     if (is.na(Lmax)) stop("invalid band")
     Lmin = 0
     Qmax = 127
     setValues(x, Lmin + ((Lmax-Lmin)*values(x))/Qmax)
}
Другие вопросы по тегам