2017-05-12

メッシュコードに基づくメッシュポリゴンの作成

e-Stat (政府統計の総合窓口) では、「平成22年国勢調査500mメッシュ」データ (平成22年国勢調査結果に基づいて推計された1/2分割地域メッシュ区画単位の男女別人口総数及び世帯総数) が公開されており、1次メッシュ区画ごとにCSV形式のデータファイルがダウンロードできます。

e-Stat 平成22年国勢調査500mメッシュデータ例















各行1列目には1/2分割地域メッシュのメッシュコード (9桁の数字) が記述されています。ここでは、そのメッシュコードに基づいて、当該メッシュ区画を表す矩形ポリゴン (以下「メッシュポリゴン」と言います) を作成することにより、CSV形式のデータをGIS用のデータセットに変換するワークスペース例を掲げます。

FME 2017.0.1.0 build 17288

FMEワークスペース例












[CSV2] リーダー: 平成22年国勢調査500mメッシュデータ (CSV形式) を読み込む
AttributeSplitter: 1/2分割地域メッシュコード (9桁文字列) を各要素に分割する
AttributeManager: 属性名変更、メッシュ区画南西隅の座標計算等
2DBoxReplacer: メッシュポリゴン作成
Inspector: FME Data Inspector に結果出力 (確認用)

1次メッシュ区画 5339, 5340 の変換例 (FME Data Inspector による表示)
背景は地理院地図 (淡色地図) です。

















[CSV2] リーダーでは、ソースデータの2行目に記述されている列名を属性名とし、3行目以降の各行をフィーチャーとして読み込みました。ただし、第2行1列目は空文字列なので、[CSV2] リーダーは1列目にデフォルトの属性名 "col0" を与え、これにメッシュコードが格納されることになります。

1/2分割地域メッシュコードは9桁の数字で構成されており、各桁を AABBCDEFG で表せば、以下の式でメッシュ区画の南西隅の座標 (xmin, ymin) を求めることができます。

xmin (秒) = (100 + BB) x 3600 + D x 450 + F x 45 + dx
ymin (秒) = AA x 2400 + C x 300 + E x 30 + dy
dx = G が 2 または 4 ならば 22.5, そうでなければ 0
dy = G が 3 または 4 ならば 15.0, そうでなければ 0

メッシュ区画の幅と高さは一定 (1/2分割地域メッシュの場合は 22.5秒 x 15.0秒) なので、南西隅の座標からメッシュ区画を表す矩形の範囲が決定できます。この例では、AttributeSplitter によってメッシュコード (9桁の数字) を AA, BB, C, D, E, F, G の7つの部分に分割したうえで、AttributeManager で上記式によって南西隅の座標を求める方針です。

AttributeSplitter の Delimiter or Format String パラメーターには、Attribute to Split パラメーターで指定した属性に格納されている文字列を分割するための区切り文字 (列) (カンマなど) を指定するほか、#s#s#s... (#は抽出する部分文字列の文字数) という書式によって、先頭から順番に連続して抽出する部分文字列の文字数を指定することもできます。いずれの場合でも、分割・抽出後の部分文字列は、List Name パラメーターで指定した名前のリスト属性に格納されます。

この例では、AttributeSplitter のパラメーターを次のように設定し、_c{} リストに AA ~ G を格納しました。

AttributeSplitter パラメーター設定画面

_c{} リストに格納される値
_c{0} = AA
_c{1} = BB
_c{2} = C (0 ~ 7)
_c{3} = D (0 ~ 7)
_c{4} = E (0 ~ 9)
_c{5} = F (0 ~ 9)
_c{6} = G (1 ~ 4)











AA ~ G が得られたので、次のような設定をした AttributeManeger によってメッシュ区画の南西隅の座標が求められます。ここで、G の値 (1 ~ 4) に応じて決まる dx, dy は、Conditional Value (条件別の値) として設定しています。また、浮動小数点数の計算誤差を回避する観点から、計算過程では数値を整数で扱った方が有利であるため、ここで求める座標の単位は1/10秒としました (そのため、式中の定数は、前述の式における定数の10倍になっています)。

AttributeManager パラメーター設定画面

























2DBoxReplcer は、パラメーターとして左下 (南西) 隅の座標、右上 (北東) 隅の座標を設定することにより、それらを結ぶ直線を対角線とする矩形ポリゴンを作成します。ここで、[1/10秒] から [度] への換算もあわせて行いました。

2DBoxReplacer パラメーター設定画面


















ワークスペース例では、Inspector を接続して FME Data Inpector によって変換結果を確認しているだけにしていますが、ベクターデータの格納をサポートする適当なフォーマットのライターをワークスペースに追加すれば、そのフォーマットの「平成22年国勢調査500mメッシュ」データセットが作成できます。


文字列の分割または部分文字列の抽出

文字列をカンマなどの特定の区切り文字 (列) で分割する場合は、AttributeSplitter を使うのが一般的です。

メッシュコードのように、文字数が固定されている複数の部分文字列で構成されている文字列も、上記例のように AttributeSplitter によって個別の部分文字列に分割することができますが、分割後の部分文字列の一部しか利用しない場合には、SubstringExtractor も選択肢のひとつになります。

特定の区切り文字 (列) がなく、部分文字列の文字数も固定されていない場合でも、元の文字列の構成パターンを正規表現で表すことができる場合には、StringSearcher (部分式を含む正規表現) によって文字列の分割や部分文字列の抽出ができます。

例えば、ひとつのデータセット内で、1/2分割地域メッシュコードが9桁の連続した数字だけでなく、数字以外の区切り文字 (ハイフンなど) で1次 ~ 3次、1/2分割メッシュコードを連結した文字列 (例: 5339-23-45-1) で記録されている可能性もある場合には、次のような正規表現を設定した StringSearcher によって、どちらの書式であってもメッシュ区画南西隅を求めるために必要な各要素を抽出することができます。

^(\d\d)(\d\d)\D*([0-7])([0-7])\D*(\d)(\d)\D*([1-4])$

0 件のコメント:

コメントを投稿