简介:这份《2021FME转换器快速参考手册》中文版面向使用FME进行空间数据处理的GIS工程师、数据集成开发者与测绘相关专业学习者,帮助其快速查阅各类转换器的功能定位与适用场景。资源为单个PDF文件,压缩包约2.03MB,内容按功能模块组织,涵盖三维表面与实体几何、坐标系与重投影、数据库交互、图形与属性测试、几何操作、KML处理、线性参照、列表操作、网络处理、点云与栅格数据处理、字符串处理、样式设置、曲面处理、Web服务及工作流等二十余个类别。手册对每个转换器给出概要说明,并介绍属性按钮颜色状态、必填字段提示、默认值恢复等Workbench操作要点,便于读者按功能分类检索、理解转换器用途并排查配置问题。目前已有797人学习,适合作为日常开发中的速查工具书。
1. FME 转换器快速参考手册到底解决什么问题:从一次数据质检翻车说起
手里拿到一份《2021FME转换器快速参考手册-中文版参考.pdf》,很多人第一反应是「这不就是个函数字典吗」。我最初也这么想,直到有次接了个市政管线数据整合的活:甲方给了 17 个 shapefile、4 个 Excel 属性表、2 个 CAD 图层,要求统一坐标系、字段对齐、拓扑检查后入库。我凭记忆在 FME Workbench 里拖了三十多个转换器,跑出来发现管径字段全变成空值,排查到凌晨两点才发现是 AttributeManager 里字段名大小写没对齐,被后面的转换器默默吃掉了。那晚之后我才认真把这份手册当工具书翻,也才明白它真正的价值:不是教你 FME 是什么,而是让你在 Workbench 里搭流程时,能快速查到每个转换器的输入输出、参数含义和典型组合,少走我这种血泪弯路。
这份手册面向的是已经在用或准备用 FME 做空间数据转换、格式互转、批量清洗的从业者。它解决的核心问题是「转换器太多记不住、参数太杂查不到、组合方式没头绪」。如果你日常要处理 GIS 数据、CAD 图纸、数据库表之间的流转,或者被 SQL 和 PythonCaller 混合流程折磨过,那这份参考手册就是案头该放的那本。下面我按「先搞懂转换器分类逻辑 → 再动手搭最小流程 → 最后避开高频坑」的顺序,把这份手册的用法拆开讲。
2. FME 转换器分类与 Workbench 里的调用逻辑
2.1 转换器不是函数库,是数据流的加工工位
很多人把 FME 转换器当成编程语言里的函数,觉得输入一个值就输出一个值。这个理解在简单场景下没错,但一旦流程复杂就会翻车。FME 的数据模型是「要素(Feature)流」:每个要素带着几何和属性,从读模块出来,经过一串转换器,每个转换器对要素做增删改,最后进写模块。转换器不是孤立函数,而是流水线上的工位,它能看到上游传来的所有要素,也能决定往下游发什么。
这就解释了为什么同样一个 AttributeCreator,放在不同位置效果完全不同。放在读模块后面,它给每个原始要素加字段;放在聚合器后面,它操作的就是聚合后的要素。手册里每个转换器条目都会标注「输入端口」「输出端口」「典型上游」「典型下游」,这四个信息比参数本身还重要,因为它们决定了你该把这个转换器插在流程的哪个位置。
从功能上,手册把转换器分成几大类:属性处理(AttributeManager、AttributeCreator、AttributeRenamer)、几何处理(GeometryValidator、Snapper、Clipper)、格式转换(各种 Reader/Writer 对应的转换器)、数据库操作(SQLExecutor、SQLCreator)、流程控制(Tester、TestFilter、Sampler)、聚合与拆分(Aggregator、Deaggregator)、坐标系统(Reprojector、CoordinateSystemSetter)。这个分类不是学术分类,是按「你拿到数据后第一步想干什么」来分的。数据脏就先找几何和属性清洗类,格式不对就找格式转换类,要连数据库就找 SQL 类。
2.2 在 Workbench 里定位转换器的三种方式
打开 FME Workbench,左侧是转换器库,顶部有搜索框。手册配合 Workbench 使用,有三种定位方式。
第一种是按名称搜。手册的目录是按字母序排的,Workbench 搜索框也支持模糊匹配。比如你要找「怎么把多个要素合并成一个」,搜 merge 或 aggregate,手册里 Aggregator 条目会告诉你它把一组要素按某个分组字段聚合成一个要素,几何可以选聚合、包围盒或只保留属性。
第二种是按功能分类翻。Workbench 转换器库左侧有分类树,手册的章节划分和这个树基本对应。你点开 Attribute 分类,里面全是属性操作类;点开 Geometry,里面是几何操作类。手册每个分类开头有一段概述,讲这类转换器共同的输入输出特征,这段概述比单个转换器条目更值得先读。
第三种是按数据流反查。你手里有个要素流,想对它做某种处理但不知道用哪个转换器,这时候翻手册的「典型任务索引」部分(如果有的话),或者直接看手册里每个转换器的「典型应用场景」描述。比如你想「按字段值把要素分成两路」,手册里 TestFilter 条目会写「根据属性条件将输入要素路由到不同输出端口」,这就是你要的。
提示:Workbench 里右键任意转换器可以看帮助,但帮助是英文且偏参数罗列。手册的中文条目通常会把参数按使用频率排序,先讲必填项再讲选填项,这个顺序对新手更友好。
2.3 转换器参数的三层结构:必填、常用、进阶
手册里每个转换器条目基本按三层写参数。第一层是必填参数,不填流程跑不起来,比如 Clipper 的 Clipper 端口必须连一个提供裁剪边界的要素流。第二层是常用参数,影响结果但不至于报错,比如 AttributeManager 里的「Action」选 Keep、Rename 还是 Remove。第三层是进阶参数,涉及性能、内存、分组行为,比如 Aggregator 的「Group By」和「Accumulation Mode」。
我一般建议新手先把必填和常用参数吃透,进阶参数等流程跑通了再调。手册里进阶参数部分往往写得比较简略,因为不同版本 FME 行为可能有差异,写太细反而误导。遇到进阶参数拿不准,最稳的办法是在 Workbench 里搭个最小测试流程,用几个样本要素跑一遍看输出,比读十遍手册都管用。
3. 用转换器搭一条最小可用流程:从 CSV 到空间数据入库
3.1 读模块与写模块的转换器对应关系
FME 里读模块和写模块本身不是转换器,但它们决定了数据进出格式。手册里格式转换部分会讲每种格式对应的读模块参数和写模块参数。比如读 CSV 时,手册会提醒你注意「字段类型推断」:FME 默认把数字列识别为数值,但如果列里有空值或混合类型,可能全被当成字符串。这时候要么在读模块里手动指定字段类型,要么在后面加 AttributeConverter 强制转换。
写模块这边,入库前通常要过几个转换器。以写 PostGIS 为例,常见流程是:读模块 → AttributeManager(字段对齐)→ GeometryValidator(几何修复)→ Reprojector(坐标转换)→ 写模块。手册里 Reprojector 条目会告诉你,如果源数据和目标坐标系都已知,直接选目标坐标系即可;如果源坐标系未知,要先加 CoordinateSystemSetter 指定,否则 Reprojector 会报错或默默不转换。
3.2 一个可抄的字段清洗流程:AttributeManager 参数详解
下面这段是 FME Workbench 里 AttributeManager 的典型配置思路,用伪代码表示参数设置逻辑,实际在 Workbench 里是填表操作。
# AttributeManager 参数配置逻辑(Workbench 填表对应) # 输入:原始要素,字段包括 "pipe_dia"、"PIPE_DIA"、"管径" 三个混用字段 # 目标:统一为 "diameter",数值型,空值填 0 actions = [ { "input_attr": "pipe_dia", # 源字段名 "action": "Rename", # 操作类型:重命名 "output_attr": "diameter", # 目标字段名 "type": "Float", # 强制类型 "default": 0 # 空值默认值 }, { "input_attr": "PIPE_DIA", "action": "Rename", "output_attr": "diameter", "type": "Float", "default": 0 }, { "input_attr": "管径", "action": "Rename", "output_attr": "diameter", "type": "Float", "default": 0 }, { "input_attr": "diameter", "action": "Keep", # 保留最终字段 "type": "Float" } ]逻辑说明:AttributeManager 按 actions 列表顺序执行,多个源字段重命名到同一个目标字段时,后面的会覆盖前面的,所以顺序很重要。这里把三个混用字段都指向 diameter,最后 Keep 一次确保字段存在。参数里 type 设为 Float 是强制类型转换,default 设为 0 是空值兜底。手册里 AttributeManager 条目会列出所有 action 类型:Keep、Rename、Remove、Add、Set、Copy,每种都有适用场景。
参数说明:input_attr 必须和上游要素的实际字段名完全一致,大小写敏感。output_attr 如果和已有字段重名,会触发覆盖行为,手册里会标注「注意字段冲突」。type 可选类型包括 Integer、Float、String、Date 等,选错类型可能导致后续转换器报错。default 只在源字段为空时生效,如果源字段不存在,这个 action 会被跳过而不是报错,这点手册里写得很清楚,但很多人没注意。
3.3 用 Tester 和 TestFilter 做条件分流
数据清洗完往往要按条件分流。Tester 是单条件判断,输出 Passed 和 Failed 两路;TestFilter 是多条件判断,可以设多个条件对应多个输出端口。手册里 Tester 条目会讲「条件表达式」的写法,比如@Value(diameter)>100表示管径大于 100 的走 Passed。
# TestFilter 配置逻辑:按管径分三路 # 输入:要素带 diameter 字段 # 输出:小管(<100)、中管(100-300)、大管(>300) test_conditions = [ { "output_port": "SmallPipe", "condition": "@Value(diameter)<100" }, { "output_port": "MediumPipe", "condition": "@Value(diameter)>=100 AND @Value(diameter)<=300" }, { "output_port": "LargePipe", "condition": "@Value(diameter)>300" } ] # 未匹配任何条件的要素走 <Unfiltered> 端口逻辑说明:TestFilter 按条件列表顺序匹配,第一个满足条件的端口接收要素,后续条件不再判断。所以条件顺序影响结果,比如把>300放在最前面,那所有大于 300 的都走 LargePipe,不会误入其他端口。手册里会提醒「条件互斥性」:如果条件有重叠,先匹配的优先。
参数说明:条件表达式里@Value()是 FME 的字段引用语法,手册里会列出所有支持的运算符:=、<>、>、<、>=、<=、AND、OR、NOT。字符串比较要加引号,比如@Value(city)='Beijing'。数值比较不要加引号,否则会按字符串比较,'100'<'20'会返回 True,这是新手高频翻车点。
4. SQL 与 PythonCaller 在转换器流程里的嵌入方式
4.1 SQLExecutor 和 SQLCreator 的区别与选用
手册里数据库操作部分有两个容易混淆的转换器:SQLExecutor 和 SQLCreator。简单说,SQLCreator 是「读数据库」,它执行一条 SQL 查询,把结果作为要素流输出,通常放在流程开头当读模块用。SQLExecutor 是「在流程中间查数据库」,它接收上游要素,对每个要素(或一批要素)执行 SQL,把查询结果合并回要素属性里。
举个例子:你有一批管线要素,每个要素有个 material_id 字段,你想从数据库的 material 表里查出对应的材料名称。这时候用 SQLExecutor,SQL 写成SELECT name FROM material WHERE id = @Value(material_id),它会对每个要素执行一次查询,把 name 字段加到要素上。手册里会提醒:SQLExecutor 对每个要素执行一次 SQL,要素多的时候性能很差,能批量就批量。
-- SQLExecutor 典型配置:按要素字段查关联表 -- 上游要素带 material_id 字段 -- 目标:查出 material_name 并合并到要素 SELECT m.name AS material_name FROM material m WHERE m.id = @Value(material_id)逻辑说明:@Value(material_id)是 FME 在 SQL 里的字段引用语法,执行时会被替换成当前要素的 material_id 值。查询结果只有一行时,字段直接合并;多行时,手册里会讲「结果处理模式」:可以选 First、Last、Concatenate 等。参数说明:SQL 方言取决于数据库连接类型,PostGIS 用 PostgreSQL 语法,SQL Server 用 T-SQL,手册里会按数据库类型分别举例。
4.2 PythonCaller 的输入输出约定
PythonCaller 是 FME 里最灵活的转换器,也是手册里篇幅较长的条目之一。它接收要素,你写 Python 代码处理,然后决定输出什么。手册里会强调三个约定:第一,输入要素通过feature对象访问,属性用feature.getAttribute('name'),几何用feature.getGeometry()。第二,输出要素要显式创建并self.pyoutput(new_feature)。第三,如果不想输出某个要素,直接不调用 pyoutput 即可。
# PythonCaller 示例:字段值清洗与条件输出 # 输入:要素带 raw_value 字段,可能含空格和特殊字符 # 输出:清洗后的 clean_value,空值要素不输出 import fme import fmeobjects def process_feature(feature): raw = feature.getAttribute('raw_value') if raw is None: return # 不输出,要素被丢弃 cleaned = str(raw).strip().replace('\t', '').replace('\n', '') if len(cleaned) == 0: return feature.setAttribute('clean_value', cleaned) self.pyoutput(feature)逻辑说明:process_feature是 FME 自动调用的入口函数,每个要素进来调一次。self.pyoutput(feature)把要素发到输出端口。手册里会提醒:PythonCaller 里不要做耗时 IO,因为它是逐要素调用的,性能敏感场景要改用批量模式或 SQL。参数说明:PythonCaller 的「Class or Function」参数决定入口是类还是函数,默认是函数模式。import fmeobjects是必须的,否则拿不到要素对象的方法。
4.3 SQL 与 PythonCaller 混用的性能边界
手册里没有专门讲混用,但实际项目里经常 SQLExecutor 查完再用 PythonCaller 做复杂逻辑。我的经验是:能在 SQL 里做完的不要在 Python 里做,因为 SQL 在数据库端执行,可以利用索引;PythonCaller 在 FME 端逐要素执行,数据量大时是瓶颈。手册里 SQLExecutor 条目会标注「批量查询」选项,开启后 FME 会把多个要素的查询合并成一条 SQL,性能提升明显,但要求 SQL 写法支持 IN 子句。
注意:SQLExecutor 的批量模式对 SQL 写法有要求,不是所有查询都能自动批量。手册里会写「批量兼容性」说明,拿不准就先小数据量测试,对比开启前后的执行日志。
5. 转换器流程避坑与排查:五条血泪记录
5.1 字段名大小写不一致导致属性丢失
现象:流程跑完,某个字段在输出里变成空值或直接消失。原因:FME 属性名大小写敏感,上游写PipeDia,下游读pipedia,读不到就返回空。手册里 AttributeManager 条目会标注「字段名精确匹配」,但很多人扫一眼就过。解决:在流程关键节点加 AttributeManager 做字段名统一,或者用 AttributeRenamer 批量转小写。排查方法:在可疑转换器后面加 Logger 转换器,把要素属性打到日志里看实际字段名。
5.2 Reprojector 不报错但坐标没变
现象:加了 Reprojector,输出坐标系还是错的,但流程不报错。原因:源坐标系未指定,Reprojector 不知道从哪转,可能默默跳过或按默认处理。手册里 Reprojector 条目会写「源坐标系必须已知」,但读模块有时不自动识别。解决:在 Reprojector 前面加 CoordinateSystemSetter,显式指定源坐标系。排查方法:看 Reprojector 的转换日志,正常转换会打印源和目标坐标系,没打印就是没转。
5.3 SQLExecutor 逐要素查询拖垮性能
现象:小数据量跑得飞快,数据量一上来流程卡死。原因:SQLExecutor 默认对每个要素执行一次 SQL,一万个要素就是一万次数据库往返。手册里会写「批量模式」但默认不开。解决:在 SQLExecutor 参数里开启「Batch Mode」,SQL 改成WHERE id IN (...)形式。排查方法:看 FME 日志里的 SQL 执行次数,如果和要素数一致就是没开批量。
5.4 PythonCaller 里异常被吞导致要素静默丢失
现象:流程跑完要素数比预期少,但没有任何报错。原因:PythonCaller 里代码抛异常,FME 默认可能捕获后跳过该要素,不中断流程。手册里会提醒「异常处理」,但默认行为容易忽略。解决:在 Python 代码里加 try/except,把异常写到日志或输出到单独端口。排查方法:在 PythonCaller 后面加统计转换器,对比输入输出要素数。
5.5 TestFilter 条件顺序错误导致分流错乱
现象:明明设了三个条件,要素全走第一个端口。原因:TestFilter 按条件顺序匹配,第一个满足的就输出,后续不再判断。如果第一个条件写得太宽泛,后面条件永远不触发。手册里会写「条件顺序敏感」,但新手容易按直觉从具体到宽泛排。解决:把最严格的条件放最前面,最宽泛的放最后。排查方法:用几个边界值样本测试,比如管径正好 100 和 300 的要素,看走哪个端口。
6. 把手册用成活工具:我的三个进阶习惯
第一个习惯是给常用转换器建「参数速查卡」。手册条目太长,实际搭流程时没时间逐条读。我会把 AttributeManager、Tester、Reprojector、SQLExecutor 这几个高频转换器的必填参数和常见坑抄在一张纸上,贴在显示器旁边。手册里每个转换器的「参数」部分其实可以压缩成一张表,我按自己的使用频率重排了顺序,比如 AttributeManager 我把 action 类型表放在最前面,因为选错 action 是最常见的翻车点。
第二个习惯是用「最小测试流程」验证手册里的参数说明。手册写的是通用行为,但 FME 版本不同、数据库驱动不同,实际表现可能有差异。我一般会新建一个空白 Workbench,用 Creator 转换器造几个样本要素,接上要测试的转换器,跑一遍看日志和输出。比如手册说 SQLExecutor 批量模式要求 SQL 支持 IN 子句,我就用两个要素测试,看日志里是一条 SQL 还是两条。这个习惯帮我省了很多「手册说可以但实际不行」的排查时间。
第三个习惯是定期回翻手册的「典型应用场景」部分。单个转换器的参数看多了会陷入细节,但手册里每个转换器条目开头通常有一句「用于……场景」,这句话才是选型的关键。我遇到过一个问题:要把线要素按交点打断,第一反应是找「打断」相关的转换器,翻手册发现 Intersector 转换器的场景描述是「计算几何交点并打断」,这才找对。如果只按名称搜,可能永远搜不到。
| 高频转换器 | 必填参数 | 最容易翻车的点 | 手册对应章节 |
|---|---|---|---|
| AttributeManager | 至少一个 action | 字段名大小写、action 顺序 | 属性处理类 |
| Tester | 条件表达式 | 数值比较加引号变字符串比较 | 流程控制类 |
| Reprojector | 目标坐标系 | 源坐标系未指定导致不转换 | 坐标系统类 |
| SQLExecutor | 数据库连接、SQL | 逐要素查询性能差 | 数据库操作类 |
| PythonCaller | 入口函数 | 异常吞掉导致要素丢失 | 自定义转换类 |
这张表是我自己整理的,手册里没有现成的,但每个格子的内容都能在对应章节找到依据。我建议你也按自己的项目类型整理一张,比如做市政数据的重点标 Clipper 和 Snapper,做属性整合的重点标 AttributeManager 和 Aggregator。手册是参考书,但真正让你少踩坑的,是你自己踩过之后记下来的那几行。
希望帮到你。
本文还有配套的精品资源,点击获取