基于FME的等高线赋值正确性检查

基于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):

ELEVCLASID结果
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的等高线赋值正确性检查的思路和实现,供同行参考。