2017-02-26

DEMラスターや標高APIによる標高値取得

ある地点について高精度の標高値を得るには、現地に赴いて測量したり精度の良いGPSで計測したりしなければなりませんが、おおむねの値で良ければ、ウェブ上で公開されているデータやサービス - 基盤地図情報「数値標高モデル」(DEM)や「標高API」によって取得することができます。

しかし、おおむねの値で良いとはいえ、データソースによって値がどの程度ばらついているものなのかは、ちょっと気になるところです。

そこで、基盤地図情報基本項目「標高点」に記述されている標高値、および、それらの標高点と同じ地点(座標)について基盤地図情報DEMと標高APIによって取得した標高値の対比表を作成してみました。


国土地理院 標高API
リクエストURL
http://cyberjapandata2.gsi.go.jp/general/dem/scripts/getelevation.php?<パラメーター>

パラメーター名備考
lon十進経度
lat十進緯度
outtypeJSONレスポンスをJSON形式で取得する場合に固定文字列「JSON」とする

レスポンス(JSON文書)
{"elevation":<標高値>, "hsrc":<データソース>}


FMEワークスペース例(FME 2016.1.3.2 build 16717)












[JP_FGD_DEM] リーダー(カスタムフォーマット): 基盤地図情報DEMをラスターとして読み込む。
[GML] リーダー: 基盤地図情報基本項目「標高点」を読み込む。
PointOnRasterValueExtractor: 標高点の位置におけるDEMラスターのバンド値(標高値)を取得する。
CoordinateExtractor: 標高点の座標(経度, 緯度)を属性として抽出する。
HTTPCaller: 標高APIにリクエストを発行し, レスポンス(JSON文書)を取得する。
JSONFlattener: JSON文書からメンバー(elevation, hsrc)を属性として抽出する。
AttributeManager: 一部の属性名の変更, 不要な属性の削除
[XLSXW] ライター: Excelスプレッドシートに結果を出力する。

結果: 二次メッシュ 5338-05 (148標高点) についての実行結果


















基盤地図情報「数値標高モデル」(DEM)は FME Hub で公開されている JP_FGD_DEM カスタムフォーマットによってラスターとして、基盤地図情報「基本項目」の各データは標準の GML リーダーによってベクターとして読み込むことができます。

PointOnRasterValueExtractor では、Point ポートから入力された各ポイントの位置について、指定された補間方法によって求められたラスターのバンド値が取得できます。

補間方法としては、Interpolation Type パラメーターによって下記のうちどれかひとつが指定できます。上記の結果(DEM標高値)は Bilinear によるものです。
・Nearest Neighbor (最近傍)
・Bilinear (バイリニア補間)
・Bicubic (バイキュービック補間)
・Average 4 (4近傍平均)
・Average 16 (16近傍平均)

次に、CoordinateExtractor によって標高APIリクエストのパラメーターとして必要な経度と緯度を属性として抽出してから HTTPCaller によってリクエストを発行し、レスポンス(JSON)を属性(_response_body)として受け取ります。

HTTPCaller パラメーター設定画面

























JSON文書に記述されている2つのメンバー elevation (標高値), hsrc (データソース) は JSONFlattener によってそれぞれ同名の属性に格納できます。ただし、それらの属性を後続のトランスフォーマーやライターフィーチャータイプで参照するには、Attributes to Expose パラメーターによってワークベンチのインターフェースに現しておく必要があります。

JSONFlattener パラメーター設定画面






















最後に、(この例では必須ではありませんが)AttributeManager によって属性名を変更したり不要な属性を削除したりしてから、Excelファイルに出力しました。

2017-02-25

境界線と代表点に基づくポリゴンデータの作成

先日、あるGIS関連会社の社内勉強会でFMEについて紹介させていただく機会があり、多数の方々が熱心に聞いてくださいました。大変ありがとうございました。

会場に向かう途中、時間調整で立ち寄ったコーヒー店で標題のテーマを思いつきました。

紙地図などに基づいてGIS用のポリゴンデータを作成する場合、多かれ少なかれ、マニュアル(手作業)でデジタイズする工程は避けられないと思いますが、例えば行政区域のように、隣接する領域の境界が一致していなければならないものについて、マニュアルで「面」を作成しようとすると、隣接する領域の境界を一致させるのに結構手間がかかるのではないでしょうか。

実際、隣接する領域の境界が一致していないデータはたくさんあり、単独の主題図として利用する場合には問題にならないほどのわずかなものであっても、融合(dissolve)したときに隙間が生じるなど、ジオメトリデータとしての再利用は難しいということには頻繁に出くわします。

マニュアルの工程では、隣接する領域を区分する境界線(ライン)と各領域内部の代表点(ポイント)を作成することにし、ポリゴンデータとして仕上げるのはFMEにまかせることにすれば、データの精度を向上させつつ、かつ、作業の効率化(工期短縮、コストカット)も図れるのではないか、という発想です。

上記勉強会でも考え方をお話ししましたが、コーヒー一杯の時間ではFMEワークスペース例の用意まではできなかったので、ここで紹介します。

ソース:
・境界線(ライン、属性なし)
・代表点(ポイント、属性として地物のIDを持つ)
・属性テーブル(ID、その他の属性)















FMEワークスペース例 (FME 2016.1.3.2 build 16717)











[FILEGDB] リーダー: マニュアル工程で作成された境界線と代表点を読み込む。
Intersector: 境界線を交点で分割し, 隣接する境界線が端点で接するようにする。
AreaBuilder: 端点で接する境界線で囲まれた領域を表すポリゴンを作成する。
SpatialFilter: 代表点の属性(ID)を空間的関係(含まれる: Within)があるポリゴンに与える。
Aggregator: 同一IDのポリゴンを集約する(飛び地をまとめる)
FeatureMerger: IDをキーとして, 外部テーブル(Excel)で整理したその他の属性を結合する。
[ESRISHAPE] ライター: Shapefile形式のファイルに出力する。

結果: Esri ArcMap による表示例


ソース、出力先のデータフォーマットは、ベクタージオメトリ(点、線、面)の格納が可能でFMEがサポートするものであれば何でも構いません。また、属性を定義する外部テーブルのフォーマットも、FMEがサポートするものであれば任意です。

AreaBuilder は、端点で接するラインで囲まれた領域を表すポリゴンジオメトリを作成します。デフォルトでは、「接する」ためには座標が倍精度浮動小数点数の精度で完全一致している必要がありますが、マニュアルの工程で隣接する境界線の端点を一致させるのも面倒です。

そこで、前出図のように端点となるべき地点でラインが交差するようにしておけば、Intersector によってラインを交点で分割し、その結果として、隣接する境界線が端点で「接する」(完全一致する)ようにできます。

AreaBuilder は、一方または両方の端点が他の端点と接していないラインを無視するので、交点から飛び出す部分の長さや形状は任意です。ただし、無視されるべき区間で他のラインとの交差、あるい自己交差がないように注意する必要はあります。

代表点には地物のID(例えば連番)のみを属性として与えておけば、Excelなどの外部テーブルで作成した他の属性を結合することは簡単です。IDの割り当て方さえ仕様化しておけば、ジオメトリデータ作成と属性データ作成を分業化することもできます。

FMEの利用に限らず、さまざまな工夫をすることによって精度の高いポリゴンデータの作成を実現している企業もあるかと思いますが、ウェブ上で公開されているデータには隣接する領域間で隙間や重複がある例が多く見られ、業界全体としては改善の余地がまだまだあると感じています。FMEの利用方法としては初歩的な例ですが、効果は大きいと思います。