DEM, 数字高程模型在测绘领域, GIS 领域少不了的一种数据, 其获取方式和精度随着技术的成熟多种多样在大范围面积下, 航拍是个不错的选择但是这么大的范围下肯定分幅很多张影像图, 那怎么批量检测 DEM 的精度呢? 可以用 Python 来实现
实验准备:
一分幅 DEM
二准备检测点, 且检测点根据 DEM 同样分幅
关于获取检测点, 方法同样有很多, 但比较常用的是用 GPS 到实地测量, 现场采集高程点, 根据 DEM 的分幅, 每幅尽量均匀分幅, 疏密适中, 具体要求可参考检测 DEM 的相关规范
三把 GPS 测量点转为 shp 格式的点要素文件其方法可以导入 CAD 生成 DWG 文件, 再用 ArcMap 转为 shp 格式
四打开 Python IDE,Ctrl+N 新建 File
输入代码:
(代码原创, 需要留言, 主要讲解相关 arcpy 中的函数)
运行结果生成 CG.shp 且属性表已计算差值
原理: 主要使用 arcpy.sa.ExtractValuesToPoints() 方法来检测这个方法的功能是把 GPS 测量采集的检测点叠加到检查 tif 格式的 DEM 影像上, 然后提取在 DEM 上叠加的检测点同位置的高程值, 然后在属性表中计算差值, 然后做平差或相关统计来评估 DEM 的精度如上图计算成果 height 字段是检测点测量的高程值, RASTERVALU 字段是在 DEM 上提取过来的高程值, 系统自行添加该字段而 Difference 字段是后来添加的字段, 通过简单的字段计算计算两高程值之差
知识小点:
arcpy.env.workspace=path 当前工作空间的环境设置, 在前面设好路径, 接下来需要用到输入或输出路径的参数就不必再填具体的路径了参数 path 是 数据输入或输出的默认位置
arcpy.ListRasters({wild_card}, {raster_type}) 返回工作空间中栅格数据的列表函数 wild_card 可选参数, 用结果限制返回, 如 as * 就回返回带 as 字母的名字的栅格数据, 默认返回所有 raster_type 返回栅格的文件格式, 有 JPG,TIF,PNG 等格式
arcpy.ListFeatureClasses({wild_card}, {feature_type}, {feature_dataset}) 返回工作空间的要素类
其参数与 ListRasters() 方法差不多, feature_type 可选参数可在 Pyyhon 中 print arcpy.ListFeatureClasses.__doc__查看
arcpy.sa.ExtractValuesToPoints((in_point_features, in_raster, out_point_features, {interpolate_values}, {add_attributes}) Spatial Analyst 模块下的分析工具, 是用点要素提取栅格像元值, 并把这些值保存到输出要素中
参数:
in_point_features 必选参数是用于提取像元的点要素
in_raster 必选参数是被提取的栅格数据
out_point_features 必选参数是把提取值保存输出要素的保存路径和要素名称, 其余可用.__doc__方法查看还有注意的是用法
(以下截图来自官方帮助文档: http://desktop.arcgis.com/zh-cn/arcmap/latest/tools/spatial-analyst-toolbox/extract-values-to-points.htm)
arcpy.management.AddField(in_table, field_name, field_type, {field_precision}, {field_scale}, {field_length}, {field_alias}, {field_is_nullable}, {field_is_required}, {field_domain}) 向要素添加字段的方法参数非常多, 还可以用__doc__方法查看
参数: in_table 需要添加字段的要素表
field_name 添加字段的名称
field_type 添加字段的类型
问题延伸一下, 能否把这个方法应用到等高线的精度检测呢? 把绘制等高线的高程点生成 DEM, 再利用这个方法, 但不知道能不能符合相关规范
来源: http://mp.weixin.qq.com/s/QmtTcO_8yrahPrYigNbmfA