2015-07-05

属性結合の基本的な方法

データ統合を行う際には必ずといって良いほど現れる属性結合(データベースの「テーブル結合」に相当する処理)の基本的な方法を示すワークスペースの例です。
FME 2015.1.0.3 build 15485

=====
平成22年国勢調査の人口、世帯数の市区町村別集計表(CSV形式)と調査時点の市区町村の区域を表すGISポリゴンデータ(Shape形式)に基づき、人口、世帯数を属性として持つ市区町村ポリゴンデータ(KML形式, 都道府県別レイヤ)を作成する。

ソースデータセット
(1) 平成22年国勢調査による市区町村別人口、世帯数集計結果
e-Stat 政府統計の総合窓口からダウンロードした「男女別人口及び世帯の種類(2区分)別世帯数」テーブル(CSV 形式, 全国1ファイル)
e-Stat 政府統計の総合窓口
平成22年国勢調査 > 人口等基本集計(男女・年齢・配偶関係,世帯の構成,住居の状態など)> 全国結果
総人口・総世帯数 表番号2「男女別人口及び世帯の種類(2区分)別世帯数」

(2) 平成22年国勢調査時点(2010年10月1日現在)の市区町村ポリゴンデータ
次のツールによって作成した2010年10月1日現在の市区町村ポリゴン(Esri Shape 形式, 全国1ファイル)
Municipality Map Maker ウェブ版 市区町村区域のGISデータ生成ツール
=====

FMEワークスペース - FeatureMerger の使用例

















[SHAPE] リーダー: 市区町村ポリゴンを読み込む。
[CSV] リーダー: 人口等集計表から市区町村のレコードを読み込む。
StringFormatter: 市区町村コード(JISCODE)の書式を5桁数字に整える。
AttributeKeeper: 必要な属性のみを残す。
FeatureMerger: 市区町村コードをキーとして、人口等の属性をポリゴンに結合する。
AttributeRenamer: 出力先のスキーマにあわせて属性名を変更する。
KMLStyler: KMLの表示スタイル(ラインの幅、ライン・ポリゴンの色など)を設定する。
[OGCKML] ライター: KMLデータセット(*.kml または *.kmz)を作成する。

FeatureMerger には Requestor と Supplier の2つの入力ポートがあり、デフォルトでは、指定した属性(この例では市区町村コード)の値が一致する Supplier フィーチャーの属性を Requestor フィーチャーに結合して Merged ポートから出力します。これにより、ソースデータセットのフォーマットが何であっても、データベースの世界で言うところの「テーブル結合」に相当する処理を行うことができます。

CSVテーブルから必要なレコードを抽出する方法については、次のトピックを参照してください。
FMEユーザーフォーラム > [サンプル] CSVテーブルを正規化する

KMLライターフィーチャータイプでは、Feature Type Name (出力先のフィーチャータイプ名)に次の文字列式を設定することにより、各フィーチャーの出力先を都道府県別のレイヤに振り分けることができます。
-----
@Substring(@Value(JISCODE),0,2)_@Value(PNAME)
-----
この文字列式は、ワークスペースの実行時に、JISCODE属性の値(市区町村コード)の先頭2文字(都道府県コードの部分)とPNAME属性の値(都道府県名)をアンダースコアをはさんで連結した文字列(例えば"01_北海道"、"13_東京都")に置き換えられます。

結果: Google Earth による表示例

















テーブル結合を行うトランスフォーマーは FeatureMerger だけではありません。InlineQuerier では、パラメーターとして設定したSQL文によってテーブル結合を行うことができます。

FMEワークスペース - InlineQuerier の使用例














SQL文(InlineQuerier の SQL Query)の例: テーブル結合、必要な属性の抽出、属性名の変更
-----
select a.*,
b.[人口 総数] as [人口総数],
b.[人口 男] as [人口男],
b.[人口 女] as [人口女],
b.[世帯数 総数] as [世帯数総数],
b.[世帯数 一般世帯] as [一般世帯],
b.[世帯数 施設等の世帯] as [施設等世帯],
b.[世帯数 不詳] as [不詳世帯]
from MMM as a inner join CENSUS as b on b.[地域コード] = a.JISCODE order by a.JISCODE
-----

InlineQuerier は、ワークスペースの実行時に一時的な SQLite データベースを作成して入力フィーチャーを格納し、SQL文によるクエリの結果を出力します。
入力ポートはひとつ以上いくつでも追加することができ、ポートごとにポート名と同じ名前のデータベーステーブルが作成されて、そのポートから入力されたフィーチャーが格納されます。出力ポートもいくつでも追加することができ、それぞれから異なるSQL文によるクエリの結果を取得することができます。

クエリそのものは非常に高速で実行されますが、データベースを作成するための時間を消費するので、全体として FeatureMerger と InlineQuerier のどちらの方が効率が良いかはケースバイケースであって、一概には言えません。この例では、有意な差は見られませんでした。

その他、ワークスペースのデータフロー内でテーブル結合を行うのには Joiner が効果的な場合もあります。また、同じデータベース内の複数のテーブルを結合するという場合には、SQLCreator または SQLExecutor によってそのデータベースに対して直接SQLクエリを発行して結果テーブルを取得することもできます。
Joiner は「メッシュデータのラスター化 - 土地利用細分メッシュ」で使用しました。

補足: この例で使用した市区町村ポリゴンデータには北方四島3村が含まれていますが、国勢調査人口等集計表の方には含まれていないため、FeatureMerger の Merged ポートからその3村のポリゴンは出力されません。それらを出力先データセットに含みたいときは、NotMerged ポート(結合されなかったRequestorフィーチャーが出力される)も利用してください。InlineQuerier の場合は、SQL文におけるテーブル結合方法を左外部結合(left outer join)に変更すれば3村を含めた結果が得られます。

0 件のコメント:

コメントを投稿