R'deki mozaik rasterler?


10

Gönderilmiş olduğu Senaryoyu kullanma R. tek büyük raster içine mozaik birkaç resim nesnesindeki çalışıyorum /programming/15287807/how-can-i-create-raster-mosaic-using-list-of-rasters Ancak, bir uyarı iletisi ve hata iletisi aldım.

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)

Aşağıdaki gibi hata bildiriyordu

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

Sonra başka bir sürüm denedim.

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

Ancak burada aşağıdaki gibi bazı uyarı mesajları

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

Mesajı görmezden geldim ve devam ettim

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

ancak burada yukarıda belirtilenle aynı hata

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

Ayrıca aşağıdaki komut dosyasını buldum, ancak nceas.ucsb.edu/scicomp/usecases/createrasterimagemosaic
Vandka

Yanıtlar:


17

Burada sorun şu ki, mozaik ve do.call sadece "rasters1" vektöründe bulunan raster karakter isimlerini değil, listede bir raster nesnesi bekliyor. Aslında, bir raster nesnesi değil, bir vektördeki bir adı mozaiklemenizi istersiniz.

# 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)

1

Sadece tema küçük bir varyasyon. Boş bir liste ve for döngüsü oluşturmayı önleyebilirsiniz ...

    rast.list <- list()

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

... lapply komutuyla.

    rast.list <- lapply(1:length(rasters1),
 function(x) {
raster(rasters1[x])
})
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.