Как я могу создать растровую мозаику, используя список растров?

Мне нужно создать несколько растровых мозаик. Я использую пакет растровых версий 2.0-31 на компьютере с 64-битным Windows. Я думаю, что я сделал домашнюю работу, проверяя все возможные блоги и задавая этот вопрос некоторым коллегам, но все еще не могу найти решение.

У меня проблема в том, что я не могу создать мозаику, если мои сетки перечислены в растровом объекте. Я нашел этот пример, который я мог бы применить, но не получил странное сообщение об ошибке. Пример ниже представляет мою проблему:

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"’

Я также попробовал функцию, предложенную здесь, но тоже не сработала.

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 ответ

Это кажется регрессом в новых версиях растра. Ваш пример кода работает, как и ожидалось, в растре 1.9-70 (и R 2.13.1), но выдает ту же ошибку, что и вы, полученную в растре 2.0-41 (объявление R 2.15.3). Вы можете послать электронное письмо сопровождающему Роберту Хеймансу, чтобы указать на это.

А пока эту проблему можно обойти. Глядя на разницу в коде между мозаикой в ​​растре 1.9-70 и мозаикой в ​​растре 2.0-41, вы видите, что метод, который принял список, был удален. Вместо этого теперь есть только метод, который принимает отдельные растры. Так что если у вас много растров, вы должны вызывать функцию следующим образом:

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

Однако это не очень удобно, если вы строите свой список растров для динамической мозаики. R имеет вспомогательную функцию, чтобы помочь вам в такой ситуации, do.call, Какие do.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)
})
Другие вопросы по тегам