当前位置: 首页 > 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.jsqmd.com/news/1067389/

相关文章:

  • 让Mac应用保持最新:Latest使用全攻略
  • 10 分钟搭好语音 AI Agent,LiveKit 凭什么成为 OpenAI 的基建选择
  • Emacs AI助手:3个理由让你在编辑器中体验大型语言模型的强大能力
  • DFIG双馈风机、低电压穿越LVRT+转子侧快速短接、网侧矢量补偿控制仿真(带参考文献)
  • PCB建议
  • 探索未来能源:离网光伏系统如何改变生活
  • AI工程师必抢的稀缺资源:SITS 2026官方Behavior Cloning Benchmark Kit(含6类真实机器人任务数据集+基线模型权重)
  • 技术实战 | 抗原-TCR亲和力优化:5步突破免疫治疗瓶颈
  • Ricon组态技术架构 - 企业级Web组态解决方案
  • 【无人机】基于MATLAB的航空探空无人机纵向稳定性和俯仰自动驾驶仪设计Simulink仿真
  • RAG 检索精度优化之道:数据清洗与预处理全流程深度解析
  • 承接定制AI智能控制会议医疗录播主机
  • 前后端分离德州酒吧小程序:存酒管理、扫码点单、在线组局逻辑代码拆解
  • Techwiz LCD 1D:宾主效应液晶模式
  • 快捷、网关支付选型指南
  • AI不是从天而降,它经历了七十年三起三落:通过图灵测试读懂AI
  • 【AI原生LoRA技术权威指南】:SITS 2026低秩适配全栈解析——覆盖训练、部署、量化3大实战瓶颈
  • LeetCode 189数组轮转问题详解:辅助数组法与三次翻转法
  • 10个WordPress故障排除场景下的高效诊断与修复方案
  • AI掘金头条新闻系统 (Toutiao News)-删除浏览历史
  • 当 SiC 遇上 3300V:一台国产仪器如何接住第三代半导体的“测试重担“
  • Reproxy:微服务时代边缘代理的终极解决方案
  • Means:基于 .NET 10 打造的开源自部署 S3 兼容对象存储服务
  • BLE 广播 rawBytes 解析说明
  • 二年级下册语文复习1-8单元:口语交际+写话训练(ppt课件)
  • 基于KNN算法的健身会员个性化锻炼与饮食方案推荐研究
  • 90% 运营踩坑:跳过监测直接优化,难怪流量上不去
  • 代码审查与性能诊断实战:用Gemini镜像站对PHP/Java项目进行自动化深度体检
  • 一文读懂主流仓库管理系统,精准选型不踩坑
  • 维铂叁科普知识丨数字防伪印章