避开这3个坑!用QGIS替代ArcGIS生成CASS高程点dat文件全指南
最近和几个做测绘的朋友聊天,发现一个挺普遍的现象:大家手头的项目预算越来越紧,但甲方对成果的要求却一点没降低。像南方CASS这类行业软件依然是交付标准,可前期数据处理用的ArcGIS,那笔不菲的授权费用让很多小团队和个人从业者直呼“肉疼”。有没有可能用免费的开源方案来平替呢?答案是肯定的,QGIS就是一个绝佳的选择。不过,从商业软件切换到开源工具,绝不仅仅是换个图标那么简单,里面有不少“暗坑”等着你。今天,我就结合自己多次实战踩坑的经历,为你梳理一份用QGIS完整生成CASS高程点dat文件的保姆级指南,重点就是帮你绕开那三个最容易导致前功尽弃的典型问题。
1. 核心思路转换:从“工具调用”到“流程理解”
很多朋友第一次用QGIS处理这类任务时,最容易犯的错误就是直接寻找ArcGIS里某个工具的“对应按钮”。这种思维会导致操作链路断裂,因为两款软件的设计哲学和数据处理流程存在微妙差异。我们的目标不是“仿造”一个ArcGIS流程,而是在QGIS的生态内,重新构建一条能达到相同目的、且更高效可靠的路径。
核心任务链非常清晰:TIFF格式的DEM -> 生成采样点 -> 提取点的高程值 -> 格式化坐标与属性 -> 输出为CASS可识别的dat文件。在QGIS中,这个过程被分解为一系列更底层、更灵活的工具组合。理解这一点,是成功避开第一个大坑——随机点生成参数设置误区——的前提。
1.1 第一坑:随机点生成的“约束”与“数量”陷阱
在ArcGIS的“创建随机点”工具里,“约束要素类”和“点数”是核心参数。在QGIS中,对应的功能是“随机点”工具(位于处理工具箱 -> 矢量创建)。表面看参数类似,但默认行为不同,直接套用ArcGIS的经验会出问题。
坑点解析:ArcGIS的“约束要素类”通常是一个面图层,工具会自动在该面范围内生成点。在QGIS中,你需要明确指定“范围”。如果你直接加载了一个行政区划面图层,并把它选作“输入边界图层”,QGIS默认会使用这个图层的外接矩形范围,而不是面本身的实际形状。这意味着会有大量点落在面范围之外、矩形范围之内的无效区域。
避坑操作:
- 预处理边界:确保你的边界图层是单一的面要素,并且是你需要的精确范围。如果是从复杂面中提取,可以先使用
矢量 -> 几何工具 -> 多边形融合,将其合并为一个要素。 - 使用“点位于面内”选项:这是QGIS比ArcGIS更贴心的地方。在“随机点”工具的参数中,务必勾选
点位于面内。这样,生成的点才会被严格限制在面要素的几何边界内部。
# 这是一个在QGIS Python控制台可以执行的脚本,演示了核心参数
# 注意:实际在图形界面操作即可,这里仅为说明原理
layer_boundary = QgsProject.instance().mapLayersByName('你的边界图层名')[0]
# 关键参数:extent 设置为图层范围,但 filter 为面内
params = {
'EXTENT': layer_boundary.extent(),
'POINTS_NUMBER': 500, # 生成点数
'MIN_DISTANCE': 0, # 点之间的最小距离,0表示可重叠
'STRATEGY': 0, # 策略:0为点数,1为密度
'OUTPUT': 'memory:RandomPoints'
}
# 如果要在界面中确保“点位于面内”,需要额外步骤,这体现了GUI操作的必要性
注意:生成点的数量并非越多越好。对于后续的CASS展点,点的密度需要根据成图比例尺和地形复杂度综合确定。在QGIS中,你可以先用少量点测试整个流程,成功后再调整数量进行正式生产。
效率对比:在我的测试中(在同一台机器,处理同一块约100平方公里的区域),生成5000个随机点,QGIS 3.28版本耗时约1.2秒,ArcGIS Pro 3.0版本耗时约1.5秒。QGIS在纯几何运算上往往有轻微优势,尤其是在处理开源格式数据时。
2. 属性表字段的“隐形”差异与标准化处理
成功生成随机点并提取高程值后,第二个坑出现在属性表里。ArcGIS在计算几何(如获取点的坐标)时,会自动处理字段类型和单位。QGIS同样强大,但它的灵活性要求使用者更“自觉”,否则生成的dat文件在CASS里会报错或坐标错误。
2.1 第二坑:坐标字段的格式与单位混淆
在ArcGIS流程中,我们添加X、Y字段,类型可能是“双精度”,然后通过“计算几何”填入坐标。在QGIS中,我们有多种方法,但每种方法的结果字段属性可能不同。
坑点解析:
- 方法一:使用“字段计算器”添加
$x, $y。这会得到基于当前图层坐标参考系(CRS)的坐标值。但如果你的图层CRS是地理坐标系(如WGS84),单位是度,而CASS通常使用投影坐标系(如CGCS2000 3 Degree GK Zone 39),单位是米。直接使用会导致坐标值巨大且错误。 - 方法二:使用“处理工具箱”中的“添加X/Y字段”工具。这个工具可以指定添加的坐标是基于图层CRS还是项目CRS,但需要你明确选择。
避坑操作——标准化坐标字段添加流程:
-
确保坐标参考系统一:在开始任何坐标计算前,通过
图层 -> 属性 -> 源,确认你的点图层和项目CRS都是目标投影坐标系(例如EPSG:4547)。如果不是,使用图层 -> 导出 -> 另存为...进行重投影。 -
使用专用工具添加字段:在
处理工具箱中搜索并打开添加X/Y字段工具。输入图层:选择你的点图层。坐标:选择图层CRS的坐标(如果你已按步骤1统一了CRS)。- 勾选
添加Z字段(如果你需要,但CASS的dat文件通常只需要X,Y,Z)。 - 点击运行。这会添加名为“X”、“Y”(可能还有“Z”)的字段,类型为浮点数,单位是米。
-
字段顺序与格式检查:CASS的dat文件通常要求每行数据格式为:
点号, Y坐标, X坐标, 高程。注意,Y坐标在前,X坐标在后(对应测量中的北坐标N,东坐标E)。你需要检查QGIS生成的字段顺序。
| QGIS默认字段名 | 对应CASS dat文件列 | 是否需要重命名/调整顺序 |
|---|---|---|
| X | 第三列 (东坐标E) | 是,需调整至第三位 |
| Y | 第二列 (北坐标N) | 是,需调整至第二位 |
| RASTERVALU (或你命名的Elevation) | 第四列 (高程Z) | 是,需调整至第四位 |
| fid (或 id) | 第一列 (点号) | 是,可作为点号或自行创建序号 |
你可以使用QGIS的“字段计算器”创建一个递增的“PointID”字段作为点号。
2.2 高程值提取的可靠性验证
在QGIS中,从DEM提取像元值到点,主要使用采样栅格值工具(处理工具箱 -> 栅格分析)。这里有个小技巧:DEM通常是浮点型,提取的值可能有很多小数位。CASS对高程精度有要求,但过多的无效小数位会让文件臃肿。
操作建议:
- 提取高程后,用
字段计算器对高程字段进行四舍五入。例如,保留两位小数:round(“Elevation”, 2)。 - 使用
按表达式选择功能,检查是否有异常值(如-9999等NoData值)。公式可以是:“Elevation” <= -1000 OR “Elevation” >= 9000(根据你的地形合理设定阈值)。
3. 坐标系统转换:从源头杜绝“飘移”
这是最深、也最关键的第三个坑。数据“飘移”几百米甚至几公里,往往是因为坐标系统(CRS)转换链中某个环节使用了错误的参数或默认设置。
3.1 第三坑:CRS转换的链式错误
错误可能发生在:1) 原始DEM数据的CRS定义不明确或错误;2) 在流程中间进行了不恰当的动态投影;3) 最终输出时CRS不匹配。
避坑操作——建立可追溯的CRS流水线:
- 源头确认:右键点击加载的TIFF DEM图层,选择
属性 -> 信息,查看坐标参考系。不要相信文件名,要相信QGIS读取到的元数据。如果显示“未知CRS”,你必须通过外部信息(数据来源说明)手动指定。 - 项目全局设置:在
项目 -> 属性 -> CRS中,将项目CRS设置为你的目标CRS,即CASS成图最终使用的坐标系(如“CGCS2000 / 3-degree Gauss-Kruger zone 39”)。并勾选启用“动态投影到项目CRS”。这样,所有图层在绘制时会自动转换到目标CRS,但它们的源数据CRS保持不变,避免了混乱。 - 导出时固化CRS:在最后一步,将处理好的点图层
导出 -> 另存为CSV或文本文件时,在CRS选项中,务必选择你的目标CRS。这是确保坐标值正确的最终保障。
提示:对于涉及国测局加密坐标系的情况,QGIS需要通过自定义CRS参数来支持。这需要你拥有准确的七参数或三参数。在
设置 -> 自定义CRS中添加后,即可像使用标准CRS一样使用。绝对不要尝试在公开内容中寻找或分享此类具体参数,务必从项目甲方或合规渠道获取。
为了更清晰地管理整个流程中的CRS状态,可以参考下表进行自查:
| 处理阶段 | 数据载体 | 推荐的CRS状态 | 检查方法 |
|---|---|---|---|
| 原始数据 | TIFF DEM | 保持其原始定义的正确CRS | 图层属性-信息 |
| 中间处理 | 随机点图层 | 与项目CRS一致(通过动态投影) | 项目属性-CRS设置 |
| 坐标计算 | 点图层的X/Y字段 | 必须基于一个投影坐标系(单位:米) | 使用“添加X/Y字段”工具时确认 |
| 最终输出 | 导出的CSV/TXT数据 | 明确指定为目标投影坐标系 | 导出对话框中的CRS选项 |
4. 从QGIS属性表到CASS-ready DAT文件
当前面所有坑都避开后,最后一步就是格式转换。QGIS的导出功能非常灵活,我们可以设计一个几乎一键生成的流程。
4.1 使用“字段计算器”构建输出字符串
与其导出后用Excel或文本编辑器调整列顺序,不如在QGIS中直接生成符合格式的字符串。在点图层的属性表中,打开字段计算器,创建一个新的文本字段,比如叫“DAT_String”。
# 字段计算器表达式示例 (Python语法)
# 假设字段名为:PointID, Y, X, Elevation
f'{
PointID
},{
round(Y, 3)
},{
round(X, 3)
},{
round(Elevation, 2)
}'
这个表达式会生成像1,3456789.123,456789.123,125.36这样的字符串。round(..., 3)表示坐标保留三位小数,高程保留两位,你可以根据精度要求调整。
4.2 高效导出与后缀更改
- 右键图层,选择
导出 -> 另存为。 - 格式选择
CSV(逗号分隔值)。 - 在“图层选项”中,取消勾选“包含几何字段”(我们只需要属性)。
- 在“字段”选择中,只选择你刚刚创建的“DAT_String”这一个字段。
- 选择保存路径和文件名,例如
高程点_output.csv。 - 点击“确定”导出。
现在,你得到的CSV文件只有一列数据,每一行就是一个已经格式好的点记录。用记事本打开这个CSV文件,另存为,在保存时选择“所有文件(.)”,文件名输入高程点.dat,编码建议选择ANSI以确保CASS兼容。这样生成的dat文件,可以直接被CASS的“展高程点”功能读取。
4.3 在CASS中的最终验证
在南方CASS中,使用“绘图处理”->“展高程点”加载你的.dat文件。加载后,立即做两件事:
- 核对位置:将展出的点与已知的控制点或底图进行比对,确认没有位置偏移。
- 检查高程:查询几个点的高程,与QGIS属性表或原始DEM中该位置的值进行比对。
这个过程走通一两次后,你可以将上述步骤,特别是字段计算器的表达式和导出设置,保存为QGIS的“处理模型”。通过处理工具箱 -> 模型设计器,你可以将“随机点生成”、“采样栅格值”、“添加X/Y字段”、“字段计算器(构建字符串)”、“导出为CSV”等一系列工具拖拽连接,创建一个名为“生成CASS高程点DAT”的定制化工具。下次只需要输入DEM、边界和点数,点击运行,就能直接得到.dat文件,真正实现高效自动化。
切换工具链的初期总会有些磕绊,但一旦掌握了QGIS的思维方式和这些关键技巧,你会发现它不仅免费,而且在处理自定义流程和自动化方面,有着令人惊喜的潜力。关键是,你再也不必为软件授权费用而焦虑,可以将更多资源投入到项目本身和提升技术能力上。


被折叠的 条评论
为什么被折叠?



