使用Rasterio合并重叠栅格时重叠区域出现NoData的问题
问题分析与解决方案
你的合并结果重叠区域显示NoData,核心问题出在NoData值的处理逻辑错误,同时代码存在一些潜在干扰项,以下是具体修正方案:
问题根源
- 反向的NoData替换逻辑:你当前代码是将值为
-9999的像素替换为原栅格的NoData,而非将原栅格的NoData统一设置为-9999,导致rasterio.merge无法正确识别无效像素,合并时自然保留NoData。 - 目录遍历引入无关文件:使用
path.iterdir()会读取/merged/下所有文件,包括后续生成的合并结果文件,可能干扰合并过程。 - 输出元数据未明确NoData:输出栅格时未指定NoData值,导致最终结果的NoData设置不匹配。
修正后的完整代码
import rasterio as rio from rasterio.merge import merge from pathlib import Path # 明确指定要合并的栅格文件,避免混入无关文件 target_files = [ "/merged/east_SSP1_2020_rent_hectare_filtered.tif", "/merged/north_SSP1_2020_rent_hectare_filtered.tif", "/merged/west_SSP1_2020_rent_hectare_filtered.tif", "/merged/south_SSP1_2020_rent_hectare_filtered.tif" ] out_path = "/merged/merged_count.tif" # 统一设置所有栅格的NoData为-9999 for filepath in target_files: with rio.open(filepath, "r+") as src: data = src.read(1) # 将原栅格的NoData值替换为-9999 data[data == src.nodata] = -9999 # 更新栅格的元数据,设置nodata为-9999 src.nodata = -9999 src.write(data, 1) print("已将所有栅格的NoData统一设置为-9999") # 加载要合并的栅格 raster_to_mosaic = [rio.open(fp) for fp in target_files] # 执行合并,指定nodata为-9999 mosaic, output_transform = merge(raster_to_mosaic, method='first', nodata=-9999) # 准备输出元数据 output_meta = raster_to_mosaic[0].meta.copy() output_meta.update({ "driver": "GTiff", "height": mosaic.shape[1], "width": mosaic.shape[2], "transform": output_transform, "nodata": -9999 # 明确指定输出的NoData值 }) # 写入合并结果 with rio.open(out_path, "w", **output_meta) as dst: dst.write(mosaic) # 关闭所有打开的栅格文件 for raster in raster_to_mosaic: raster.close()
关键修正点说明
- 明确目标文件列表:直接指定要合并的4个栅格,避免目录遍历引入无关文件(如已生成的合并文件)。
- 正确的NoData替换:将原栅格中所有等于原NoData的像素替换为
-9999,同时更新栅格元数据的nodata字段,确保rasterio.merge能正确识别无效像素。 - 输出元数据指定NoData:在输出时明确设置
nodata=-9999,保证最终结果的NoData值与合并时一致。 - 手动关闭栅格文件:避免文件句柄泄漏,养成良好的资源管理习惯。
内容的提问来源于stack exchange,提问作者DJSpen
相关产品推荐
相关产品推荐

