Q&A データフローの分岐

Q: 国土数値情報「医療機関」データ(Shapefile形式)から、開設者が国または公的医療機関である病院に該当する(属性P04_007: 開設者分類コードが1または2であり、かつ、属性P04_001: 医療機関分類コードが1である)フィーチャーを抽出するにはどうすれば良いですか。

FME 2019.2

A: Tester トランスフォーマーによって、データフローをある条件(このケースでは「開設者が国または公的医療機関である病院」)に該当するフィーチャーのフローとそうでないフィーチャーのフローの2方向に分岐させることができます。そのうち条件に該当するフィーチャーのフローだけを後続の処理で利用してください。

Tester パラメーター設定例 1

Tester は、フィーチャーが入力されるたびに Test Clauses パラメーターで定義された条件式の真偽(成り立つか成り立たないか)の判定を行い、真である(成り立つ)場合は Passed ポート、偽である(成り立たない)場合は Failed ポートからそのフィーチャーを出力することにより、データフローを2方向に分岐させます。

Test Clauses パラメーターで定義される条件式はひとつ以上のテスト句(行)で構成され、ひとつのテスト句は、左辺値(Left Value)、演算子(Operator)、右辺値(Right Value、演算子の種類によっては使用されない場合もある)で構成されます。実行時には、各テスト句について演算子が示す関係が成り立つかどうかの判定が行われ、複数のテスト句が設定されているときは Logic 列に設定した論理演算子によってそれらを連結した条件式全体の判定が行われます。

= 演算子は「左辺と右辺が等しい」という関係を示すので、上記設定例では、次の条件が成り立つフィーチャーが Passed ポートから出力されることになります。

  • P04_007属性の値が1に等しい
  • または、P04_007属性の値が2に等しい
  • かつ、P04_001属性の値が1に等しい

Comparison Mode(比較モード)パラメーターでは、テスト句における左辺値と右辺値を比較する方法として以下のいずれかひとつが選択できます。

  • Automatic: 両辺の値がどちらも数値として解釈できるときは数値として、そうでなければ文字列として比較する。
  • Numeric: Automatic と同じ。
  • Case Sensitive: 常に文字列(アルファベットの大文字と小文字を区別する)として比較する。
  • Case Insensitive: 常に文字列(アルファベットの大文字と小文字を区別しない)として比較する。
  • Date/Time: 両辺の値がどちらもFME標準書式の日付/時刻として解釈できるときは日付/時刻として、そうでなければ文字列として比較する。
  • Specify Per Test: 次の図のようにテスト句の右端に Mode 列を現し、テスト句ごとに個別に比較モードを設定できるようにする。
Tester パラメーター設定例 2 (Comparison Mode: Specify Per Test)

Composite Expression(複合式)セクションには、Logic 列の設定内容と同期して テスト句(1から始まる行番号で示す)を論理演算子で連結した条件式が表示されます。また、[Edit] ボタンをクリックするとここに表示されている条件式の編集になり、編集後に [Apply] ボタン(編集モードにしたときに現れます)をクリックすると、ここでの編集結果が Logic 列に適用されます。

複数のテスト句を論理演算子で連結した条件式は原則として上から下(複合式においては左から右)の順に評価されますが、カッコ ( ) で括ることによって先に評価させたい部分を指定することもできます。例えば、「(1 OR 2) AND 3」の評価順は「1 OR 2 AND 3」の評価順と同じですが、「1 OR (2 AND 3)」は (2 AND 3) の部分が先に評価されるので、結果が異なることがあります。

論理演算子として、OR(論理和)、AND(論理積)のほかに、NOT(論理否定)が使用できます。

論理演算子評価結果
OR左辺と右辺のどちらか一方でも真ならば真、どちらも偽のときに限り偽
AND左辺と右辺がどちらも真のときに限り真、どちらか一方でも偽ならば偽
NOT直後の式(テスト句またはカッコで括られた範囲)の評価結果の逆(真ならば偽、偽ならば真)

テスト句で使用できる演算子

Tester だけでなく、ワークスペース内のさまざまな場面で条件式(ひとつ以上のテスト句)を設定することがありますが、その際に使用できる演算子は共通です。

演算子テスト句が真(成り立つ)と判定される条件
=左辺と右辺が等しい。
!=左辺と右辺が等しくない。
<左辺が右辺より小さい。
>左辺が右辺より大きい。
<=左辺が右辺より小さい、または右辺と等しい。
>=左辺が右辺より大きい、または右辺と等しい。
In Range左辺が右辺に設定した範囲内である。
In左辺が右辺に設定したカンマ区切りの値のひとつと等しい。
Like左辺が右辺に設定した文字列パターンと一致する。文字列パターンで使用できるワイルドカードは次の2種類(SQLのLIKE演算子と類似)。
%: 0文字以上の任意の文字列、_: 任意の一文字
Contains左辺が右辺に指定した文字列を含む。
Begins With左辺が右辺に指定した文字列から始まる。
Ends With左辺が右辺に指定した文字列で終わる。
Contains Regex左辺が右辺に指定した正規表現と一致する文字列を含む。
Type Is左辺が右辺に指定した型の値として解釈できる。
Encodable In左辺が右辺に指定した文字コードでエンコーディングできる。
Attribute has a value左辺の属性が存在し、ナル <null> 、空文字列 <empty> 以外の値を格納している。
Attribute is Null左辺の属性が存在し、ナル <null> を格納している。
Attribute is Empty String左辺の属性が存在し、空文字列 <empty> を格納している。
Attribute is Missing左辺の属性が存在しない。 <missing>

前掲の Tester パラメーター設定例の最初のふたつのテスト句は、次のように In 演算子を使ったひとつのテスト句に置き換えることもできます。

Tester パラメーター設定例 3(In 演算子使用)

また、もし抽出したいフィーチャーの条件として「かつ、診療科目に小児科がある」という条件を加えるならば、次のような設定ができます。

Tester パラメーター設定例 4

注: 国土数値情報「医療機関」データ(Shapefile形式)のフィーチャーは、診療科目名を空白区切りで列挙した文字列を最大3つの属性(P04_004, P04_005, P04_006)に分割して格納しているので、それらを連結した文字列が「小児科」という文字列を含むときに真となるテスト句を追加し、AND(かつ)で連結しました。


フィルター(Filters)

本稿でとりあげた Tester のように何らかの条件に応じてデータフローを2以上の方向に分岐させるトランスフォーマーを「フィルター」と総称します。主に次のようなものがあり、用途に応じて使い分けてください。

  • AttributeFilter: 指定した属性の値に応じて分岐
  • AttributeRangeFilter: 指定した属性の値が存在する範囲に応じて多分岐
  • GeometryFilter: フィーチャーが持っているジオメトリの種類に応じて分岐
  • FeatureTypeFilter: フィーチャータイプ名に応じて分岐
  • Tester: 条件式の判定結果に応じて2方向に分岐
  • TestFilter: 条件式の判定結果に応じて3方向以上に分岐