2013-03-08 18 views
9

Ho bisogno di creare diversi mosaici raster. Sto usando Package raster versione 2.0-31 su un computer Windows a 64 bit. Credo di aver fatto i miei compiti controllando tutti i possibili blog e facendo questa domanda ad alcuni colleghi, ma ancora non riesco a trovare una soluzione.Come posso creare un mosaico raster usando l'elenco dei raster?

Il problema è che non riesco a creare un mosaico se le mie griglie sono elencate in un oggetto raster. Ho trovato this example che avrei potuto applicare, ma non, ricevo uno strano messaggio di errore. L'esempio che segue rappresenta il mio problema:

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) 

Questo è l'errore che ottengo:

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

Ho provato anche la funzione suggerito nel here, ma non ha funzionato neanche.

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) 

Questo è il messaggio di errore:

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 

risposta

12

Questo sembra essere una regressione nelle versioni più recenti di raster. Il codice di esempio viene eseguito come previsto in raster 1.9-70 (e R 2.13.1) ma restituisce lo stesso errore ricevuto in raster 2.0-41 (annuncio R 2.15.3). Potresti mandare un'email al maintainer Robert J. Hijmans per segnalarlo.

Nel frattempo, questo problema può essere risolto. Osservando la differenza di codice tra mosaic in raster 1.9-70 e mosaic in raster 2.0-41, è possibile notare che il metodo che ha accettato un elenco è stato rimosso. Invece, ora c'è solo un metodo che accetta i singoli raster. Quindi, se avete un sacco di raster, si hanno lo scopo di richiamare la funzione in questo modo:

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

Questo non è molto conveniente, tuttavia, se si sta costruendo il vostro elenco di raster a mosaico in modo dinamico. R ha una funzione di aiuto per aiutarti in questo tipo di situazione, do.call. Quello che fa do.call è una funzione e un elenco e chiama tale funzione utilizzando gli elementi nell'elenco come argomenti. Quindi è possibile utilizzare questo, a patto che si aggiunge fun=mean alla tua lista di argomenti:

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

È possibile raddoppiare controllare che questi due metodi danno lo stesso risultato:

stopifnot(identical(mos1, mos2)) 

Questo può essere avvolto in un semplice funzione di convenienza e legata alla firma della chiamata in questione, quindi il codice originale funzionerà senza modifiche:

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

Grazie! Questo funziona bene con l'esempio. E questo sarebbe il modo di usare la funzione con l'elenco dei mosaici raster <-do.call (mosaic, raster) – LuluPor

+0

@LuluPor Se per prima cosa chiamate il codice 'setMethod (....)', tutto ciò di cui avete bisogno fai è chiamare il tuo originale 'mos <- mosaic (raster1, fun = mean)'. – fmark

+0

Sì, funziona benissimo, grazie! Ho i mosaici di cui avevo bisogno. – LuluPor

Problemi correlati