28

我一直在尝试找到一种节省时间的方法来合并 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,但失败了,因为我无法传递绕过光栅文件不同来源的参数“容差”。

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

4

7 回答 7

36

您可以使用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)
names(x) <- c("x", "y")
x$filename <- 'test.tif'
x$overwrite <- TRUE
m <- do.call(merge, x)
于 2013-04-15T04:08:53.933 回答
18

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

这应该可以很好地提高速度(比在 raster 包中合并更快),但是如果您有数千个图块,您甚至可能想先考虑构建一个 vrt。

于 2016-09-18T04:10:21.123 回答
6

例如,您可以Reduce像这样使用:

Reduce(function(...)merge(...,tolerance=1),ast14dmo.sd)
于 2013-04-08T12:27:25.537 回答
3

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

于 2019-07-05T04:52:53.533 回答
2

我已经按照Matthew BaylygdalUtils的建议测试了该解决方案。它工作得很好而且很快(我有大约 1000 张图像要合并)。但是,在检查了此处的功能文档后,我发现它在拼接图像之前无需制作模板光栅即可工作。我粘贴了以下文档中的示例代码:mosaic_raster

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

}

于 2021-01-02T09:40:34.893 回答
1

我遇到了同样的问题,我使用了

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

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

于 2019-02-11T14:21:03.043 回答
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)
于 2020-12-26T17:31:41.587 回答