2013-03-08 3 views
9

Ich muss mehrere Rastermosaiken erstellen. Ich verwende die Paket-Raster-Version 2.0-31 auf einem 64-Bit-Windows-Computer. Ich glaube, ich habe meine Hausaufgaben gemacht, habe alle möglichen Blogs durchgesehen und diese Frage an einige Kollegen gestellt, kann aber immer noch keine Lösung finden.Wie kann ich ein Raster-Mosaik mit einer Liste von Rastern erstellen?

Das Problem, das ich habe, ist, dass ich kein Mosaik erstellen kann, wenn meine Raster in einem Raster-Objekt aufgeführt sind. Ich habe this example gefunden, dass ich zwar anwenden konnte, aber nicht, ich bekomme eine seltsame Fehlermeldung. Das Beispiel stellt unter meinem Problem:

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) 

Dies ist der Fehler, den ich bekommen:

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

Ich habe auch versucht, die Funktion in here vorgeschlagen, aber hat nicht funktioniert.

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) 

Dies ist die Fehlermeldung:

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 

Antwort

12

Dies scheint eine Regression in neueren Versionen von Raster zu sein. Ihr Beispielcode wird wie erwartet in Raster 1.9-70 (und R 2.13.1) ausgeführt, gibt aber den gleichen Fehler wie in Raster 2.0-41 (ad R 2.15.3). Vielleicht möchten Sie den Betreuer Robert J. Hijmans per E-Mail darüber informieren.

In der Zwischenzeit kann dieses Problem umgangen werden. Betrachtet man den Unterschied im Code zwischen mosaic in raster 1.9-70 und mosaic in raster 2.0-41, können Sie sehen, dass die Methode, die eine Liste akzeptiert hat, entfernt wurde. Stattdessen gibt es jetzt nur eine Methode, die einzelne Raster akzeptiert. Wenn Sie also eine Menge Rastern haben, sollen Sie die Funktion wie folgt nennen:

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

Das ist nicht sehr bequem, aber wenn Sie Ihre Liste bauen Rastern dynamisch Mosaik. R hat eine Hilfsfunktion, die Ihnen in dieser Situation hilft, do.call. Was do.call tut, nimmt eine Funktion und eine Liste und ruft diese Funktion auf, wobei die Elemente in der Liste als Argumente verwendet werden. So können Sie diese verwenden, solange Sie fun=mean zu Ihrem Argument Liste hinzu:

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

Sie überprüfen verdoppeln können, dass diese beiden Methoden die gleichen Ergebnisse liefern:

stopifnot(identical(mos1, mos2)) 

Diese in eine gewickelt werden kann einfache Komfortfunktion, die an die entsprechende Anrufsignatur gebunden ist, so dass der ursprüngliche Code unverändert funktioniert:

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

Vielen Dank! Das funktioniert gut mit dem Beispiel. Und das wäre der Weg, um die Funktion mit der Liste der Raster Mosaik <-do.call (Mosaik, Raster) zu verwenden – LuluPor

+0

@LuluPor Wenn Sie zuerst den 'setMethod (....)' Code oben aufrufen, alles, was Sie brauchen Rufen Sie Ihr ursprüngliches 'mos <- mosaic (rasters1, fun = mean)' an. – fmark

+0

Ja, das funktioniert super, danke! Ich habe die Mosaiken, die ich brauchte. – LuluPor

Verwandte Themen