1. 程式人生 > >動態工作流:從多個源派生目標資料結構

動態工作流:從多個源派生目標資料結構

 

原文地址:

https://knowledge.safe.com/articles/33838/dynamic-workflows-destination-schema-derived-from.html?smartspace=dynamic-workspaces

一、下載

DynamicWorkflows.zip

二、從多個源派生目標資料結構

動態工作空間指寫模組資料結構不是來源於標準的工作空間中的定義,而是從已有的資料集結構中或列表屬性構造的結構中獲取。

多數情況下寫模組資料結構來自一個數據源,但有時需要從多個源中構造一個寫模組的資料結構。

這個示例使用列表屬性構造寫模組資料結構,但使用多個源獲取執行此操作需要的資訊。這是一種能夠將不同資料集合並在一起並使用組合模式進行寫出的方法——所有這些都是動態的。

具體來說,這裡有一個轉換公園資料集的工作空間。來自第二個資料集的屬性需要新增到公園中並寫出。因為事先不知道這些屬性,所以有必要使用動態轉換;並且由於具有多個數據結構源,所以必須使用列表屬性的技術。

2.1 建立列表

如前面文章所述,建立動態資料結構需要的列表屬性是attribute{}.name attribute{}.fme_data_type——這兩個列表屬性定義了寫模組屬性的名稱和資料型別。

除了從頭開始構建這些內容之外,還可以使用名為“SchemaAny 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

 

該工作空間需要解決的主要問題是將這兩個列表合併到一起作為一個輸出的資料結構定義。

三、工作空間

工作空間如下:

https://knowledge.safe.com/storage/attachments/4725-multisourcedynamic1.png

這裡有三個讀模組:

  • 主要(Primary)資料集讀模組
  • 次要(Secondary)資料集讀模組
  • Schema 讀模組

Schema讀模組從兩個源資料集(主要和次要)中讀取資料結構,因此得到兩個要素。炸散屬性列表,為每個屬性建立一個要素,然後使用一個Aggregator轉換器將它們合併到一個列表中。多餘結構資訊使用AttributeKeeper轉換器刪除。

https://knowledge.safe.com/storage/attachments/4721-multisourcedynamic2.png

讀取主要和次要資料集——這裡主要資料集是固定的,次要資料集是通用/動態的——且資訊由次要資料集傳輸到主要資料集(這裡使用SpatialFilter:

https://knowledge.safe.com/storage/attachments/4726-multisourcedynamic3.png

最終使用FeatureMerger轉換器將資料結構列表屬性掛接到主要要素上:

 

https://knowledge.safe.com/storage/attachments/4724-multisourcedynamic4.png

寫模組要素類設定為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

https://knowledge.safe.com/storage/attachments/7898-ex8-1b.png

2. 設定 SpatialFilter

Zones讀模組連線到SpatialFilter讀模組的Filter輸入埠,Parks讀模組連線到Candidate輸入埠。在引數中設定Spatial Predicates to Test(空間謂詞測試):

  • Filter Contains Candidate
  • Filter Intersects Candidate
  • Filter is Within Candidate
  • Filter Touches Candidate

https://knowledge.safe.com/storage/attachments/7899-ex8-2b.png

3. ListExploder

Schema讀模組新增ListExploder。在引數框中設定List Attributeattribute{}

4. Aggregator

ListExpolderElements輸出埠新增一個Aggregator。設定Accumulation Mode Merge Incoming Attributes.。勾選Generate List,設定 List Name attributeSelected Attributes 中新增 fme_data_type name

https://knowledge.safe.com/storage/attachments/7900-ex8-4b.png

注意: 舊版本的FME沒有Add to list Select Attributes 引數。如果你開啟附件的模板,它也沒有這兩個引數,因為這個工作空間是用老版本建立的。我保留這個模板是考慮使用老版本的FME也可以開啟並使用它,要獲取這些引數,只需要簡單的右鍵並選擇Upgrade Transforder(升級轉換器)即可。

5. AttributeKeeper

我們只想保留暴露的兩個屬性。在Aggregator後新增AttributeKeeper。在引數框的Lists to Keep中選擇attribute{}.fme_data_type attribute{}.name

https://knowledge.safe.com/storage/attachments/7901-ex8-5.png

6. FeatureMerger

我們使用FeatureMerger把所有的合併到一起。把SpatialFilterPassedFailed輸出埠連線到FeatureMergerRequestor輸入埠,將AttributeKeepers輸出埠連線到Supplier輸入埠。在FeatureMerger引數框中,設定Requestor3Supplier3,其他保留為預設。

7. 寫出到動態寫模組dynamic writer

在工作空間中新增一個MITAB寫模組,確保它設定為DynamicAdvanced)(動態)。把它連線到FeatureMergerMerged輸出埠。一旦新增到工作空間,在引數框中設定Schema Sources“Schema From Schema Feature”。在Mergerd輸出埠連線一個Inspector然後執行轉換。

  • 寫模組格式: MapInfo TAB (MITAB)
  • 寫模組資料集<Tutorial>\Output
  • 表定義: Dynamic (Advanced)