動態工作流:從多個源派生目標資料結構
原文地址:
一、下載
二、從多個源派生目標資料結構
動態工作空間指寫模組資料結構不是來源於標準的工作空間中的定義,而是從已有的資料集結構中或列表屬性構造的結構中獲取。
多數情況下寫模組資料結構來自一個數據源,但有時需要從多個源中構造一個寫模組的資料結構。
這個示例使用列表屬性構造寫模組資料結構,但使用多個源獲取執行此操作需要的資訊。這是一種能夠將不同資料集合並在一起並使用組合模式進行寫出的方法——所有這些都是動態的。
具體來說,這裡有一個轉換公園資料集的工作空間。來自第二個資料集的屬性需要新增到公園中並寫出。因為事先不知道這些屬性,所以有必要使用動態轉換;並且由於具有多個數據結構源,所以必須使用列表屬性的技術。
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)