2013-03-08 72 views
9

我需要创建几个栅格马赛克。我在64位Windows计算机上使用Package raster version 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 

回答

12

这似乎是在光栅的较新版本的回归。您的示例代码按照预期在栅格1.9-70(和R 2.13.1)中运行,但会给出与在栅格2.0-41(广告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) 
}) 
+0

谢谢!这个例子可以很好地工作。这将成为使用栅格列表的马赛克功能的方法<-do.call(mosaic,raster) – LuluPor 2013-03-12 00:21:03

+0

@LuluPor如果您首先调用上面的'setMethod(....)'代码,您只需要do叫你原来的'mos < - 马赛克(rasters1,fun = mean)'。 – fmark 2013-03-13 01:27:08

+0

是的,这很好,谢谢!我有我需要的马赛克。 – LuluPor 2013-03-15 01:52:10