Mosaik-Raster in R?

10

Ich versuche, mehrere Raster in R zu einem einzigen großen Raster zu mosaikieren. Verwenden Sie dazu ein Skript, das unter /programming/15287807/how-can-i-create-raster-mosaic-using-list-of-rasters veröffentlicht wurde Ich habe jedoch eine Warnmeldung und eine Fehlermeldung erhalten.

rasters1 <- list.files("F:\\MOD15A2_LAI_1km\\MOD15A2_LAI_2009", 
                      pattern = "mod15a2.a2009001.*.005.*.img$", 
                      full.names = TRUE, recursive = TRUE)

mos1 <-mosaic(rasters1, fun=mean)

Es wurde ein Fehler wie unten gemeldet

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

Dann habe ich eine andere Version ausprobiert.

rasters1.mosaicargs <- rasters1
rasters1.mosaicargs$fun <- mean

Aber hier eine Warnmeldung wie unten

Warning message:
In rasters1.mosaicargs$fun <- mean : Coercing LHS to a list

Ich habe die Nachricht ignoriert und dann fortgefahren

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

aber hier der gleiche Fehler wie oben erwähnt

Error in (function (classes, fdef, mtable)  : 
  unable to find an inherited method for function ‘mosaic’ for signature ‘"character", "character"
Vandka
quelle
Ich habe auch folgendes Skript gefunden, aber es funktioniert nicht nceas.ucsb.edu/scicomp/usecases/createrasterimagemosaic
Vandka

Antworten:

17

Das Problem hierbei ist, dass Mosaik und do.call ein Rasterobjekt in der Liste erwarten und nicht nur Zeichennamen des Rasters, das im Vektor "rasters1" enthalten ist. Tatsächlich möchten Sie einen Namen in einem Vektor und nicht in einem Rasterobjekt mosaikieren.

# Create some example data
require(raster)
    r <- raster(ncol=100, nrow=100)
      r1 <- crop(r, extent(-10, 11, -10, 11))
        r1[] <- 1:ncell(r1)
          r2 <- crop(r, extent(0, 20, 0, 20))
          r2[] <- 1:ncell(r2)
      r3 <- crop(r, extent(9, 30, 9, 30))
    r3[] <- 1:ncell(r3)

# If I create a list object of the raster names, as your are doing with list.files, 
#    do.call will fail with a character signature error 
rast.list <- list("r1","r2","r3")   
  rast.list$fun <- mean     
    rast.mosaic <- do.call(mosaic,rast.list)

# However, if I create a list contaning raster objects, the do.call function 
#   will work when mosaic is passed to it.      
rast.list <- list(r1, r2, r3)     
  rast.list$fun <- mean
    rast.mosaic <- do.call(mosaic,rast.list)
      plot(rast.mosaic)

# You could specify a for loop to create a list object, 
#   contaning raster objects
rasters1 <- list.files("F:/MOD15A2_LAI_1km/MOD15A2_LAI_2009", 
                       pattern="mod15a2.a2009001.*.005.*.img$", 
                       full.names=TRUE, recursive=TRUE)
rast.list <- list()
  for(i in 1:length(rasters1)) { rast.list[i] <- raster(rasters1[i]) }

# And then use do.call on the list of raster objects
rast.list$fun <- mean
  rast.mosaic <- do.call(mosaic,rast.list)
    plot(rast.mosaic)
Jeffrey Evans
quelle
1

Nur eine kleine Variation des Themas. Sie können die Erstellung einer leeren Liste und der for-Schleife vermeiden ...

    rast.list <- list()

    for(i in 1:length(rasters1)) { 
rast.list[i] <- raster(rasters1[i])
}

... mit einem lapply Befehl.

    rast.list <- lapply(1:length(rasters1),
 function(x) {
raster(rasters1[x])
})
Dan
quelle