2015-08-03

集約と集計

複数のフィーチャーを束ねてひとつのフィーチャーにまとめることを「集約」 (aggregate) と言います。複数のシングルパートのジオメトリをひとつのマルチパートのジオメトリに変換することは、集約の典型例です。

FME では Aggregator トランスフォーマーによって集約が行えますが、このトランスフォーマーはジオメトリを集約するだけでなく、集約前のフィーチャーが持っていた属性値の集計等を行うオプション機能も持っています。

ここでは、国土数値情報「人口集中地区 (DID)」データ  (ポリゴン) を使い、各人口集中地区のシングルパートポリゴンを市区町村ごとのマルチパートポリゴンに集約するのとあわせて、人口集中地区の人口、面積を市区町村単位で集計して集約後のフィーチャーに付加するワークスペース例を掲げます。

FME 2015.1.1.0 build 15515

=====
国土数値情報「人口集中地区 (DID)」データに基づき、市区町村ごとに DID 人口、面積を集計する。

ソースデータ:
国土数値情報ダウンロードサービスサイトよりダウンロードした「人口集中地区 (DID)」データ (Shapefile 形式ポリゴン)

各DIDには、属性としてユニークなIDが与えられている。
飛び地があるDIDは複数のシングルパートポリゴンに分割されているが、各パートの人口、面積等の属性にはそのDID全体の値が格納されている (パートごとの値ではない)。
次の表の千葉市中央区の DID (DIDid=121011) は 3 つのパートに分割されている例であり、千葉市花見川区は1市区町村内に複数の DID (DIDid=121021, 121022, 121023, 121024) がある例である。

ソースデータ: FME Data Inspector による表示 (平成22年 千葉県の例)














=====

FMEワークスペース例












[SHAPE] リーダー: 国土数値情報「DID」データ (シングルパートポリゴン) を読み込む。
AttributeRenamer: 属性名を変更する。
DuplicateRemover: DIDid がユニークなフィーチャーと重複するフィーチャーに分離する。
AttributeCreator: DIDid が重複するフィーチャーの人口、面積の値を 0 にする。
Aggregator: 市区町村ごとにジオメトリを集約するとともに、人口、面積を集計する。
Sorter: 市区町村コード順にソートする。
[MITAB] ライター: MapInfo (TAB) 形式のファイルに出力する。

結果: FME Data Inspector による表示 (平成22年 千葉県の例)






















後述するように Aggregator は集約前のフィーチャーの属性値を集計する機能を持っていますが、国土数値情報「人口集中地区 (DID)」データでは、ひとつのDIDが複数のフィーチャー (パート) に分かれている場合に、各パートの人口等の属性にはパートごとの値ではなくそのDID全体の値が格納されているため、そのまま集計すると過大な値になってしまいます (Nパートの DID の人口等の値はN倍になる)。
これを回避するために、このワークスペース例では、DuplicateRemover によって、入力順に初めて現れるIDを持つフィーチャー (Unique) と2回目以降のフィーチャー (Duplicate) に分離し、AttributeCreator によって2回目以降のフィーチャーの人口と面積の値を 0 にしました。

このような前処理をしたうえで、Aggregator によって入力フィーチャーを集約します。

Aggregator パラメーター設定画面


























Group By: 市区町村コード 市区町村名
「市区町村コード」と「市区町村名」によって入力フィーチャーをグループ化します。

Mode: Geometry - Assemble One Level
入力フィーチャーが持っているジオメトリをグループ (市区町村) ごとに1階層で集約します (シングルパートポリゴンを市区町村ごとのマルチパートポリゴンにする)。

Keep Input Attributes: No
Group By パラメーターに指定した属性以外は維持しません。

Attributes to Sum: DID人口 DID面積
入力フィーチャーの「DID人口」属性と「DID面積」属性の値をグループ (市区町村) ごとに集計し、集約後のフィーチャーに属性として付加します。その属性名は、集約前のフィーチャーが持っていた属性名と同じになります。

なお、フィーチャーの入力順が Group By パラメーターで指定した属性値の昇順または降順であることが保証される場合は、Input is Ordered by Group パラメーターを Yes に設定することで効率が良くなります。また、その場合の出力順はグループの入力順と同じになるので、Sorter を省くことができます。

Aggregator の 属性処理オプション
Aggregator パラメーター設定画面の Attribute Accumulation グループでは、属性の処理について次のようなオプションが設定できます。

Keep Input Attributes:
"Yes" を選択したときは、入力フィーチャーの属性が集約後のフィーチャーに引き継がれます。グループ内で異なる値が現れる属性については、入力順で最初の値が維持されます。
"No" を選択したときは、Group By パラメーターに指定した属性以外の属性が破棄されます。
ただし、いずれの場合でも、後述の連結、集計等を行った属性には、連結、集計等の結果が格納されます。

FME 2016.1 以降では、Accumulation Mode パラメーターによって、Keep Input Attributes パラメーターと同等の設定ができます。新旧パラメーターの選択肢は、次の表に示すように対応しています。
Keep Input Attributes (FME 2016.0 以前) 選択肢Accumulation Mode (FME 2016.1 以降) 選択肢
NoDrop Incoming Attributes
YesMerge Incoming Attributes
(該当なし)Get Attributes from One Representative Feature
FME 2016.1 で追加された "Get Attributes from One Representative Feature" を指定した場合は、同一グループに属する入力フィーチャーのうち、最初に入力されたものの属性のみが集約後のフィーチャーに引き継がれます。

List Name:
リスト属性名を指定したときは、グループ内の全てのフィーチャーの属性を格納した構造化リストが集約後のフィーチャーに付加されます。「構造化リスト」については「文字列の分割とリスト属性の展開」の補足を参照してください。

Attributes to Concatenate (連結):
このパラメーターで指定した属性については、グループ内の全てのフィーチャーの属性値を "Separator Character" で指定した区切り文字(列) で連結した文字列を作成し、集約後のフィーチャーに属性として付加します。その属性名は、パラメーターに指定した属性名と同じになります (以下のパラメーターについても同じ)。

Attributes to Sum (集計):
このパラメーターで指定した属性については、グループ内の全てのフィーチャーの属性値の合計を求め、集約後のフィーチャーに属性として付加します。

Attributes to Average (平均):
このパラメーターで指定した属性については、グループ内の全てのフィーチャーの属性値の平均値を求め、集約後のフィーチャーに属性として付加します。

Attribute to Average, Weighted by Area (面積加重平均):
このパラメーターで指定した属性については、グループ内の全てのフィーチャーの属性値の面積加重平均値を求め、集約後のフィーチャーに属性として付加します。
※入力フィーチャーのジオメトリタイプが Area である場合のみ

同じ属性を連結、集計、平均、面積加重平均の2つ以上に同時に指定することは想定されておらず、その場合の結果は仕様として明示されていません。同じ属性について複数の処理をしたいときは、事前に AttributeCopier によって別の名前の属性に値をコピーし、異なる属性名によってそれらの処理を行ってください。

=====
2015-08-04追記: リスト属性 (構造化リスト) を利用した別案

Aggregator の List Name パラメーターにリスト属性名を指定して集約前のフィーチャーの全属性を構造化リストに格納し、リスト操作によって集計をする方法もあります。

FMEワークスペース例
















Aggregator: 市区町村ごとにフィーチャーを集約し、集約前のフィーチャーの属性を構造化リストに格納する。
ListDuplicateRemover: リストから DIDid が重複する要素を削除する。
ListSummer: DID人口を集計する。
ListSummer_2: DID面積を集計する。

ListDuplicateRemover は、指定したリスト属性から重複する要素を削除してユニークな要素のみにします。このトランスフォーマーによって構造化リストのメンバー (この例では "_list{}.DIDid") から重複要素を削除した場合には、そのリストの他のメンバー ("_list{}.DID人口", "_list{}.DID面積" など) からも対応する要素が削除されます。
ListSummer は、Source List Name パラメーターに指定されたリスト属性 (構造化リストの場合はそのメンバー) の全要素の合計値を求めて、Sum Attribute パラメーターに指定された名前の属性に格納します。数値として解釈できない要素の値は 0 と見なされます。

0 件のコメント:

コメントを投稿