如何解决R中合并DEM栅格时的替换长度不匹配错误?
解决R中合并Copernicus DEM栅格的错误问题
错误成因分析
从你提供的栅格信息和代码来看,错误number of items to replace is not a multiple of replacement length主要来自两个问题:
- 参数传递方式错误:你直接给栅格列表
allrasters添加na.rm和tolerance属性,这会让do.call把这些参数当成待合并的栅格对象传入merge函数,导致函数逻辑混乱。 - 边缘栅格对齐问题:第一个栅格
eu_dem_v11_E00N20.tif是区域边缘切片,列数仅562,远小于其他栅格的10000列,尽管分辨率和CRS一致,但像素行列的对齐精度不足,导致合并时填充像素值的数量不匹配。
解决方案
方案1:修正参数传递方式
把栅格列表和合并参数分开传递,确保merge函数正确识别参数:
library(raster) setwd("D:/Europe_study_data/Raw data/DEM/Europe/DEM_100m/") rasters = list.files(path = "./", pattern = ".tif$", full.names = T, recursive = F) allrasters <- lapply(rasters, raster::raster) # 正确传递合并参数:用c()把栅格列表和参数列表组合 DEM_mosaic = do.call(raster::merge, c(allrasters, list(na.rm = TRUE, tolerance = 0.5)))
方案2:处理边缘栅格的对齐问题
对边缘栅格进行重采样,使其行列结构与其他标准栅格一致:
library(raster) setwd("D:/Europe_study_data/Raw data/DEM/Europe/DEM_100m/") rasters = list.files(path = "./", pattern = ".tif$", full.names = T, recursive = F) allrasters <- lapply(rasters, raster::raster) # 以第二个标准栅格为模板,重采样第一个边缘栅格 template <- allrasters[[2]] allrasters[[1]] <- resample(allrasters[[1]], template, method = "bilinear") # 再执行合并 DEM_mosaic = do.call(raster::merge, c(allrasters, list(na.rm = TRUE, tolerance = 0.5)))
方案3:改用terra包(更高效稳定)
raster包已逐步被terra替代,后者处理大型栅格时更高效,且合并逻辑更健壮:
library(terra) setwd("D:/Europe_study_data/Raw data/DEM/Europe/DEM_100m/") rasters = list.files(path = "./", pattern = ".tif$", full.names = T, recursive = F) allrasters <- lapply(rasters, terra::rast) # 合并栅格 DEM_mosaic <- merge(sprc(allrasters), na.rm = TRUE) # 保存结果(可选) writeRaster(DEM_mosaic, "DEM_mosaic.tif", overwrite = TRUE)
内容的提问来源于stack exchange,提问作者user947548
相关产品推荐
相关产品推荐

