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

时间:2013-03-08 06:09:51

标签: r raster mosaic

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

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

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)

这是我得到的错误:

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

我也尝试了here中建议的功能,但也没有用。

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)

这是错误消息:

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

1 个答案:

答案 0 :(得分:12)

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

与此同时,这个问题可以解决。查看mosaic in raster 1.9-70mosaic in raster 2.0-41之间的代码差异,您可以看到已删除接受列表的方法。相反,现在只有一种接受单个栅格的方法。所以,如果你有很多栅格,你应该像这样调用函数:

mos1 <- mosaic(r1, r2, r3, fun=mean)

但是,如果要构建动态镶嵌的栅格列表,这不是很方便。在这种情况下,R确实有一个辅助函数来帮助你do.calldo.call所做的是获取函数和列表,并使用列表中的项作为参数调用该函数。因此,只要将fun=mean添加到参数列表中,就可以使用它:

rasters1.mosaicargs <- rasters1
rasters1.mosaicargs$fun <- mean
mos2 <- do.call(mosaic, rasters1.mosaicargs)

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

stopifnot(identical(mos1, mos2))

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

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