2015-07-07

データフローの分岐 - 異なる形式の複数のデータセット作成

データフローを分岐することにより、同一のソースデータに基づいて異なる形式の複数のデータセットを作成するワークスペースの例です。
FME 2015.1.0.3 build 15485

=====
原子力規制委員会「放射線モニタリング情報」サイトで公開されている航空機モニタリングによる空間線量率の測定結果(第1次航空機モニタリング, CSVテーブル)に基づき、ラスター、点群(ポイントクラウド)、GISベクター(ポリゴン)データを作成する。

ソースデータ
放射線モニタリング情報 原子力規制委員会
> モニタリング結果 > 環境モニタリング一般等 > 航空機モニタリング結果 > 航空機モニタリングによる空間線量率の測定結果
第1次航空機モニタリング(平成23年4月6日~29日測定) 平成23年05月06日 (CSV)
ダウンロードファイル名: 1st_airborne.csv
測定エリアは正方グリッドでメッシュに分割されており、ソースデータのCSVテーブルには1メッシュ区画1行で、メッシュ中心、メッシュ区画南西端、北東端の緯度、経度とその測定地点の空間線量率等が記録されている。

作成するデータの仕様は次のとおり。
・ラスター: Geotiff形式。画素のサイズはメッシュサイズと同じとし、各画素の値 = 空間線量率とする。
・点群(ポイントクラウド): LAS形式。各ポイントのZ値 = 空間線量率/1000 とする。
・ポリゴン: KML形式。空間線量率の階層区分別にメッシュ区画(矩形ポリゴン)を結合し、区分別の色を設定する。
=====

FMEワークスペース例


















[CSV] リーダー: ソースデータ(CSVテーブル)を1レコードずつ読み込む。
AttributeRenamer: 属性名を変更する(必須ではないが、分かり易くするため)。
AttributeKeeper: 不要な属性を削除する(必要な属性のみ残す)。
AttributeClassifier: 空間線量率が数値表現であるレコードのみを使用する。
ソースデータでは、空間線量率が 0.1 μSv/h 未満の場合に "<1.0E-01" という表現をしています。このワークスペース例では AttributeClassifier によって空間線量率が数値表現でないレコードを単に除外しましたが、この表現をある特定の値(例えば0.05)に置き換えて処理対象にしたいという場合は、 AttributeClassifier の Failed ポートに AttributeCreator を接続して "空間線量率" 属性をその値で上書きしてから、後続のトランスフォーマーで合流させれば良いです。

(座標値に基づくジオメトリ作成)
VertexCreator: メッシュ中心の座標と空間線量率に基づいて3Dポイントを作成する。
2DBoxReplacer: メッシュ区画の南西端、北東端の座標に基づいてメッシュ区画を表す矩形ポリゴンを作成する。

1. ラスターデータの作成
NeighborFinder: 各ポイントについて最も近い隣接ポイントを探す(ポイント間の距離も得られる)。
StatisticsCalculator: 最も近い隣接ポイントとの距離の最頻値、測定エリアの南西端、北東端の座標を求める。
NumericRasterizer: 3Dポイント群をラスターに変換する。
[GEOTIFF] ライター: Geotiffファイルに出力する。
データダウンロードサイトにおいて、CSVデータには測定エリアをグリッドで分割したメッシュ区画の単位で空間線量率が記録されているということは説明されていますが、メッシュのサイズや測定エリア全体の範囲は示されていません。そのため、NeighborFinder と StatisticsCalculator によって、隣接するポイント間の距離の最頻値としてグリッドの間隔を求めるとともに測定エリアの範囲(南西端、北東端の座標)も求め、それらを NumericRasterizer で3Dポイント群をラスターに変換する際のパラメーターとして使いました。

2. 点群(ポイントクラウド)データの作成
PointCloudCombiner: 3Dポイント群を点群(ポイントクラウド)に変換する。
Scaler: Z値を 1/1000 にする。
[LAS] ライター: LASファイルに出力する。

結果: FME Data Inspector によるラスター(左), ポイントクラウド(右)表示例
カラー値を持たないポイントクラウドについて、 FME Data Inspector はデータセット内における相対的なZ値の大小関係に基づいて自動的に右図のようなカラー表示をします(KMLに設定したスタイルとは無関係です)。
















3. ベクターデータ(空間線量率の階層区分別のポリゴン)の作成
AttributeCreator: 空間線量率の階層区分を表す属性 "Rank" (値: 0~5) を作成する。
Dissolver: 階層区分ごとに隣接するメッシュ区画ポリゴンを融合する。
KMLStyler: KML表示スタイル(階層区分ごとの色)を設定する。
[OGCKML] ライター: KMLファイル(階層区分別レイヤ)に出力する。
ライターフィーチャータイプのフィーチャータイプ名フィールドに次の文字列式を設定することにより、各ポリゴンを階層区分別のレイヤ ("Rank_0" ~ "Rank_5") に振り分けて出力することができます。
-----
Rank_@Value(Rank)
-----

結果: Google Earth によるKMLポリゴンデータの表示例(手前が太平洋)
















リーダーフィーチャータイプやトランスフォーマーの出力ポート直後でデータフローを分岐させる(複数のトランスフォーマーやライターフィーチャータイプの入力ポートに同時に接続する)と、各フィーチャーはそこで分岐の数だけコピーされてそれぞれの分岐先に送られます。
この例では、CSVから読み込まれた各フィーチャー(レコード)を「メッシュ中心の座標に基づく3Dポイント作成」と「メッシュ区画の南西端、北東端座標に基づく矩形ポリゴン作成」のフローに分岐し、さらに、3Dポイント作成後のフローを「ラスターへの変換」と「ポイントクラウドへの変換」のフローに分岐しています。

なお、何らかの条件に基づいてフィーチャーを複数の方向に振り分けることによるデータフローの分岐(条件分岐)もありますが、それについては「属性値の条件に基づくデータ抽出」で取り上げます。

データフローの分岐はどこでも、何度でも行うことができるので、この例のように、中間データファイルなどを介することなく、同一のソースデータセットに基づいて必要に応じていくつでも異なる形式の複数のデータセットを同時に作成することができます。
また、ワークスペースの規模が大きくなってくると、データ変換が思った通りに正しく行われているかどうか、処理の中間段階での状態を確認したいこともよくありますが、そのような場合にも、確認したい場所でデータフローを分岐し、 Inspector に接続して Data Inspector に出力することによって処理の途中の状態を確認することができます。
その他、出力先データセットに付随するメタ情報をデータ作成と同時にテキストやXMLなどに書き出すなどの関連作業について、データフローを分岐させることによってひとつのワークスペースに組み込んで自動化するといったことも考えられます。

0 件のコメント:

コメントを投稿