news 2026/7/21 17:01:30

处理 DEM 数据 0 值插值的 Python 代码

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
处理 DEM 数据 0 值插值的 Python 代码

以下代码基于rasterio读取 / 写入 TIFF、scipy实现插值,可对 DEM 中的 0 值(异常值)进行邻近插值或反距离加权插值(IDW)修复。

步骤说明:
  1. 读取 DEM 数据,提取有效数据(非 0 值)和待插值的 0 值位置;
  2. 可选两种插值方式:邻近插值(快速)、反距离加权插值(更平滑);
  3. 插值修复 0 值区域后,保存为新的 TIFF 文件;
  4. 增加数据范围校验(确保插值结果在合理区间)。
import numpy as np import rasterio from scipy.interpolate import NearestNDInterpolator, RBFInterpolator from rasterio.transform import from_origin def repair_dem_zero_values(input_tif, output_tif, method="nearest", power=2): """ 修复DEM中0值(异常值)的函数 :param input_tif: 输入DEM文件路径(dem.tif) :param output_tif: 输出修复后的DEM文件路径 :param method: 插值方法,可选 "nearest"(邻近插值)或 "idw"(反距离加权) :param power: IDW插值的幂次(默认2,值越大近点权重越高) """ # 1. 读取DEM数据 with rasterio.open(input_tif) as src: dem_data = src.read(1) # 读取第一波段 profile = src.profile # 获取影像元数据(投影、分辨率、变换等) transform = src.transform # 地理变换参数 nodata = src.nodata # 原始nodata值(若有) # 2. 标记有效数据和待插值位置 # 有效数据:非0值(0为异常值),且在合理范围0-5500m valid_mask = (dem_data != 0) & (dem_data >= 0) & (dem_data <= 5500) # 待插值位置:0值且在影像范围内 interpolate_mask = dem_data == 0 # 检查是否有需要插值的点 if not np.any(interpolate_mask): print("无0值需要插值,直接保存原始数据") with rasterio.open(output_tif, "w", **profile) as dst: dst.write(dem_data, 1) return # 3. 提取有效数据的坐标和值 # 获取行列坐标(可转换为地理坐标,此处用行列坐标插值更高效) rows, cols = np.meshgrid(np.arange(dem_data.shape[0]), np.arange(dem_data.shape[1]), indexing="ij") # 有效数据的行列坐标 valid_rows = rows[valid_mask] valid_cols = cols[valid_mask] valid_values = dem_data[valid_mask] # 待插值的行列坐标 interp_rows = rows[interpolate_mask] interp_cols = cols[interpolate_mask] # 组合坐标为N×2的数组(适配scipy插值接口) valid_points = np.column_stack((valid_rows, valid_cols)) interp_points = np.column_stack((interp_rows, interp_cols)) # 4. 执行插值 if method == "nearest": # 邻近插值(快速,适合大区域) interpolator = NearestNDInterpolator(valid_points, valid_values) interp_values = interpolator(interp_points) elif method == "idw": # 反距离加权插值(更平滑,计算稍慢) # 用RBFInterpolator模拟IDW:函数类型选"inverse_multiquadric"等价IDW interpolator = RBFInterpolator( valid_points, valid_values, function="inverse_multiquadric", smoothing=0, # 无平滑,纯IDW kernel_size=None ) # 计算IDW权重(幂次power) interp_values = interpolator(interp_points, norm=power) else: raise ValueError("method仅支持 'nearest' 或 'idw'") # 5. 修正插值结果(确保在0-5500m范围内) interp_values = np.clip(interp_values, 0, 5500) # 6. 替换0值为插值结果 dem_repaired = dem_data.copy() dem_repaired[interpolate_mask] = interp_values # 7. 保存修复后的DEM with rasterio.open(output_tif, "w", **profile) as dst: dst.write(dem_repaired, 1) print(f"修复完成!输出文件:{output_tif}") print(f"插值点数:{len(interp_values)}") print(f"有效数据占比:{np.sum(valid_mask)/dem_data.size*100:.2f}%") # -------------------------- 调用示例 -------------------------- if __name__ == "__main__": # 输入输出路径(根据实际情况修改) input_dem = "dem.tif" # 原始DEM文件 output_dem = "dem_repaired.tif" # 修复后的DEM文件 # 方法1:邻近插值(快速,推荐先试用) repair_dem_zero_values(input_dem, output_dem, method="nearest") # 方法2:反距离插值(更平滑,计算稍慢) # repair_dem_zero_values(input_dem, output_dem, method="idw", power=2)

依赖安装

执行代码前需安装以下库:

pip install rasterio scipy numpy

关键参数说明

  1. method
    • nearest:邻近插值,速度极快,结果为最近有效像素的值,适合快速修复;
    • idw:反距离加权插值,结果更平滑,符合地形连续性,适合对精度要求高的场景。
  2. power(仅 IDW):反距离的幂次,默认 2,值越大,近点对插值结果的影响越大(通常取 1-3)。
  3. clip:强制插值结果在 0-5500m 范围内,避免插值出现异常值。

注意事项

  1. 若 DEM 中 0 值区域过大(无邻近有效数据),插值结果可能不准确,建议先检查数据有效性;
  2. 地理坐标插值:若需基于经纬度 / 投影坐标插值,可将rows/cols转换为地理坐标(通过transform参数),代码中已预留地理变换接口;
  3. 大文件优化:若 DEM 文件超大(如 GB 级),可分块处理(参考rasteriowindow功能),避免内存溢出。

验证结果

修复后可通过以下方式验证:

# 读取修复后的数据,检查0值是否被替换 with rasterio.open("dem_repaired.tif") as src: data = src.read(1) print(f"修复后0值数量:{np.sum(data == 0)}") print(f"数据范围:{np.min(data)} - {np.max(data)}")
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/22 1:36:18

oracle迁移到sqlserver的注意点

迁移工具可以考虑结合&#xff1a; 1.kdts在转换sysdate默认值字段的时候会错误&#xff0c;在sqlserver中可以考虑改用getdate()或sysdatetime()&#xff0c;精度不同。分区表迁移到sqlserver自动转成普通表。 2.ssma for oracle&#xff0c;需vpn下载 https://www.microsof…

作者头像 李华
网站建设 2026/7/21 21:05:37

从零到精通大型语言模型(LLM):一篇必藏的技术全景指南

大型语言模型(LLM)代表从指令编程到学习型智能的范式革命&#xff0c;通过海量文本数据训练而非明确规则。从ELIZA到GPT-4&#xff0c;LLM经历了六个数量级的参数增长。其工作流程包括分词、嵌入和Transformer三个步骤&#xff0c;通过自注意力机制理解语言模式。尽管面临幻觉、…

作者头像 李华
网站建设 2026/7/21 17:23:12

5种可靠方法将数据从iQOO传输到iPhone

您使用iQOO手机已经很久了&#xff0c;在升级到新型号时可以轻松地将数据从一个iQOO设备传输到另一个iQOO设备。现在&#xff0c;您收到了一部全新的iPhone作为礼物&#xff0c;但有一个问题&#xff1a;您不确定如何将所有数据从iQOO传输到新iPhone。手动逐个项目移动所有内容…

作者头像 李华
网站建设 2026/7/21 6:56:10

Java 不“性感”,却最抗压:一门语言如何在高风险系统中长期存活

在技术社区里&#xff0c;Java 很少成为“最受追捧”的语言。它不轻盈、不新潮&#xff0c;也不追求语法层面的惊艳。然而&#xff0c;当系统进入高并发、强一致、高可用的深水区&#xff0c;Java 却一次又一次成为最终选择。这种反差&#xff0c;恰恰揭示了 Java 的真正价值。…

作者头像 李华
网站建设 2026/7/21 19:25:15

5.8W25Q64 实验(下)-嵌入式铁头山羊STM32笔记

实验任务 按钮切换 LED 亮灭&#xff0c;用 W25Q64&#xff08;上图右下角&#xff09;保存 LED 的最后一次亮灭状态&#xff08;亮为 1&#xff0c;暗写 0&#xff09;。 在断电操作下&#xff0c;重新上电后可以保持 LED 在断电前的亮灭状态&#xff08;工业中可用作关键参数…

作者头像 李华