在线看seo网站,常见的网站名称有哪些,南京今天的最新消息,wordpress缓存无法清除以下代码基于rasterio读取 / 写入 TIFF、scipy实现插值#xff0c;可对 DEM 中的 0 值#xff08;异常值#xff09;进行邻近插值或反距离加权插值#xff08;IDW#xff09;修复。步骤说明#xff1a;读取 DEM 数据#xff0c;提取有效数据#xff08;非 0 值#xf…以下代码基于rasterio读取 / 写入 TIFF、scipy实现插值可对 DEM 中的 0 值异常值进行邻近插值或反距离加权插值IDW修复。步骤说明读取 DEM 数据提取有效数据非 0 值和待插值的 0 值位置可选两种插值方式邻近插值快速、反距离加权插值更平滑插值修复 0 值区域后保存为新的 TIFF 文件增加数据范围校验确保插值结果在合理区间。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, methodnearest, power2): 修复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]), indexingij) # 有效数据的行列坐标 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, functioninverse_multiquadric, smoothing0, # 无平滑纯IDW kernel_sizeNone ) # 计算IDW权重幂次power interp_values interpolator(interp_points, normpower) 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, methodnearest) # 方法2反距离插值更平滑计算稍慢 # repair_dem_zero_values(input_dem, output_dem, methodidw, power2)依赖安装执行代码前需安装以下库pip install rasterio scipy numpy关键参数说明methodnearest邻近插值速度极快结果为最近有效像素的值适合快速修复idw反距离加权插值结果更平滑符合地形连续性适合对精度要求高的场景。power仅 IDW反距离的幂次默认 2值越大近点对插值结果的影响越大通常取 1-3。clip强制插值结果在 0-5500m 范围内避免插值出现异常值。注意事项若 DEM 中 0 值区域过大无邻近有效数据插值结果可能不准确建议先检查数据有效性地理坐标插值若需基于经纬度 / 投影坐标插值可将rows/cols转换为地理坐标通过transform参数代码中已预留地理变换接口大文件优化若 DEM 文件超大如 GB 级可分块处理参考rasterio的window功能避免内存溢出。验证结果修复后可通过以下方式验证# 读取修复后的数据检查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)})