
基于FME的伪节点检查伪节点Pseudo-node指的是图上一段连续的线被人为打断成两段——两条线端点坐标完全一致、属性相同本应合成一条线却在生产过程中被断开。FME 做的就是把这些伪节点通过端点叠置 属性配对自动查出来。检查规则伪节点的判断取决于线的类型普通线—— 两条线端点咬合 属性一致 → 伪节点有向线如单线河流等—— 除端点咬合、属性一致外还要求两条线的方向一致一条的终点接另一条的起点FME 实现本文FME实现的整体流程如图以下只讲核心逻辑部分Reader → 线过滤 → 数据预处理 → 检测 → 输出Reader/Writer 部分每个工作空间大同小异。1. 线要素过滤读入线图层后先用 GeometryFilter 筛掉非线几何点、面、注记等混入的再用 ClosedCurveFilter 剔除闭合线闭合线没有伪节点可以检查只保留非闭合的折线进入后续流程。2. 属性匹配参数参与匹配的字段如GB国标分类码、CLASID要素分类编码、NAME名称、ELEV高程值、fme_feature_type源图层名等可根据实际情况选择。通过命令行参数$(line_attrs)传入工作空间。注意这里的传递链路命令行宏$(line_attrs)不能直接用在 Matcher 或 AttributeConcatenator 里编译期展开后会被当成字面字符串处理必须经 ParameterFetcher 拉入数据流生成属性_attrs。AttributeConcatenator 的 ATTRS 参数填Value(_attrs)才能正确读到字段名列表逐个提取字段值后用逗号拼接成_attrvs最终由 Matcher 匹配这个属性字符串。参数传递链路 --line_attrs GB CLASID NAME ELEV fme_feature_type ↓ ParameterFetcher → 数据流属性 _attrs GB CLASID NAME ELEV fme_feature_type ↓ AttributeConcatenator: ATTRS Value(_attrs) → 读取 5 个字段的值逗号拼接 → 数据流属性 _attrvs gb值,clasid值,name值,高程值,图层名 ↓ Matcher: MATCHATTRS _attrvs3. 起点终点坐标提取利用CoordinateExtractor 提取线段起、终点坐标输出两条属性以2D举例_x1/_y1— 起点坐标_x2/_y2— 终点坐标4. 生成端点要素利用 VertexCreator AttributeCreator 转换坐标属性为点新建PointType属性作标识StartPoint/EndPoint通道读取坐标创建点标注起点_x1/_y1VertexCreatorAttributeCreator →PointType StartPoint终点_x2/_y2VertexCreator_2AttributeCreator_2 →PointType EndPoint每个原始线要素被拆成 2 个点要素各自携带参与匹配的字段和PointType点类型属性。5. 点叠置分析PointOnPointOverlayer 同时接收起点和终点两个端口设置容差0.001根据实际需求输出_overlaps表示该位置上除自身外还有几个其他端点。6. 重叠端点筛选 几何配对FME 2020 的 PointOnPointOverlayer 中_overlaps记录的是该位置除了自己之外还有几个端点。值为 1 时表示该位置共有 2 个端点刚好构成伪节点的候选条件。值为 0 为悬挂点值大于1表示多段线交汇不在此次检查范围内。这步筛选后的点进入 Matcher。Matcher 做 2D 几何匹配MATCH_GEOMETRY 2D容差同样0.001属性匹配作用于 AttributeConcatenator 拼接后的_attrvs属性包含 5 个字段的拼接值。注意此处需要新建列表P{}用于将配对的两条端点的 PointType 存入列表名可自定义。7. 分路判断与标记匹配成功的配对进入两层 Tester 分流Tester_2— 区分有向线和普通线。$(yxx_code)参数传入有向线的 CLASID 编码列表PASSEDCLASID 在有向线范围内 → 进入 Tester_3 验证方向FAILED非有向线 → 直接送去标记伪节点不需要做方向验证Tester_3— 有向线的方向验证。判断P{0}.PointType ! P{1}.PointTypePASSED配对的两个端点一个是起点、一个是终点→ 两条线的方向一致 → 真伪节点标记输出FAILED配对的两个端点同向→ 有向线在该点处方向矛盾首对首或尾对尾另一种错误标记输出此处注意区分伪节点是线被打断但方向能衔接方向矛盾是两条本应首尾相接的有向线出现了首首/尾尾相接属于有向线特有的错误。最后 AttributeCreator_3 写入检查结果属性Writer 输出到指定 Geodatabase。注意事项容差匹配— PointOnPointOverlayer 和 Matcher 的容差保持一致0.001两者不一致会导致 geometry match 通过但 overlay 没识别产生误报。属性拼接链路— 命令行参数经 ParameterFetcher 拉入数据流后AttributeConcatenator 用Value(_attrs)读取字段名列表再拼接成_attrvs给 Matcher。不能用$(line_attrs)直接填进 AttributeConcatenator——宏展开后被当字符串处理不会做字段拼接。闭合线处理— 闭合线没有伪节点提前用 ClosedCurveFilter 排除以减少运算量。yxx_code参数— 在此填写有向线的 CLASID 编码多个用,分隔Tester_2 用来区分有向线和普通线。有向线需额外验证方向一致性非有向线直接判定。FME 转换器参数速查表步骤转换器关键参数备注①线过滤GeometryFilterFROM GeometryFilter_LINE保留 fme_line 几何②闭合线排除ClosedCurveFilterCHECK_CLOSURE_2DCLOSED 跳过OPEN 进下一步③属性拼接AttributeConcatenatorATTRSValue(_attrs) →_attrvs5 字段拼接成属性标识串④坐标提取CoordinateExtractorModeStart and End Points输出_x1/_y1和_x2/_y2⑤创建起点VertexCreator AttributeCreator_x1/_y1→ PointTypeStartPoint带起点坐标的点要素⑥创建终点VertexCreator_2 AttributeCreator_2_x2/_y2→ PointTypeEndPoint带终点坐标的点要素⑦点叠置PointOnPointOverlayerTolerance0.001, MERGE_ATTRSNO检测端点重叠输出_overlaps⑧端点筛选Tester_overlaps 1保留刚好2个端点重叠的位置⑨几何配对MatcherMATCH_GEOMETRY 2D, P{}列表几何属性双重匹配输出 P{} 列表⑩线型分流Tester_2CLASID IN $(yxx_code)有向线→验方向非有向线→直通标记⑪方向验证Tester_3P{0}.PointType ! P{1}.PointType仅对有向线验证方向是否首尾衔接⑫标记输出AttributeCreator_3 4问题描述“存在伪节点” / “有向线在此处方向矛盾”两种错误分别标注伪节点的逻辑很直接——几何位置 多属性匹配 线型分流。非有向线接上就算有向线还要验证方向是否一致。