编辑2023-06:使用terra::vrt()
或terra::mosaic()
由于gdalUtils
似乎已经有一段时间没有维护了,您可以使用与我原始答案类似的方法,只需使用更为更新的terra
包,该包是raster
包的继任者:
library(terra)
vrt(
x = list.files(path = "folder/to/images", pattern = "*.tif$", full.names = TRUE),
filename = "dem.vrt"
)
dem <- rast("dem.vrt")
另一种可能性是使用
terra::mosaic()
。这样可以更好地控制重叠像素的聚合函数。首先,您需要使用
sprc()
从
rast
对象列表创建一个栅格集合,然后使用
mosaic
将它们合并成一个栅格。
library(terra)
fls <- list.files("your/folder", ".tif$", full.names = TRUE)
r_lst <- lapply(fls, rast)
coll <- sprc(r_list)
mosaic(coll, function = "mean")
使用gdalUtils
的原始答案
您可以利用强大的GDAL
函数。根据我的经验,这些函数比纯R代码要快得多。
我的方法是使用library(gdalUtils)
:
首先,构建一个虚拟栅格文件(vrt):
library(gdalUtils)
setwd(...)
gdalbuildvrt(gdalfile = "*.tif",
output.vrt = "dem.vrt")
然后,将虚拟栅格复制到实际物理文件中:
gdal_translate(src_dataset = "dem.vrt",
dst_dataset = "dem.tif",
output_Raster = TRUE
options = c("BIGTIFF=YES", "COMPRESSION=LZW"))
另一个纯粹(可能更慢)的光栅包解决方案是:
f <- list.files(path = "your/path", pattern = ".tif$", full.names = TRUE)
rl <- lapply(f, raster)
do.call(merge, c(rl, tolerance = 1))
你需要调整“容差”,因为光栅文件可能没有相同的起点。
do.call(merge, a)
,而且merge
函数没有fun
参数。 - akrunReduce(function(...) merge(...), a)
。 - akrunraster
中的?merge
,则示例可以使用do.call(merge, x)
运行,并且我也没有找到任何fun
参数。 - akrun