合并R中的多个栅格

时间:2013-04-08 10:16:48

标签: r merge 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)
  }
}

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

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

7 个答案:

答案 0 :(得分:17)

您可以使用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)

这里有一些数据,来自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)

答案 1 :(得分:9)

&#39;合并&#39; Raster包中的函数有点慢。对于大型项目,更快的选择是使用R。

中的gdal命令
library(gdalUtils)
library(rgdal)

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

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

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

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

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

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

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

答案 2 :(得分:3)

您可以像这样使用Reduce

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

答案 3 :(得分:0)

我也遇到了同样的问题,所以我用

#Read desired files into R
data_name1<-'file_name1.tif' 

r1=raster(data_name1)

data_name2<-'file_name2.tif'

r2=raster(data_name2)

#Merge files
new_data <- raster::merge(r1, r2)

尽管它没有产生新的合并栅格文件,但它存储在数据环境中并在绘制时产生了合并地图。

答案 4 :(得分:0)

SAGA GIS镶嵌工具(http://www.saga-gis.org/saga_tool_doc/7.3.0/grid_tools_3.html)为您合并数字图层提供了最大的灵活性,并且默认情况下会并行运行!您只需首先将所有栅格/图像转换为SAGA .sgrd格式,然后运行命令行saga_cmd。

答案 5 :(得分:0)

我在尝试将多个栅格相互拼接时遇到了以下问题

In vv[is.na(vv)] <- getValues(x[[i]])[is.na(vv)] :
  number of items to replace is not a multiple of replacement length 

正如@Robert Hijmans 所指出的,这可能是因为光栅未对齐。为了解决这个问题,我必须先对栅格重新采样

library(raster)

x  <- raster("Base_raster.tif")
r1 <- raster("Top1_raster.tif")
r2 <- raster("Top2_raster.tif")

# Resample
x1 <- resample(r1, crop(x, r1))
x2 <- resample(r2, crop(x, r2))

# Merge rasters. Make sure to use the right order
m <- merge(merge(x1, x2), x)

# Write output
writeRaster(m,
            filename = file.path("Mosaic_raster.tif"),
            format = "GTiff",
            overwrite = TRUE)

答案 6 :(得分:0)

我已经使用 Matthew Bayly 提出的 gdalUtils 测试了该解决方案。它工作得很好而且很快(我有大约 1000 张图像要合并)。但是,在检查了 mosaic_raster 函数 here 的文档后,我发现它可以在拼接图像之前不制作模板光栅。我粘贴了以下文档中的示例代码:

outdir <- tempdir()
gdal_setInstallation()
valid_install <- !is.null(getOption("gdalUtils_gdalPath"))
if(require(raster) && require(rgdal) && valid_install)
{
layer1 <- system.file("external/tahoe_lidar_bareearth.tif", package="gdalUtils")
layer2 <- system.file("external/tahoe_lidar_highesthit.tif", package="gdalUtils")
mosaic_rasters(gdalfile=c(layer1,layer2),dst_dataset=file.path(outdir,"test_mosaic.envi"),
    separate=TRUE,of="ENVI",verbose=TRUE)
gdalinfo("test_mosaic.envi")

}