Mosaik raster dalam R?

10

Saya mencoba membuat mosaik beberapa raster menjadi raster besar tunggal di R. Menggunakan skrip yang diposting di /programming/15287807/how-can-i-create-raster-mosaic-using-list-of-rasters Tapi, saya telah menerima pesan peringatan dan pesan kesalahan.

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)

Itu melaporkan kesalahan seperti di bawah ini

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

Lalu saya mencoba versi lain.

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

Namun di sini beberapa pesan peringatan seperti di bawah ini

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

Saya telah mengabaikan pesan itu kemudian melanjutkan

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

tapi di sini kesalahan yang sama disebutkan di atas

Error in (function (classes, fdef, mtable)  : 
  unable to find an inherited method for function ‘mosaic’ for signature ‘"character", "character"
Vandka
sumber
Saya juga menemukan skrip berikut, tetapi tidak berfungsi nceas.ucsb.edu/scicomp/usecases/createrasterimagemosaic
Vandka

Jawaban:

17

Masalahnya di sini adalah bahwa mosaik dan do.call mengharapkan objek raster dalam daftar dan bukan hanya nama karakter raster yang terkandung dalam vektor "raster1". Anda, pada dasarnya, meminta untuk membuat mosaik nama dalam vektor dan bukan objek raster.

# 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
sumber
1

Hanya sedikit variasi pada tema. Anda dapat menghindari pembuatan daftar kosong dan untuk ...

    rast.list <- list()

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

... dengan perintah lapply .

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