原文地址:
一、下载
二、从多个源派生目标数据结构
动态工作空间指写模块数据结构不是来源于标准的工作空间中的定义,而是从已有的数据集结构中或列表属性构造的结构中获取。
多数情况下写模块数据结构来自一个数据源,但有时需要从多个源中构造一个写模块的数据结构。
这个示例使用列表属性构造写模块数据结构,但使用多个源获取执行此操作需要的信息。这是一种能够将不同数据集合并在一起并使用组合模式进行写出的方法——所有这些都是动态的。
具体来说,这里有一个转换公园数据集的工作空间。来自第二个数据集的属性需要添加到公园中并写出。因为事先不知道这些属性,所以有必要使用动态转换;并且由于具有多个数据结构源,所以必须使用列表属性的技术。
2.1 创建列表
如前面文章所述,创建动态数据结构需要的列表属性是attribute{}.name 和attribute{}.fme_data_type——这两个列表属性定义了写模块属性的名称和数据类型。
除了从头开始构建这些内容之外,还可以使用名为“Schema(Any Format)”的读模块格式直接从主数据集中提取这些内容,例如:
Attribute |
Value |
attribute{0}.fme_data_type |
fme_int16 |
attribute{0}.name |
ParkId |
attribute{1}.fme_data_type |
fme_int16 |
attribute{1}.name |
RefParkId |
attribute{2}.fme_data_type |
fme_varchar(40) |
attribute{2}.name |
ParkName |
类似的,可以从次要源数据中提取属性列表:
Attribute |
Value |
attribute{0}.fme_data_type |
fme_varchar(30) |
attribute{0}.name |
ZoneName |
attribute{1}.fme_data_type |
fme_varchar(30) |
attribute{1}.name |
ZoneCategory |
该工作空间需要解决的主要问题是将这两个列表合并到一起作为一个输出的数据结构定义。
三、工作空间
工作空间如下:
这里有三个读模块:
- 主要(Primary)数据集读模块
- 次要(Secondary)数据集读模块
- Schema 读模块
Schema读模块从两个源数据集(主要和次要)中读取数据结构,因此得到两个要素。炸散属性列表,为每个属性创建一个要素,然后使用一个Aggregator转换器将它们合并到一个列表中。多余结构信息使用AttributeKeeper转换器删除。
读取主要和次要数据集——这里主要数据集是固定的,次要数据集是通用/动态的——且信息由次要数据集传输到主要数据集(这里使用SpatialFilter):
最终使用FeatureMerger转换器将数据结构列表属性挂接到主要要素上:
写模块要素类设置为dynamically (动态)并使用 Schema Feature as a schema source(模式要素作为模式源)。
四、输出
运行工作空间并检查输出。你会发现每个公园都具有公园所在开发区的信息。
关键的部分在于你可以更改zoning这个源数据集为其他数据(任何格式),将动态附加这些要素的属性并在输出中使用。
五、注意
- 这里主要数据集读模块为固定模式且设置为MapInfo格式,但是其实并不需要这样做。类似的,写模块也可以设置为通用,以便写出任何数据格式。
- 次要数据集读模块为Generic,可以为任何格式。
- 次要数据集可以为任何数据结构,但是它需要包含与SpatialFilter中的公园重叠的要素
- Schema读模块源数据集的参数共享主要和次要数据集,意味着相同数据集不必选择两次。
六、动手试一下
1. 添加读模块和数据结构
添加两个MITAB读模块,一个用于读取Zones数据,一个读取Parks数据,确保为两个读模块选择了Single Merger Feature Type(合并要素类)选项。然后添加一个Schema读模块。对Schema读模块,首先添加Zones.tab文件,然后点击Parameters(参数)。在Additional Attributes to Expose中,添加如下列表。然后点击OK添加读模块到工作空间。在导航窗口中,找到Zones[SCHEMA]读模块,点击它下方的Source Dataset参数,点击下拉列表,点击Select Mulltiple Files/Folders,添加Parks.tab文件。
- 读模块格式: MapInfo TAB (MITAB)
- 读模块数据集: <Tutorial>\Zoning\Zones.tab
- 读模块格式: MapInfo TAB (MITAB)
- 读模块数据集: <Tutorial>\Parks\Parks.tab
- 读模块格式: Schema (Any Format)
- 读模块数据集: <Tutorial>\Zoning\Zones.tab, <Tutorial>\Parks\Parks.tab
- 参数: Additional Attributes to Expose(需要额外暴露的参数):
- attribute{}.fme_data_type
- attribute{}.name
- attribute{}.native_data_type
- fme_basename
- fme_format_long_name
- fme_format_short_name
2. 设置 SpatialFilter
把Zones读模块连接到SpatialFilter读模块的Filter输入端口,Parks读模块连接到Candidate输入端口。在参数中设置Spatial Predicates to Test(空间谓词测试):
- Filter Contains Candidate
- Filter Intersects Candidate
- Filter is Within Candidate
- Filter Touches Candidate
3. ListExploder
为Schema读模块添加ListExploder。在参数框中设置List Attribute为attribute{}。
4. Aggregator
在ListExpolder的Elements输出端口添加一个Aggregator。设置Accumulation Mode 为Merge Incoming Attributes.。勾选Generate List,设置 List Name 为attribute,Selected Attributes 中添加 fme_data_type 和name。
注意: 旧版本的FME没有Add to list 或 Select Attributes 参数。如果你打开附件的模板,它也没有这两个参数,因为这个工作空间是用老版本创建的。我保留这个模板是考虑使用老版本的FME也可以打开并使用它,要获取这些参数,只需要简单的右键并选择Upgrade Transforder(升级转换器)即可。
5. AttributeKeeper
我们只想保留暴露的两个属性。在Aggregator后添加AttributeKeeper。在参数框的Lists to Keep中选择attribute{}.fme_data_type 和attribute{}.name
6. FeatureMerger
我们使用FeatureMerger把所有的合并到一起。把SpatialFilter的Passed和Failed输出端口连接到FeatureMerger的Requestor输入端口,将AttributeKeepers输出端口连接到Supplier输入端口。在FeatureMerger参数框中,设置Requestor为3、Supplier为3,其他保留为默认。
7. 写出到动态写模块dynamic writer
在工作空间中添加一个MITAB写模块,确保它设置为Dynamic(Advanced)(动态)。把它连接到FeatureMerger的Merged输出端口。一旦添加到工作空间,在参数框中设置Schema Sources为“Schema From Schema Feature”。在Mergerd输出端口连接一个Inspector然后运行转换。
- 写模块格式: MapInfo TAB (MITAB)
- 写模块数据集: <Tutorial>\Output
- 表定义: Dynamic (Advanced)