Spatial Relations | 空間的関係 | ||
INTERSECTS | CONTAINS | 含む | 交わる (離れていない) |
CROSSES | 横切る | ||
EQUALS | 等しい | ||
OVERLAPS | 重なる | ||
TOUCHES | 接する | ||
WITHIN | 含まれる |
ジオメトリ間の空間的関係としての INTERSECTS (交わる) は、CONTAINS, CROSSES, EQUALS, OVERLAPS, TOUCHES, WITHIN のうちのひとつ以上が成り立つ関係を指し、線と線または線と面の境界が交差している関係を指す CROSSES (横切る) とは区別します。
ここでは、国土数値情報の「鉄道 - 駅」 データ (線) と「行政区域」データ (面) の空間的関係に基づき、各駅に行政区域コードと所在地 (都道府県名, 郡・政令都市名, 市区町村名) の属性を与えるワークスペース例を掲げます。
FME 2015.1.1.0 build 15515
=====
国土数値情報「鉄道 - 駅」データ (線) の各駅に、所在する市区町村の「行政区域コード」と「所在地」属性を追加したデータを作成する。
1) 駅が市区町村に含まれる、または、市区町村の境界を横切る場合に、その市区町村に所在するものとする。
2) 「所在地」は、都道府県名、郡・政令都市名、市区町村名を半角スペース区切りで連結した文字列とする。
3) 複数の市区町村にまたがる駅の行政区域コードと所在地は、関係がある全ての市区町村のそれらの値をカンマ区切りで連結した文字列とする。
4) どの市区町村とも空間的関係がない駅の所在地は最も近い市区町村であるとみなす。
ソースデータ: 国土数値情報ダウンロードサービスサイトよりダウンロードした次のデータ。
(1) 鉄道駅: 「鉄道 (平成26年度)」の「駅」 (線) データ (Shapefile 形式, 全国1ファイル)
(2) 行政区域: 「行政区域 (平成27年1月1日時点)」 (面) データ (Shapefile 形式, 都道府県別47ファイル)
=====
FMEワークスペース例
[SHAPE] リーダー (鉄道駅): 国土数値情報「鉄道 - 駅」 (面) データを読み込む。
AttributeRenamer: 属性名を変更する。
[SHAPE] リーダー (行政区域): 国土数値情報「行政区域」 (面) データを読み込む。
AttributeRenamer_2: 属性名を変更する。
StringConcatenator: 都道府県名, 郡・政令都市名, 市区町村名をカンマ区切りで連結した文字列を作成し、「所在地」属性に格納する。
StringReplacer: 「所在地」属性文字列中の1個以上の連続するカンマをスペースに置換する。
AttributeTrimmer: 「所在地」属性文字列の前後の余分なスペースを削除する。
AttributeKeeper: 不要な属性を削除する (必要な属性のみ残す)。
SpatialRelator: 空間的関係 (CROSSES, WITHIN) がある市区町村の属性を鉄道駅に結合する。
TestFilter: 空間的関係がある市区町村数 (複数, 1, 0) に応じてデータフローを分岐する。
(複数の市区町村と空間的関係があった鉄道駅について)
ListConcatenator: 複数の行政区域コードをカンマ区切りで連結し、「行政区域コード」属性を更新する。
ListConcatenator_2: 複数の所在地をカンマ区切りで連結し、「所在地」属性を更新する。
(どの市区町村とも空間的関係がなかった鉄道駅について)
NeighborFinder: 最も近い市区町村の属性を鉄道駅に与える。
[MITAB] ライター: MapInfo (TAB) 形式ファイルに出力する。
結果: JR東日本上野駅~日暮里駅付近 (FME Data Inspector による表示)
・駅 (青色の線) は、分かり易いように若干量のバッファ (面) に変換してから表示したものです。
・背景画像は MapQuest Web Map Tile Service (Open Street Map) を利用しました。
国土数値情報「行政区域」データの属性テーブルには都道府県名、郡・政令都市名、市区町村名のフィールドがありますが、政令都市以外の市の「郡・政令都市名」、東京23区の「市区町村名」はブランク (空文字列) です (東京23区の区名は「郡・政令都市名」フィールドに記録されている)。
そのため、都道府県名、郡・政令都市名、市区町村名をスペース区切りで連結しただけでは、政令都市以外の市では都道府県名と市名の間にスペースが2個はさまり、東京23区では末尾に余分なスペースが付加されてしまいます。
これを回避するため、まず、StringConcatenator で都道府県名、郡・政令都市名、市区町村名をカンマ区切りで連結しておき、StringReplacer で1個以上の連続するカンマを半角スペース1個で置き換え、末尾の余分なスペースを AttributeTrimmer で削除しました。
左: StringConcatenator, 右: StringReplacer パラメーター設定画面
StringReplacer パラメーター
Text to Match: ,+ (1個以上の連続するカンマと一致する正規表現)
Replacement Text: (半角スペース1個)
Use Regular Expressions: yes (正規表現を使用する)
SpatialRelator は2つの入力ポート - Requestor と Supplier を持ち、Requestor フィーチャーに対する Supplier フィーチャーの空間的関係を判定し、その結果を属性として付加した Requestor を出力します。ひとつ以上の Supplier と空間的関係があった Requestor には、 関係があった Supplier の属性も結合されます。
SpatialRelator パラメーター設定画面
Tests to Perform: CROSSES WITHIN
Requestor (鉄道駅) が Supplier (行政区域) に含まれる (WITHIN)、または、Supplier (行政区域) の境界を横切る (CROSSES) かどうかを調べます。
鉄道駅 (線) が行政区域 (面) に接する場合も「所在」の定義に含むという場合には、TOUCHES を加えるか、または、INTERSECTS を選択します。
List Name: _relationships
Tests to Perform パラメーターで指定した空間的関係があった全ての Supplier (行政区域) の属性 (行政区域コード、所在地) を、このパラメーターに指定した名前の構造化リスト (_relationshipts{}.<属性名>) に格納して Requestor (鉄道駅) に付加します。
構造化リストについては「文字列の分割とリスト属性の展開」の補足を参照してください。
Related Suppliers Count Attribute: _related_candidates
Tests to Perform パラメーターで指定した空間的関係があった Supplier (行政区域) の数を、このパラメーターに指定した名前の属性 (_related_candidates) に格納して Requestor (鉄道駅) に付加します。
TestFilter によって、SpatialRelator から出力される鉄道駅フィーチャーを "_related_candidates" 属性の値に応じて次の3つの出力ポートに振り分けます。
[Multiple] 複数の市区町村と空間的関係があった駅 (If 1 < _related_candidates)
[Single] ひとつ市区町村だけと空間的関係があった駅 (Else If 0 < _related_candidates)
[None] どの市区町村とも空間的関係がなかった駅 (Else)
TestFilter パラメーター設定画面
[Multiple] ListConcatenator によって複数の市区町村の行政区域コード、所在地をカンマ区切りで連結してからライターフィーチャータイプに接続
ListConcatenator パラメーター設定画面 (左: 行政区域コード連結, 右: 所在地連結)
[Single] そのままライターフィーチャータイプに接続
[None] NeighborFinder によって最も近い市区町村の属性を結合したうえでライターフィーチャータイプに接続
実データでは2駅がこのケースに該当しました。行政区域 (面) データが存在しない海上にある駅と思われます。
NeighborFinder パラメーター設定画面 (デフォルトの設定)
NeighborFinder は、デフォルトでは2つの入力ポート - Base と Candidate を持ち、最も近い Candidate フィーチャーの属性を結合した Base フィーチャーを Matched ポートから出力します。このワークスペース例ではデフォルトの設定で使いました。
この他にも NeighborFinder にはさまざまな機能、使い方がありますが、それらについては別の記事で取り上げたいと思います。
0 件のコメント:
コメントを投稿