不创建SpatialGridDataFrame对象的函数

时间:2016-02-06 16:55:23

标签: r function spatial r-raster

我尝试创建一个功能,可以将卫星图像的数字数量转换为辐射,但我不知道为什么我的最终对象是数字而不是SpatialGridDataFrame对象,如果我在我的函数类中指定的(结果)= =" 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 个答案:

答案 0 :(得分:2)

我将展示如何使这项工作:

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)

testRasterLayer,但如果您需要SpatialGridDataFrame(为什么?),请使用:

sptest <- as(test, 'SpatialGridDataFrame')

这不是你问题的直接答案,但很难理解你为什么要做这个函数中的一些事情。例如,你这样做:

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

因此resultsx是一个向量,但您可以这样做:

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

当我们知道x是一个向量(而不是SpatialGridDataFramedata.frame)时,它是如何相关的?这总是使results等于x。因此很明显,结果将始终为数字。

你声明你这样做:class(results) == "SpatialGridDataFrame",但你不这样做。无论哪种方式,这都行不通(这类似于在你的自行车上贴上&#34;汽车&#34;它不会神奇地给它四个轮子和一个引擎突然发动机)。

如果您想通过将所有值加载到内存来加快速度,可以执行以下操作:

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