我一直在努力找到一种时间有效的方法来合并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,但是由于我无法通过绕过光栅文件不同来源的“容差”这个参数而失败了。
有人知道如何加快速度吗?
答案 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")
}