如何使用栅格列表创建栅格镶嵌?

Lul*_*Por 9 r raster mosaic

我需要创建几个光栅马赛克.我在64位Windows计算机上使用Package光栅版2.0-31.我相信我的作业通过所有可能的博客检查,并向一些同事提出这个问题,但仍然无法找到解决方案.

我遇到的问题是,如果我的网格列在栅格对象中,我就无法创建马赛克.我发现这个例子,虽然我可以申请,但不是,我得到一个奇怪的错误信息.以下示例代表我的问题:

r <- raster()
r1 <- crop(r, extent(-10, 10, -10, 10))
r2 <- crop(r, extent(0, 20, 0, 20))
r3 <- crop(r, extent(10, 30, 10, 30))

r1[] <- 1:ncell(r1)
r2[] <- 1:ncell(r2)
r3[] <- 1:ncell(r3)
rasters1 <- list(r1, r2, r3)

mos <- mosaic(rasters1,fun=mean)
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误:

Error in function (classes, fdef, mtable)  : 
  unable to find an inherited method for function ‘mosaic’ for signature ‘"list", "missing"’
Run Code Online (Sandbox Code Playgroud)

我也试过这里建议的功能,但也没有用.

fmerge <- function(rasters1, fun, ...){
  ex <- raster(union(rasters1))
  res(ex) <- res(rasters1[[1]])
  for( i in 1:length(rasters1) )
    rasters[[i]] <- merge(rasters1[[i]], ex)
  rasters <- stack(rasters1)
  fun(rasters1, ...)
}

rfm <- fmerge(rasters1, mean, na.rm=T)
Run Code Online (Sandbox Code Playgroud)

这是错误消息:

Error in raster(union(rasters1)) : 
  error in evaluating the argument 'x' in selecting a method for function 'raster': Error in as.vector(y) : argument "y" is missing, with no default
Run Code Online (Sandbox Code Playgroud)

fma*_*ark 14

这似乎是较新版本的栅格中的回归.您的示例代码在栅格1.9-70(以及R 2.13.1)中按预期运行,但提供的错误与您在栅格2.0-41(ad R 2.15.3)中收到的错误相同.您可以通过电子邮件向维护人员Robert J. Hijmans发送电子邮件来指出这一点.

与此同时,这个问题可以解决.看着之间的代码区别镶嵌在光栅1.9-70镶嵌在光栅2.0-41,你可以看到,接受了一个列表的方法已被删除.相反,现在只有一种接受单个栅格的方法.所以,如果你有很多栅格,你应该像这样调用函数:

mos1 <- mosaic(r1, r2, r3, fun=mean)
Run Code Online (Sandbox Code Playgroud)

但是,如果要构建动态镶嵌的栅格列表,这不是很方便.在这种情况下,R确实有辅助功能来帮助你do.call.什么do.call是函数和列表,它使用列表中的项作为参数调用该函数.所以你可以使用它,只要你添加fun=mean到你的参数列表:

rasters1.mosaicargs <- rasters1
rasters1.mosaicargs$fun <- mean
mos2 <- do.call(mosaic, rasters1.mosaicargs)
Run Code Online (Sandbox Code Playgroud)

您可以仔细检查这两种方法是否给出相同的结果:

stopifnot(identical(mos1, mos2))
Run Code Online (Sandbox Code Playgroud)

这可以包装成一个简单的便利函数,并绑定到相关的调用签名,因此您的原始代码将不加修改地工作:

setMethod('mosaic', signature(x='list', y='missing'), 
function(x, y, fun, tolerance=0.05, filename=""){
    stopifnot(missing(y))
    args <- x
    if (!missing(fun)) args$fun <- fun
    if (!missing(tolerance)) args$tolerance<- tolerance
    if (!missing(filename)) args$filename<- filename
    do.call(mosaic, args)
})
Run Code Online (Sandbox Code Playgroud)