
简介这份《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。数值比较不要加引号否则会按字符串比较10020会返回 True这是新手高频翻车点。4. SQL 与 PythonCaller 在转换器流程里的嵌入方式4.1 SQLExecutor 和 SQLCreator 的区别与选用手册里数据库操作部分有两个容易混淆的转换器SQLExecutor 和 SQLCreator。简单说SQLCreator 是「读数据库」它执行一条 SQL 查询把结果作为要素流输出通常放在流程开头当读模块用。SQLExecutor 是「在流程中间查数据库」它接收上游要素对每个要素或一批要素执行 SQL把查询结果合并回要素属性里。举个例子你有一批管线要素每个要素有个 material_id 字段你想从数据库的 material 表里查出对应的材料名称。这时候用 SQLExecutorSQL 写成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。手册是参考书但真正让你少踩坑的是你自己踩过之后记下来的那几行。希望帮到你。本文还有配套的精品资源点击获取