Q&A 属性値が同じポリゴンの結合

Q: 全国の市区町村ポリゴンデータに基づいて都道府県の区域を表すポリゴンデータを作成しようとしています。各市区町村ポリゴンは都道府県名を属性として持っていますが、その属性の値(都道府県名)が同じポリゴンを結合することによって47都道府県のポリゴンを作成するにはどうすれば良いですか。

FME 2019.1

A: 都道府県ごとに Dissolver によって隣接する市区町村ポリゴンを融合した後、Aggregator によって離島を含めて集約することができます。


Dissolver

Dissolver にポリゴンなどの面(Area)を表すジオメトリを持つフィーチャーを入力すると、境界で接し合っている、または、重なり合っているフィーチャーの融合が行われ、融合後のフィーチャーが Area ポートから出力されます。ここで Group By パラメーターで入力フィーチャーの属性を指定すると、その属性の値が同じフィーチャーのグループごとに処理が行われます。

このケースでは、都道府県名を格納している属性を Group By パラメーターに設定することで、都道府県ごとに境界で接し合っている市区町村ポリゴンを融合することができます。”KEN”という名前の属性に都道府県名が格納されているのであれば、Group By パラメーターにそれを指定してください。

Group By: ある属性の値が等しいフィーチャーのグループごとに処理を行いたい場合にその属性を選択します。複数の属性を選択した場合は、それらの属性の値がすべて等しいフィーチャーのグループごとに処理が行われます。

Tolerance: ジオメトリ間の空間的な関係について、FME 2017以前では、常にコンピューター内部の数値表現(倍精度浮動小数点数)における最大有効桁数での完全一致判定が行われましたが、FME 2018以降段階的にいくつかのトランスフォーマーに Tolerance パラメーターが導入され、任意の許容誤差を設定できるようになりました。

このパラメーターのデフォルトの設定(Automatic)ではFMEが許容誤差の値を自動的に設定しますが、Automatic では期待通りの結果が得られない場合には任意の値を設定することもできます(Custom Value を選択すると値が入力できるようになります)。また、FME 2017以前と同様に最大有効桁数での完全一致判定を行いたい場合には None を選択してください。

Dissolver の処理についてみると、FME 2017以前では、隣接するポリゴンの境界間にコンピューターの計算誤差に類するようなごくわずかな隙間があると、融合後にそれらが細長い「穴」として残ってしまうケースがよくありました。しかし、現在の Dissolver では、Tolerance パラメーターを活用することによってそのようなケースがかなりの程度回避できます。

上の例では 1e-4(1.0 x 10-4)を設定していますが、妥当な値は入力データの状態によって異なるので、FME Data Inspector で変換結果を確認しながら何度か試行錯誤することによって判断する必要があります。

Aggregate Handling: 入力フィーチャーが集約ジオメトリ(複数のジオメトリのパーツで構成されるジオメトリ)を持っていた場合の処理方法として、次のどれかひとつが選択できます。

  • Deaggregate: 個々のパーツに分解して複数の独立したジオメトリに変換してから処理を行います。
  • Reject: 処理は行わずに<Rejected>ポートから出力します。

Aggregator

日本の国土には離島(境界で接し合わないポリゴン)が多数あるため、Dissolver だけでは1都道府県1フィーチャーにまとめることはできませんが、Dissolver によって融合した後、さらに Aggregator を適用すれば、離島を含めて都道府県ごとのフィーチャーに集約することができます。Group By パラメーターの意味は Dissolver と同じです。

Attribute Accumulation セクションの次のパラメーターは Dissolver と Aggregator で共通です。

Accumulation Mode: 入力フィーチャーから出力フィーチャーへの属性の移行の仕方として、次のどれかひとつが選択できます。

  • Use Attributes From One Feature: 融合/集約前のフィーチャーのどれかひとつの属性セットを出力フィーチャーに移行します。例えば、フィーチャー1には属性Aだけがあり、フィーチャー2には属性Bだけがあったとき、それらを融合/集約したフィーチャーには属性Aまたは属性Bのどちらか一方が移行されます。融合/集約されたフィーチャーのうちどのフィーチャーの属性セットが出力フィーチャーに移行するかは不定です。
  • Merge Incoming Attributes: 融合/集約前のフィーチャーのすべての属性をマージして出力フィーチャーに移行します。例えば、フィーチャー1には属性Aだけがあり、フィーチャー2には属性Bだけがあったとき、それらを融合/集約したフィーチャーには属性Aおよび属性Bの両方が移行されます。どちらにも属性Cがあったとき、どちらの値が出力フィーチャーの属性Cに移行されるかは不定です。
  • Drop Incoming Attributes: Group By パラメーターおよび後述の Attributes to Sum パラメーター等で選択した属性を除き、入力フィーチャーの属性は出力フィーチャーに移行されません。

Attributes to Sum: 融合/集約した範囲のフィーチャーについて、このパラメーターで選択した属性の値の合計を求め、同じ名前の属性に格納して出力フィーチャーに与えます。

Attributes to Average: 融合/集約した範囲のフィーチャーについて、このパラメーターで選択した属性の値の単純平均を求め、同じ名前の属性に格納して出力フィーチャーに与えます

Attributes to Average, Weighted by Area: 融合/集約した範囲のフィーチャーについて、このパラメーターで選択した属性の値の面積加重平均を求め、同じ名前の属性に格納して出力フィーチャーに与えます。

注: Attributes to Sum パラメーター、Attributes to Average パラメーター、Attributes to Average, Weighted by Area パラメーターのふたつ以上に同じ属性を設定した場合にどのような結果が得られるかは定義されていません。


さて、元の市区町村フィーチャーが人口の値を格納している属性(以下「人口属性」と言います)を持っていたとしましょう。一見、Dissolver と Aggregator の Attributes to Sum パラメーターでその人口属性を選択すれば、都道府県ごとにジオメトリを融合/集約するのとあわせて都道府県の人口を求めることができそうですが、うまくいくでしょうか。

元の市区町村ポリゴンデータにおいてすべての離島や飛地が独立したフィーチャーであり、個々のフィーチャーの人口属性にはポリゴンが示す区域内の人口が割り当てられているのであれば、確かに Dissolver/Aggregator の Attributes to Sum パラメーターを使って都道府県ごとに人口の集計ができます。

しかし、元のデータが市区町村ごとに集約したもの(1市区町村 = 1フィーチャー)であり、人口属性には市区町村全域の人口が格納されている場合は、Dissolver (Aggregate Handling: Deaggregate) がそれを個別のパートに分解したときに元のフィーチャーの属性がすべてのパートにそのままコピーされるため、Aggregator で集計するときには各パートにコピーされた市区町村の人口が重複して加算されることになります。離島または飛地が2つある(3つのパートで構成されている)市区町村については、融合/集約の結果、人口が3倍になってしまうということです。

後者の場合で人口の集計を正しく行うには、Dissolver/Aggregator の Attributes to Sum パラメーターを使用するよりも、StatisticsCalclator によってあらかじめ都道府県ごとの人口集計を行っておき、融合、集約後の都道府県ポリゴンにFeatureMerger 等によって集計結果をあとから結合するというアプローチの方が分かり易く確実と思われますが、それについては稿を改めます。ここでは、Attributes to Sum パラメーター等の使用にあたっては、元データの内容や構造を調べ、期待通りの結果が得られるかどうか確認しておかなければならないということを記憶にとどめておいてください。