如何拼接/合并相邻的两个RasterStack栅格地图?
尝试合并两个相邻区域的Sentinel卫星RasterStack数据,已将坐标系设置为EPSG:3857,希望合并后在同一张图中展示。
使用的代码:
MergedMap<-merge(StackedBands1,StackedBands3,tolerance=0.05, filename="MergedMap",overlap=FALSE,ext=NULL,overwrite=TRUE)
其中StackedBands1为区域1的4个不同Sentinel波段图层,StackedBands3为区域2的4个不同Sentinel波段图层。
执行代码后生成了RasterBrick,但绘图时出现错误,同时有50条以上警告,具体报错信息如下:
MergedMap<-merge(StackedBands1,StackedBands3,tolerance=0.05,filename="MergedMap",overlap=FALSE,ext=NULL,overwrite=TRUE) There were 50 or more warnings (use warnings() to see the first 50) > plotRGB(MergedMap, r=4,g=3,b=2, axes = TRUE, stretch = "lin", main = "False Color Composite") Error in if (x@file@nodatavalue < 0) { : missing value where TRUE/FALSE needed > warning(MergedMap) Warning message: brick(ncol=10980, nrow=10980, nl=4, xmn=0, xmx=10980, ymn=0, ymx=10980, crs='+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs')
原本考虑用QGIS处理,但希望能在R中解决问题。请问是否需要修改栅格的范围?或者我的代码存在什么问题?
从报错和警告来看,核心问题是合并后的栅格缺失NoData值定义,导致plotRGB进行逻辑判断时出现值缺失错误;而合并时的大量警告,大概率是两个栅格的对齐精度设置不合理导致的。可以按以下步骤修复:
检查并统一输入栅格的NoData值
Sentinel数据默认NoData值一般为0或-9999,先确认两个RasterStack的NoData设置:# 查看两个栅格的NoData值 StackedBands1@file@nodatavalue StackedBands3@file@nodatavalue如果其中某一个栅格未设置NoData,用
setNA()统一配置:# 替换为你的实际NoData值,比如0 StackedBands1 <- setNA(StackedBands1, value=0) StackedBands3 <- setNA(StackedBands3, value=0)调整merge参数,优化栅格对齐与范围
你设置的tolerance=0.05在EPSG:3857坐标系下仅为0.05米,精度过高会触发大量对齐警告。可以适当调大tolerance(比如1米,匹配Sentinel-2的分辨率精度),同时显式指定合并后的范围,避免默认范围异常:# 获取两个栅格的联合范围 combined_ext <- extend(extent(StackedBands1), extent(StackedBands3)) # 重新执行合并 MergedMap <- merge(StackedBands1, StackedBands3, tolerance=1, filename="MergedMap", overlap=FALSE, ext=combined_ext, overwrite=TRUE)修复合并后栅格的NoData值
如果合并后的MergedMap仍未定义NoData,手动设置或重新写入文件时指定:# 方法1:直接修改对象属性 MergedMap@file@nodatavalue <- 0 # 对应你之前设置的NoData值 # 方法2:重新写入文件并指定NA标记 writeRaster(MergedMap, filename="MergedMap_fixed.tif", overwrite=TRUE, NAflag=0) # 读取修复后的文件 MergedMap <- brick("MergedMap_fixed.tif")验证并绘图
先确认合并后栅格的信息是否正常:print(MergedMap)确认NoData值存在后,再执行绘图命令:
plotRGB(MergedMap, r=4,g=3,b=2, axes=TRUE, stretch="lin", main="False Color Composite")
另外,合并前可以检查两个栅格的分辨率是否完全一致:
res(StackedBands1) res(StackedBands3)
如果分辨率有细微差异,先用resample()统一分辨率后再合并。
内容的提问来源于stack exchange,提问作者Johnny

