前段时间,群友在群内咨询了一个FME的技术问题,需求是将CAD中的复合线中的线段和弧段分离出来,具体样例如图1所示,图中红圈部分是弧段,需要单独分离出来。
图1 需求样例
此类需求以前未遇到过,于是使用CAD编辑了两个测试要素,经过测试,使用FME解决了需求,使用的转换器也不常见,FME初学者的学习方式一般考虑不到此类思路,难以入手,特将相关思路整理归纳,希望对FME爱好者有所启发。
学习FME的同学都知晓,FME支持的几何要素非常多,经过查询帮助文件,FME常见的几何要素主要有点、线、面、曲线、表面、实体、栅格、点云以及多几何(聚合体)等。
图2 FME常见几何要素
本次的需求是要将弧段分割出来,因此第一考虑是使用几何要素拆分的转换器,依据几何要素类型的不同,几何拆分的转换器也不尽相同。对于要素类型的不同,采用的转换器也不一致,其中分类几何类型的转换器为GeometryFilter,转换器功能如下:
根据几何类型输出要素。
进入转换器的每个要素都通过端口输出到相应的 fme type。每个输出要素都拥有完整的、未改变的源要素属性和几何类型。
对于聚合要素,需要将聚合类要素分离,需要使用Deaggregator转换器将多几何要素分离成独立要素,该转换器功能如下:
分解聚合体要素成其组成部分。
每个输出要素的属性都完全复制于源要素的属性
本次需求是需要将线与弧段分开,一般的理解是认为该要素是线段和弧段的聚合要素,可以采用聚合打散转换器分离要素,但是提出问题的同学已经测试了不属于此类原因,如果采用节点拆分的方法也不可行,那么就需要进一步分析数据。
1. 数据分析
FME分析数据,一般的分析方法就是将数据输出至查看器界面查阅信息,能够查看到数据的结构、属性等详细信息。测试数据如图3所示:
图3 线段与弧段组合要素
图4 面状数据结构
图5 线状数据结构
1. 分析结果
对照图4和图5,我们能清晰发现,CAD中的复合线在FME中的数据结构如下:对于线状数据,复合线的Line、Arc等数据通过数据段组合方式存放在IFMEPATH中;对于由复合线条闭合形成的面状要素,表现为IFMEPATH闭合构成的IFMEPolygon。
通过分析,我们发现了IFMEPATH这个不太常见的数据类型,要解决要素拆分的问题,应从IFMEPATH入手。以下是FME帮助中对于PATH的描述
路径是包含一个或多个线段(线条或 弧)的复合空间对象。路径的线段必须是连续的. 几何部分是连接点对点的线条或弧以形成连续行或区域。路径也可以被参照为链.
因为一条路径包含了线段,所以每个线段都有自己的名称, 特征,和其他的属性. 在一条路径的线段中,名称和特征不需要完全一致.
如果路径是3D的或者带有度量,那么所有线段可以有一个z和/或度量值. 线段必须都为2D或都为3D,且必须有同样的数字和命名的度量,但其中的值可以不同。
不是所有的格式支持路径几何图形。如果路径(或等同于路径的几何)被写入了不支持它的格式中,FME会把路径打断成连续的线型要素(必要时用带有顶点的弧段替代).
路径给几何的表现形式增加了灵活性. 同样,路径允许你将独立的几何成分的某些特性保留为特征或度量.
路径与聚合体不一样. 路径对于端点对端点的部分(即由拓扑关系)有着明确的结构,而聚合体中对几何的连接并没有要求.
可以处理路径几何对象的转换器有:
· PathBuilder
把输入的线(弧段和线)要素按照输入顺序连接起来,构成路径要素。
注意: 对于某些数据集,数据在进入这个转换器之前,需要使用Sorter ,对其进行正确的排序。
如果一个输入段的终点与以下段的起点不匹配,则将添加几何对象,用来按以下方式连接它们。如果第一段是一条线,那么会在它后面附加一个点,将其延伸到下一段的起点。如果第一段是一条弧,而下一段是一条线,那么一个点将添加到该线的起点,以将其延伸到第一段的终点。否则,如果两个段都是弧,则将在结果路径中的这些段之间插入两点线。
· PathSplitter
把路径 要素分解为其组成线段。
备注:为了让输入要素有效,其几何对象必须是路径,也就是说,边界是路径的面以及包含路径的聚合要素都是无效的。GeometryCoercer, DonutHoleExtractor 和 Deaggregator可用于对几何对象的准备,以便输入到这个转换器中。
每个输出要素包含源要素属性的一个副本。非路径要素直接输出不发生改变。
· GeometryRefiner
对要素的几何对象进行“细化”。:
§ 任何同类的 IFMEAggregate 会变成一个 multi(IFMEMultiCurve, IFMEMultiArea, IFMEMultiPoint, 或 IFMEMultiText)。
§ 只包含一个组成部分的任意 IFMEAggregate 或 multi 都会被其独立的部分所替代。
§ 不包含洞的 IFMEDonut 会变成IFMEPolygon 或 IFMEEllipse。
§ 只包含一条线段的 IFMEPath 会被那条线段所替代。
§ IFMEPath 中的连续的 IFMELine 线段会被合并。
由帮助文件可以发现,路径与聚合体不一样。路径对于端点对端点的部分(即由拓扑关系)有着明确的结构,而聚合体中对几何的连接并没有要求。对于处理路径几何对象的三个转换器,通过名称即可发现,一个是路径构建,一个是路径分割,一个是几何对象的细化。不难看出本次需求可以使用PathSplitter对CAD中复合线分割成Line和Arc,对于CAD中闭合的复合线,则需要先使用GeometryCoercer转换器将面状要素转换为线状要素(在FME中是以IFMEPATH体现),再使用PathSplitter进行分割。
1. 解决方案
经测试,最终解决方案如图6:
图6 FME解决步骤
对于以前未能遇到的问题,采用FME Data Inspector对数据结构进行细致分析,通过分析数据结构,查找对应帮助,翻阅转换器说明,即可将数据流程理顺,找到解决问题的方法,通过解决问题,也学习到了新技能,对于FME的数据结构和转换器功能就有了更深的认识。