当前位置: 首页 > news >正文

基于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) ↓ SpatialFilter(BASE=面,Candidate=高程点) ↓ PASSED PythonCaller ↓ Tester筛选flag="点线矛盾" ↓ AttributeCreator(问题描述="点线矛盾") ↓ FeatureWriter

PythonCaller 核心代码

ListConcatenator 将去重后的E{}.ELEV拼接为逗号分隔字符串_concatenated(AreaBuilder 记录方向时会在列表中混入无高程值的 opposite 项,拼接能天然跳过空值,避免遍历列表时处理这些干扰项),SpatialFilter 把该属性合并到高程点上,PythonCaller 直接读:

definput(self,feature):try:elevs=feature.getAttribute('_concatenated')elev=feature.getAttribute('ELEV')# 高程值缺失 → 标矛盾ifelevisNoneorstr(elev).strip()=='':feature.setAttribute('flag','点线矛盾')self.pyoutput(feature)returnelev=float(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,e1=elev_values[0],elev_values[1]min_elev=e0ife0<e1elsee1 max_elev=e1ife0<e1elsee0ifmin_elev<elev<max_elev:feature.setAttribute('flag','正常')else:feature.setAttribute('flag','点线矛盾')exceptException:feature.setAttribute('flag','无法判断')self.pyoutput(feature)defclose(self):pass

判断逻辑说明

  • 两条等高线→ 范围明确,做开区间判断
  • 单条或≥3条→ 无法确定准确区间,标"无法判断"交人工复核
  • ELEV 为空→ 高程点数据本身有问题,标"点线矛盾"

输出结果

字段说明
问题描述“点线矛盾”
所在图层源要素类名
layerpoint_contradiction
GB国标分类码
CLASID要素编码

以上是基于FME的高程点与等高线矛盾检查的思路和实现,供同行参考。

http://www.gsyq.cn/news/1579336.html

相关文章:

  • 让Mac应用保持最新:Latest使用全攻略
  • 10 分钟搭好语音 AI Agent,LiveKit 凭什么成为 OpenAI 的基建选择
  • Emacs AI助手:3个理由让你在编辑器中体验大型语言模型的强大能力
  • 前后端分离德州酒吧小程序:存酒管理、扫码点单、在线组局逻辑代码拆解
  • 承接定制AI智能控制会议医疗录播主机
  • RAG 检索精度优化之道:数据清洗与预处理全流程深度解析
  • 【AI原生LoRA技术权威指南】:SITS 2026低秩适配全栈解析——覆盖训练、部署、量化3大实战瓶颈
  • Reproxy:微服务时代边缘代理的终极解决方案
  • DFIG双馈风机、低电压穿越LVRT+转子侧快速短接、网侧矢量补偿控制仿真(带参考文献)
  • 基于KNN算法的健身会员个性化锻炼与饮食方案推荐研究
  • 维铂叁科普知识丨数字防伪印章
  • 从概念验证到百万QPS商用:3家头部AI OS厂商同步采用的插件生命周期管理模型(含GitHub Star超2.4k的开源参考实现)
  • RTKLIB中关于不同的码通道
  • 单模型采样的统计学本质与系统性偏差分析 | 上篇单模型采样的统计学本质与系统性偏差分析 | 上篇
  • 2026 降AI率工具实测对比:公认好用的,科研党救急指南
  • 作为宝妈研究者我给孩子选的脑营养不是最贵的是最对的
  • 为什么92%的AI中台项目在Adapter层失败?20年架构老兵亲授6个反模式诊断清单与即时修复checklist
  • 硬核科技+柔性创新”2026第三代半导体与柔性电子展会抢先看
  • 如何将iPhone上的联系人AirDrop到iPhone上?
  • 表面等离子共振SPR技术结果解析
  • 2026年教师破局指南:老师应该考什么证有用?系统提升路径与核心能力全解析
  • 【小白向】新手快速拥有桌面 AI,虾壳云一键部署 OpenClaw v2.7.9 全程自动配置(最新安装包)
  • 餐桌转盘无刷电机驱动板应用技术与优势解析
  • 鸿蒙6.0应用开发——自动化测试框架开发
  • Java项目版本自增+打包上传服务器部署脚本
  • 收藏!CAD高手都在用的6个实用功能,看图改图效率拉满
  • 20260622AA
  • 好用的角膜塑形镜哪个公司好
  • WecomApi 看 AI 与 CRM 深度绑定的工程实践如何避免沦为“死板复读机”?
  • 5款超实用格式转换工具实测|办公、影音、苹果设备全覆盖