カスタムトランスフォーマーにおけるループ処理

FMEリファレンス > カスタムトランスフォーマーにおけるループ処理
最終更新: 2022-6-20 | FME 2022.0.1.0

カスタムトランスフォーマーに Loop (ループ) ポートを設けると、そこに入力したフィーチャーを同じカスタムトランスフォーマー内の特定の Input (入力) ポートに送り、そのフィーチャーに対して当該 Input ポート以降の処理を繰り返して行うことができます。

カスタムトランスフォーマーを編集中の Workbench でメニュー: Transformers (またはキャンバス空白部分の右クリック) > Insert Transformer Loop を選択すると次の Select Input to Loop to 画面が開き、フィーチャーの送り先とする入力ポートを選択してループポートを追加することができます。送り先の入力ポートをここで選択せず、ループポートを追加した後で設定することもできます。

ループポートの名前は、”Loop to <送り先の入力ポート名>” になります。

ループポートを追加した後、キャンバス上のループポートのダブルクリック、 (プロパティボタン) のクリック、または、Navigator ウィンドウにおけるループポート名の右クリック > Set Input to Loop to によって Select Input to Loop to 画面を開き、送り先の入力ポートを設定・変更することができます。

カスタムトランスフォーマーでループ処理を行う場合、繰り返しが必ず有限の回数で終わるように、その終了条件を適切に定義することが重要です。

グループベーストランスフォーマー (Group-Based Transformers) を含むカスタムトランスフォーマーでループ処理を行う場合は、*.fmx ファイルにエクスポートして常にリンク型として使用する必要があります。


ループ処理の例

次のカスタムトランスフォーマーは、Line ポートから入力されたフィーチャーが持つラインジオメトリを一定の間隔で分割するもので、次の3つのポートを持っています。

入力ポートLine
出力ポートSnipped
ループポートLoop to Line (フィーチャーを Line ポートに送る)

データフロー内で使用している Tester, Snipper はどちらもフィーチャーベーストランスフォーマー (Feature-Based Transformers) なので、このカスタムトランスフォーマーは組込型、リンク型のどちらでも使用できます。

このカスタムトランスフォーマーは、Line ポートからフィーチャー (ラインジオメトリを持つ) を受け取ったときにまず、Tester によってラインの長さと公開 (Published) パラメーター INTERVAL に設定された長さを比較し、

  • INTERVAL 以下である場合はそのまま Snipped ポートから出力してそのフィーチャーに対する処理を終了し、
  • INTERVAL より長い場合に、Snipper によって先頭から INTERVAL 区間を切り取って Snipped ポートから出力し、残りの区間を Loop to Line ポートに入力します。

Loop to Line ポートに入力されたフィーチャーは Line ポートに送られるので上記の処理が繰り返され、結果として、入力ラインを INTERVAL パラメーターに指定された間隔で分割することになります。ただし、最後の区間は INTERVAL より短いことがあります。

この例では「ラインの先頭から INTERVAL 区間を切り取った残りの区間 (Line ポートから入力されるライン) の長さが INTERVAL 以下であること」が繰り返しの終了条件です。

処理結果の例 (四角のマーカーで分割後のラインの始終点を示しています)

この例はループ処理についての説明用に簡略化したものです。入力データの条件等が分かっている特定のワークスペースでは十分に機能しますが、他のユーザーにも配布可能な汎用的なものにする場合には、以下のような事項について検討のうえ、必要な処理を加えるのが望ましいです。
・入力フィーチャーのジオメトリがラインではなかった場合にどうするか。
・INTERVAL に 0 以下の値が設定されたときにどうするか。


グループベーストランスフォーマーを含むカスタムトランスフォーマーのループ処理

グループベース (ブロッキング) トランスフォーマーを含むカスタムトランスフォーマーでループ処理を行う場合には、次の制約があります。

  • トランスフォーマー定義ファイル (*.fmx) にエクスポートし、常にリンク型として使用する必要があります。
  • 使用できるループポートはひとつだけです。
  • 並列処理のためのパラメーターは設定できません。
  1. グループベーストランスフォーマーが含まれるカスタムトランスフォーマーにループポートを設けたときは、Workbench メニュー: File > Export As Custom Transformer によって必ずエクスポートし、リンク型として使用してください。
    エクスポートが行われると自動的に別の Workbench が起動し、そのキャンバスの Main タブでエクスポート後のカスタムトランスフォーマー (*.fmx) の編集を続けることができます。
  2. *.fmx ファイルにエクスポートした後、それを開いている Workbench の Navigator ウィンドウ Transformer Parameters/Advanced セクションで Enable Blocked Looping パラメーターが Yes であることを確認し、もし異なる場合には Yes に変更してください。

Enable Blocked Looping パラメーターが Yes であるときは次の2つのパラメーターが表示され、それらとリンクした公開 (Published) パラメーターも自動的に追加されています。

  • Maximum number of iterations (0 for infinity) – 繰り返し回数上限 (0は上限なし)
  • Attribute to hold iteration count – 繰り返し回数を格納する属性名

繰り返し回数上限パラメーターに1以上の数を設定してワークスペースを実行したときは、繰り返し回数がその数までに制限されます。0 (上限なし) を設定したときは、カスタムトランスフォーマーで定義されている繰り返しの終了条件が満たされるまで繰り返しが行われます。
これらの公開 (Published) パラメーターは、名前やデフォルト値等を編集すること、非公開 (Private) に変更することができます。

  1. 以上の要領で作成したカスタムトランスフォーマーには、Incomplete という出力ポートが自動的に追加されます。繰り返し回数上限パラメーターに1以上の数を設定してワークスペースを実行した場合で、カスタムトランスフォーマーで定義されている繰り返しの終了条件を満たす前に指定された回数上限に達したフィーチャーがあったときに、それらがこの Incomplete ポートから出力されます。

このポートはカスタムトランスフォーマー編集時のキャンバスには表示されず、名前を変更することはできません。Incomplete はこのポートのために予約されている名前なので、カスタムトランスフォーマーを編集する際に同じ名前のポートを設けないように注意してください。