基于FME的等高线赋值正确性检查
痛点场景
等高线赋值错误常见两种情况:一是类型编码(CLASID)给错了——该计曲线的地方给了首曲线编码,或者反过来;二是高程值(ELEV)本身输错了。
传统做法是人工翻图一条条看,费眼又费时。本模板通过 FME 自动完成以上两项检查,把赋值错误的要素批量抓出来。
检查规则说明
适用范围
本文以1:5000 和 1:10000 DLG举例说明,依据 GB/T 20257.2-2017 图式规范。其他比例尺的基本思路一致(按实际等高距和计曲线间隔换算即可),但需调整dgj参数。
涉及的数据
| 数据集 | 说明 |
|---|---|
| DM_DGX_L | 等高线线要素 |
| 关键字段 | CLASID(类型编码)、ELEV(高程值) |
| 参数 | dgj(等高距)、sqx_code(首曲线编码)、jqx_code(计曲线编码) |
核心逻辑
依据GB/T 20257.2-2017《国家基本比例尺地图图式 第2部分:1:5000 1:10000地形图图式》第4.7.1条:
计曲线是指"从高程基准面起算,每隔四条首曲线(当基本等高距采用2.5m时,则每隔三条)加粗一条的等高线"。
由此得出计曲线间隔的计算规则:
| 基本等高距 | 国标描述 | 计曲线间隔 |
|---|---|---|
| dgj=2.5m | 每隔三条首曲线加粗一条计曲线 | 4 × dgj =10m |
| dgj=5m/10m等 | 每隔四条首曲线加粗一条计曲线 | 5 × dgj |
检查一:等高线类型编码检查
判断要素的 CLASID 编码是否和它的 ELEV 值匹配:
| CLASID | 正确条件 | 错误类型 |
|---|---|---|
| 首曲线 | ELEV 不能整除计曲线间隔 | 首曲线编码给了计曲线的高程 |
| 计曲线 | ELEV 必须整除计曲线间隔 | 计曲线编码给了首曲线的高程 |
示例(dgj=2.5):
| ELEV | CLASID | 结果 |
|---|---|---|
| 5 | 首曲线 | ✅ 正确 |
| 10 | 首曲线 | ❌ 错误(10可被4×2.5=10整除,应该是计曲线) |
| 10 | 计曲线 | ✅ 正确 |
| 15 | 首曲线 | ✅ 正确 |
检查二:等高线高程赋值检查
所有等高线的 ELEV 值必须是 dgj 的整数倍:
| 条件 | 判断 |
|---|---|
fmod(ELEV, dgj) = 0 | ✅ 高程值正确 |
fmod(ELEV, dgj) ≠ 0 | ❌ 高程值赋错了 |
典型错误:手误多打一位数字(如5.00写成了5.5)、非整倍数输入(如dgj=2.5时ELEV=3.3)等。
综合判断
这条模板两条检查同时执行,一次跑完出两类错误:
要素 → [类型编码检查] → 编码赋值错误 → [高程赋值检查] → 高程值异常两个条件任一不满足,就标记为"等高线赋值错误"输出到结果GDB。
FME实现
Transformer 链总览
GDB读取(DM_DGX_L) ↓ ParameterFetcher(读取等高距dgj、保存路径savpath等参数) ↓ TestFilter(按CLASID分流:首曲线 / 计曲线 / 其他) ├── 首曲线 ─→ Tester_3:判断dgj是否=2.5 │ ├─ PASSED(dgj=2.5)→ Tester_2 │ └─ FAILED(dgj≠2.5)→ Tester_5 │ └── 计曲线 ─→ Tester_4:判断dgj是否=2.5 ├─ PASSED(dgj=2.5)→ Tester └─ FAILED(dgj≠2.5)→ Tester_6 Tester_2 / Tester_5 / Tester / Tester_6 └─ PASSED(报错要素)→ AttributeCreator_12(标记"等高线赋值错误") └─ FAILED(正常要素)→ 终止(不输出)关键 Tester 参数
Tester_3 / Tester_4(标准等高距判断)
条件:@Value(_dgj) = 2.5 分流:PASSED → 走4×dgj逻辑 FAILED → 走5×dgj逻辑首曲线检查 — Tester_2(dgj=2.5)
条件1:@Evaluate(@fmod(@Value(ELEV), 4*@Value(_dgj))) = 0 → 能整除计曲线间隔,编码应该是计曲线 条件2:@Evaluate(@fmod(@Value(ELEV), @Value(_dgj))) ≠ 0 → ELEV不是dgj整数倍,高程赋值错误 逻辑:OR(任一满足即PASSED→报错)首曲线检查 — Tester_5(dgj≠2.5)
条件1:@Evaluate(@fmod(@Value(ELEV), 5*@Value(_dgj))) = 0 → 能整除5倍等高距,编码应该是计曲线 条件2:@Evaluate(@fmod(@Value(ELEV), @Value(_dgj))) ≠ 0 → ELEV不是dgj整数倍,高程赋值错误 逻辑:OR计曲线检查 — Tester(dgj=2.5)
条件1:@Evaluate(@fmod(@Value(ELEV), 4*@Value(_dgj))) ≠ 0 → 不能整除计曲线间隔,编码应该是首曲线 条件2:@Evaluate(@fmod(@Value(ELEV), @Value(_dgj))) ≠ 0 → ELEV不是dgj整数倍,高程赋值错误 逻辑:OR计曲线检查 — Tester_6(dgj≠2.5)
条件1:@Evaluate(@fmod(@Value(ELEV), 5*@Value(_dgj))) ≠ 0 → 不能整除5倍等高距,编码应该是首曲线 条件2:@Evaluate(@fmod(@Value(ELEV), @Value(_dgj))) ≠ 0 → ELEV不是dgj整数倍,高程赋值错误 逻辑:OR对比总结:首曲线与计曲线的判断条件正好相反——首曲线报"能整除计曲线间隔",计曲线报"不能整除计曲线间隔";高程值检查(条件2)两者相同,都是报"不是dgj整数倍"。
输出结果
写入GDB的结果要素字段:
| 字段 | 值 | 说明 |
|---|---|---|
| 问题描述 | "等高线赋值错误" | 错误类型标识 |
| 所在图层 | DM_DGX_L | 源要素类名 |
| GB | 原值 | 国标分类码 |
| CLASID | 原值 | 当前编码 |
| ELEV | 原值 | 当前高程值 |
注意事项
- 本模板查的是编码与高程的匹配关系和高程值是否基本等高距整数倍,不查高程值本身是否"合理"(如5.00误输入为50.0,因50是2.5的整数倍,模运算无法检出)。此类错误可通过相邻等高线高程值比较或叠加DEM数据辅助判断
- 模板针对
DM_DGX_L要素类设计,其他数据源需调整FEATURE_TYPES参数
以上是基于FME的等高线赋值正确性检查的思路和实现,供同行参考。
