2013-04-08 23 views
8

Tôi đã cố gắng tìm một cách hiệu quả thời gian để hợp nhất nhiều hình ảnh raster trong R. Đây là những cảnh ASTER liền kề từ vùng Kilimanjaro phía nam và mục tiêu của tôi là đặt chúng lại với nhau để có được một hình ảnh lớn.Hợp nhất nhiều raster trong R

Đây là những gì tôi có cho đến nay (object 'ast14dmo' đại diện cho một danh sách các đối tượng RasterLayer):

# Loop through single ASTER scenes 
for (i in seq(ast14dmo.sd)) { 
    if (i == 1) { 
    # Merge current with subsequent scene 
    ast14dmo.sd.mrg <- merge(ast14dmo.sd[[i]], ast14dmo.sd[[i+1]], tolerance = 1) 
    } else if (i > 1 && i < length(ast14dmo.sd)) { 
    tmp.mrg <- merge(ast14dmo.sd[[i]], ast14dmo.sd[[i+1]], tolerance = 1) 
    ast14dmo.sd.mrg <- merge(ast14dmo.sd.mrg, tmp.mrg, tolerance = 1) 
    } else { 
    # Save merged image 
    writeRaster(ast14dmo.sd.mrg, paste(path.mrg, "/AST14DMO_sd_", z, "m_mrg", sep = ""), format = "GTiff", overwrite = TRUE) 
    } 
} 

Như bạn chắc chắn đoán, mã hoạt động. Tuy nhiên, việc sáp nhập mất khá lâu để xem xét rằng mỗi đối tượng raster đơn là 70 mb lớn. Tôi cũng đã cố gắng giảm và do.call, nhưng điều đó đã thất bại vì tôi không thể vượt qua đối số 'khoan dung' mà circumvents nguồn gốc khác nhau của các tập tin raster.

Bất kỳ ai có ý tưởng về cách tăng tốc mọi thứ?

Trả lời

10

Hoặc sử dụng do.call

ast14dmo.sd$tolerance <- 1 
ast14dmo.sd$filename <- paste(path.mrg, "/AST14DMO_sd_", z, "m_mrg.tif", sep = "") 
ast14dmo.sd$overwrite <- TRUE 
mm <- do.call(merge, ast14dmo.sd) 

hoặc ở đây, cho ví dụ trong raster :: merge

r1 <- raster(xmx=-150, ymn=60, ncols=30, nrows=30) 
r1[] <- 1:ncell(r1) 
r2 <- raster(xmn=-100, xmx=-50, ymx=50, ymn=30) 
res(r2) <- c(xres(r1), yres(r1)) 
r2[] <- 1:ncell(r2) 

x <- list(r1, r2) 
x$filename <- 'test.tif' 
x$overwrite <- TRUE 
m <- do.call(merge, x) 
+0

Giải pháp tuyệt vời là tốt, cảm ơn bạn! Tôi chỉ có một cái nhìn nhanh về thời gian tính toán và hóa ra phương pháp của bạn thông qua 'do.call' hoạt động nhanh gấp đôi' Reduce'. – fdetsch

3

Bạn có thể sử dụng Reduce như thế này ví dụ:

Reduce(function(...)merge(...,tolerance=1),ast14dmo.sd) 
+0

Điều đó đã xảy ra. Cảm ơn nhiều! – fdetsch

3

Chức năng 'hợp nhất' từ gói Raster hơi chậm. Đối với các dự án lớn, tùy chọn nhanh hơn là làm việc với các lệnh gdal trong R.

library(gdalUtils) 
library(rgdal) 

Xây dựng danh sách tất cả các tệp raster bạn muốn tham gia (trong thư mục làm việc hiện tại).

all_my_rasts <- c('r1.tif', 'r2.tif', 'r3.tif') 

Tạo một tệp raster mẫu để xây dựng. Hãy nghĩ về một khung trống lớn để thêm các ô vào.

e <- extent(-131, -124, 49, 53) 
template <- raster(e) 
projection(template) <- '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs' 
writeRaster(template, file="MyBigNastyRasty.tif", format="GTiff") 

Merge tất cả các gạch raster thành một raster lớn.

mosaic_rasters(gdalfile=all_my_rasts,dst_dataset="MyBigNastyRasty.tif",of="GTiff") 
gdalinfo("MyBigNastyRasty.tif") 

này nên làm việc khá tốt cho tốc độ (nhanh hơn so với hợp nhất trong gói raster), nhưng nếu bạn có hàng ngàn gạch thậm chí bạn có thể muốn xem xét việc xây dựng một VRT đầu tiên.

+0

Không có cách nào hiệu quả hơn để thiết lập mức độ mà không đoán lat/long? –