合并R中的多个栅格

fde*_*sch 16 merge r raster satellite-image

我一直试图找到一种时间有效的方法来合并R中的多个光栅图像.这些是来自乞力马扎罗山南部地区的相邻ASTER场景,我的目标是将它们组合在一起以获得一个大图像.

这是我到目前为止所得到的(对象'ast14dmo'代表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)
  }
}
Run Code Online (Sandbox Code Playgroud)

正如你猜测的那样,代码可行.但是,考虑到每个单个栅格对象大约70 mb,合并需要很长时间.我也尝试过Reduce和do.call,但由于我无法通过绕过光栅文件不同来源的"容差"这个参数,因此失败了.

有人知道如何加快速度吗?

Rob*_*ans 19

或者使用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)
Run Code Online (Sandbox Code Playgroud)

或者在这里,对于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)
names(x) <- c("x", "y")
x$filename <- 'test.tif'
x$overwrite <- TRUE
m <- do.call(merge, x)
Run Code Online (Sandbox Code Playgroud)

  • 尝试“do.call”时出错:`as.data.frame(x) 中的错误:参数“x”丢失,没有默认值`。我尝试过使用“raster::merge”而不是“merge”,但遇到了相同的错误。 (3认同)
  • 由于某种原因,这不适用于命名列表,这可能会很麻烦 (2认同)

Mat*_*yly 9

Raster包中的'merge'功能有点慢.对于大型项目,更快的选择是在R中使用gdal命令.

library(gdalUtils)
library(rgdal)
Run Code Online (Sandbox Code Playgroud)

构建要加入的所有光栅文件的列表(在当前工作目录中).

all_my_rasts <- c('r1.tif', 'r2.tif', 'r3.tif')
Run Code Online (Sandbox Code Playgroud)

制作要构建的模板栅格文件.想想这是一个用来添加瓷砖的大空白画布.

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")
Run Code Online (Sandbox Code Playgroud)

将所有栅格图块合并为一个大栅格.

mosaic_rasters(gdalfile=all_my_rasts,dst_dataset="MyBigNastyRasty.tif",of="GTiff")
gdalinfo("MyBigNastyRasty.tif")
Run Code Online (Sandbox Code Playgroud)

这应该对速度非常有效(比光栅包中的合并更快),但是如果你有数以千计的瓷砖,你甚至可能想要先研究构建一个vrt.

  • 没有更有效的方法来设置范围而不猜测纬度/经度吗? (3认同)

ags*_*udy 6

您可以这样使用Reduce

Reduce(function(...)merge(...,tolerance=1),ast14dmo.sd)
Run Code Online (Sandbox Code Playgroud)