在R中合并多个光栅

在R中合并多个光栅,r,merge,geospatial,raster,satellite-image,R,Merge,Geospatial,Raster,Satellite Image,我一直在寻找一种时间效率高的方法来合并R中的多个光栅图像。这些是来自南乞力马扎罗山地区的相邻ASTER场景,我的目标是将它们放在一起以获得一张大图像 这就是我目前得到的(对象“ast14dmo”表示光栅层对象的列表): #在单个ASTER场景中循环 适用于(序号i(ast14dmo.sd)){ 如果(i==1){ #将当前场景与后续场景合并 ast14dmo.sd.mrg 1&&i

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

这就是我目前得到的(对象“ast14dmo”表示光栅层对象的列表):

#在单个ASTER场景中循环
适用于(序号i(ast14dmo.sd)){
如果(i==1){
#将当前场景与后续场景合并
ast14dmo.sd.mrg 1&&i<长度(ast14dmo.sd)){

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

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

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

光栅包中的“合并”功能有点慢。对于大型项目,更快的选择是使用R中的gdal命令

library(gdalUtils)
library(rgdal)
生成要加入的所有光栅文件的列表(在当前工作目录中)


这在速度上应该很好(比光栅包中的合并速度快),但是如果你有数千块瓷砖,你甚至可能想先考虑构建一个vrt。

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

#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)
#将所需文件读入R

data_name1SAGA GIS镶嵌工具()为您提供了最大的合并数字图层的灵活性,默认情况下,它并行运行!您只需先将所有光栅/图像转换为SAGA.sgrd格式,然后运行命令行SAGA_cmd。

在尝试将多个光栅重叠镶嵌时,我遇到了以下问题

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

在vv[is.na(vv)]我使用Matthew Bayly提出的
gdalUtils
测试了这个解决方案。它运行得非常好,速度也非常快(我有大约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")

outdir也是一个很好的解决方案,谢谢!我只是快速查看了一下计算时间,结果发现您通过
do.call
的方法的速度几乎是
Reduce
的两倍。由于某些原因,这不适用于命名列表,它可能会很麻烦。在这种情况下,您需要添加这一行,我认为,
names(x)有没有更有效的方法来设置范围而不猜测lat/long?@hermantouthrot:不查看每个单独的文件,要知道合并文件的最终范围,您需要进行(慷慨的)猜测(例如,通过在GIS中打开边界文件)。要获得最终合并文件的确切范围,您可以进行“快速”操作在进行实际合并之前合并数据块。
FINAL_EXTENT=Reduce(函数(d1、d2)merge(数据块(光栅(d1))、数据块(光栅(d2))、光栅列表)
马赛克光栅的一个缺点似乎是无法定义重叠行为。该行为似乎是保留第一个光栅的所有值,即使它们是NA值。
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")
#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)
In vv[is.na(vv)] <- getValues(x[[i]])[is.na(vv)] :
  number of items to replace is not a multiple of replacement length 
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)
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")