2015-07-14

数値計算 - 数学関数

数学関数を使って数値計算を行うワークスペース例を掲げます。

FME 2015.1.0.3 build 15485
# 数学演算子及びトランスフォーマーのパラメーターへの数式の設定方法については、「数値計算 - 数学演算子」を参照してください。

=====
日本周辺のジオメトリデータ(緯度経度)を含む任意のデータセットから読み込まれた全てフィーチャーについて、それらをカバーする範囲の1次メッシュ区画(矩形ポリゴン)を作成する。
ソースデータ: 任意。ただし、日本周辺のジオメトリデータ(緯度経度)を含むもの。
=====

FMEワークスペース例















BoundingBoxAccumulator: 全ての入力フィーチャーのジオメトリをカバーする最小の矩形ポリゴンを作成する。
BoundsExtractor: バウンディングボックス南西端、北東端の座標を抽出して属性に格納する。
AttributeCreator: メッシュ区画作成範囲の南西端、北東端を南西隅とする区画のメッシュコード成分を求める。
Cloner: 南北方向のメッシュ区画数分、フィーチャーをコピーする。
Cloner_2: 東西方向のメッシュ区画数分、フィーチャーをコピーする。
AttributeCreator_2: 各フィーチャーのメッシュコード成分を求める。
2DBoxReplacer: メッシュコード成分に基づいてメッシュ区画(矩形ポリゴン)を作成する。

結果: 5県の区域をカバーする1次メッシュ区画



















1次メッシュコードは4桁の数字 AABB で構成され、その成分 AA, BB は次のように定義されています。
AA = 1次メッシュ区画南端緯度 × 1.5
BB = 1次メッシュ区画西端経度 - 100

このワークスペース例では、(1) BoundingBoxAccumulator によって読み込まれた全てのフィーチャーをカバーする最小の矩形領域(バウンディングボックス)を作成し、(2) BoundsExtractor によってその南西端の座標: (_xmin, _ymin), 北東端の座標: (_xmax, _ymax) を抽出したうえで、(3) AttributeCreator によって、メッシュコード成分の定義に基づき、そのバウンディングボックスを含む範囲の1次メッシュ区画のうち、
・南西隅の区画の1次メッシュコード成分: [a0, b0]
・北東隅の区画の北東に隣接する区画(ひとつ斜め右上)の1次メッシュコード成分: [a1, b1]
を求めています。

AttributeCreator パラメーター設定画面
















1次メッシュコードの各成分(整数)を求めるために、ここで次の3つの数学関数を使いました。
-----
@floor(arg): arg を超えない範囲で最大の「小数部が 0 の値」を求める。
@ceil(arg): arg を下回らない範囲で最小の「小数部が 0 の値」を求める。
@int(arg): arg の小数部を切り捨てて整数型の値に変換する。
-----
floor 関数と ceil 関数はどちらも「小数部が 0 の値」を返します。これらの関数が返す「小数部が 0 の値」は整数と等価ですが、内部のデータ型としては整数ではなく浮動小数点数です。そのため、例えば % 演算子の被演算子のように整数型の値でなければならない場所でこれらの関数が返した値をそのまま使うと、ワークスペースの実行時にエラーが生じるケースがあります。
この例ではそのままでも支障はないと思われますが、メッシュコードの成分は整数として取り扱われる値なので、念のため int 関数によって整数型の値に変換しました。

FME 2016 で floor, ceil, および round 関数は64bit整数値を返すように変更されました。ただし、有効桁数は倍精度浮動小数点数と同じ15桁程度です。

ほとんどの数学関数は、関数名に続く ( ) 内の値(数値を返す式や他の関数でも良い)を受け取り、その値を使った計算結果を返します。関数が受け取る値を「引数(ひきすう)」 (argument) と呼び、関数が返す値は、「戻り値」あるいは「返却値」と呼ばれることがあります。例外的に、円周率を返す pi  関数と、乱数を返す rand  関数は引数を必要としませんが、数式内では、"@pi()", "@rand()" のように空の () は書く必要があります。
数学関数は数式の中で、数学演算子の被演算子、あるいは、他の関数の引数として使用することができます。この記事の末尾に数学関数の一覧表を掲げました。

トランスフォーマーのパラメーターに数式を設定するのには、数式エディタを使用します。数式エディタの使い方については「数値計算 - 数学演算子」を参照してください。数学演算子と同様に、数学関数も数式エディタの左側 Math Functions セクションに一覧表示されており、ダブルクリックまたはドラッグ・アンド・ドロップで編集中の数式に挿入できます。編集画面上で直接キー入力することもできます。

Cloner は、Number Of Copies パラメーターに指定された数だけ入力フィーチャーをコピーし、出力順のインデクス(0から始まる連番)を格納した属性(Copy Number Attribute パラメーターに指定された名前)を各フィーチャーに付加して出力します
ここでは、1番目の Cloner で南北方向のメッシュ区画数(= a1 - a0)、2番目の Cloner で東西方向のメッシュ区画数(= b1 - b0) のコピーをすることにより、作成すべきメッシュ区画数分のフィーチャーを作成するとともに、各フィーチャーに南北方向の行インデクス(_row)と東西方向の列インデクス(_col)を与えています。
ここで BoundingBoxAccumulator によって作成されたバウンディングボックス(矩形ポリゴンジオメトリ)もコピーされますが、この後の処理で必要なのは属性だけです。この例では行っていませんが、無用なジオメトリのコピーを避けたい場合は、Cloner の前で GeometryRemover を使ってジオメトリをあらかじめ削除することができます。

次の AttributeCreator によって、作成範囲南西隅の区画の1次メッシュコード成分 [a0, b0] に [_row, _col] を加算して個々の1次メッシュ区画のメッシュコード成分 [a, b] を求めてから、最後の 2DBoxCreator によって、そのメッシュコード成分に基づいてメッシュ区画(矩形ポリゴン)を作成しました。

AttributeCreator_2, 2DBoxReplacer パラメーター設定画面












ここで掲げたワークスペース例は、入力フィーチャーをカバーするバウンディングボックスに基づいてメッシュ区画を作成するので、前出の結果図の南西隅のように入力フィーチャーと重ならないメッシュ区画も作成されます。これを除外したい場合は SpatialFilter によって入力フィーチャーと重なるものだけを選択する処理を追加すれば良いのですが、実務としては、JpStdGridAccumulator (FME Store トランスフォーマー) を使うのが簡単です。

JpStdGridAccumulator 使用例
















参照: FME リファレンス > 数学関数 (Math Functions)

0 件のコメント:

コメントを投稿