基于FME的高程点与等高线矛盾检查

📅 2026/6/23 12:21:52
基于FME的高程点与等高线矛盾检查
基于FME的高程点与等高线矛盾检查痛点场景地形图中高程点记录了该位置的地面高程等高线反映了地形起伏趋势。按理说高程点的高程值应该在它所在的等高线区间之内——比如某条等高线高程为10m、相邻一条为15m那夹在中间的高程点高程应该在10~15m之间。但实际生产中常有这种情况高程点的ELEV值和它周围的等高线高程不一致比如点标了20m但周围的等高线才5m和10m。这种点线矛盾是 DLG 质检中的常见问题靠人工逐图幅排查非常费时。本文介绍如何通过 FME 自建自定义转换器实现点线矛盾的批量自动检查。检查规则说明适用的数据数据层说明DM_DGX_L等高线ELEV 记录高程值DM_GCZJD_P高程点ELEV 记录高程值CLASID编码字段用于区分要素类型涉及的参数参数默认值说明gccode0702010010高程点的 CLASID 编码dgxcode0701010220,0701010120等高线的 CLASID 编码tkcode0102010020内图廓编码限定检查范围xjcode0605020120县界编码可选排除行政边界干扰核心思路等高线之间围合成面落到面内的高程点其 ELEV 应在组成该面的等高线高程范围之内。超出范围即为点线矛盾。网格化的原因等高线是开曲线大量不与图廓相交直接构面会在不闭合区域失效。采用350m 网格制造闭合条件——网格四边是闭合框等高线穿进网格后必然与网格边界相交形成闭合条件保证每个高程点都能定位到有明确等高线高程边界的包围面。网格大小是经验值太小了网格内可能没有等高线或只有单条构不出有效面大量区域无法判断太大了起不到人工闭合的效果接近不网格化。350m 在 1:10000 数据上是经验值可根据等高线密度适当调整。FME实现整体流程如下流程结构TestFilter → 按CLASID分流 ├── 高程点 → Tester确认编码 → SpatialFilter(Candidate) ├── 等高线 → 2DGridAccumulator(350m网格) → GeometryCoercer(转线) → Intersector │ └── 直接 → Intersector原始等高线本身 ├── 内图廓 → Intersector └── 县界 → Intersector Intersector → AreaBuilder线转面List Name设为E{}收集ELEV属性 ↓ ListDuplicateRemover去重 ↓ ListConcatenator拼接为逗号分隔字符串→_concatenated ↓ SpatialFilterBASE面Candidate高程点 ↓ PASSED PythonCaller ↓ Tester筛选flag点线矛盾 ↓ AttributeCreator(问题描述点线矛盾) ↓ FeatureWriterPythonCaller 核心代码ListConcatenator 将去重后的E{}.ELEV拼接为逗号分隔字符串_concatenatedAreaBuilder 记录方向时会在列表中混入无高程值的 opposite 项拼接能天然跳过空值避免遍历列表时处理这些干扰项SpatialFilter 把该属性合并到高程点上PythonCaller 直接读definput(self,feature):try:elevsfeature.getAttribute(_concatenated)elevfeature.getAttribute(ELEV)# 高程值缺失 → 标矛盾ifelevisNoneorstr(elev).strip():feature.setAttribute(flag,点线矛盾)self.pyoutput(feature)returnelevfloat(elev)# 没有边界高程信息 → 无法判断ifnotelevsor,notinelevs:feature.setAttribute(flag,无法判断)self.pyoutput(feature)returnelev_values[float(v)forvinelevs.split(,)]# 只有两条等高线夹出的面才做判断iflen(elev_values)!2:feature.setAttribute(flag,无法判断)self.pyoutput(feature)returne0,e1elev_values[0],elev_values[1]min_eleve0ife0e1elsee1 max_eleve1ife0e1elsee0ifmin_elevelevmax_elev:feature.setAttribute(flag,正常)else:feature.setAttribute(flag,点线矛盾)exceptException:feature.setAttribute(flag,无法判断)self.pyoutput(feature)defclose(self):pass判断逻辑说明两条等高线→ 范围明确做开区间判断单条或≥3条→ 无法确定准确区间标无法判断交人工复核ELEV 为空→ 高程点数据本身有问题标点线矛盾输出结果字段说明问题描述“点线矛盾”所在图层源要素类名layerpoint_contradictionGB国标分类码CLASID要素编码以上是基于FME的高程点与等高线矛盾检查的思路和实现供同行参考。