2015-12-09

OpenStreetMap データに基づく道路網データの作成

OpenStreetMap (OSM) のデータ (XML形式) は、OSM サイトの「エクスポート」機能や「OpenStreetMap データのダウンロードと抽出」でも使用した HTTP API によってダウンロードすることができます。
OSM データの XML スキーマはシンプルで、基本的な要素は node, way, relation の3種類だけであり、地物の種類や属性は、それらの要素の下位の tag 要素 (k 属性: 属性名, v 属性: 属性値) によって記述されています。
node: 点の座標 (lat, lon 属性)
way: 線を構成する複数の node (頂点) の参照
relation: ポリゴンその他の形状を構成する node (点) または way (線) の参照

FME の OpenStreetMap (OSM) XML [OSM] リーダー (Use Basic Element Feature Types Only モード) では、これらの基本的な要素をフィーチャータイプとして、ジオメトリとそれに付随する属性を読み込むことができます。
ここでは、[OSM] リーダーによって OSM データ (node, way フィーチャー) を読み込み、道路に該当する way フィーチャー、及び、それらの道路で構成されるネットワーク (道路網) のノードに該当する node フィーチャーを抽出し、道路網 (ネットワーク) データに変換するワークスペース例を掲げます。
FME 2015.1.3.1 build 15573

FMEワークスペース例
























複数の道路が接続している地点 (交差点、合流・分岐点、属性が異なる道路間の接合点。以下「接続点」と言います) について、OSM のデータにおけるそれらの道路を表す各 way フィーチャーはその地点に一致する頂点を持っており、それらの頂点は同一の node フィーチャーを参照しています。しかし、接続地点の頂点は必ずしもそれらの way フィーチャー (ライン) の端点であるとは限らず、中間の頂点である場合もあります。
このワークスペース例は、複数の道路の接続点に該当する node フィーチャーを抽出し、それらの地点 (頂点) で way フィーチャーを分割することにより、ネットワークのノードが必ず道路ラインの端点であるような道路網データに変換します。接続点 node による way フィーチャーの分割には PointOnLineOvelayer を使用しました。


結果: 茨城県つくば市付近 (道路ラインのみ)
OSM サイトの「エクスポート」機能によってダウンロードしたデータに基づき、highway 属性の値が motorway, trunk, primary, secondary, tertiary, unclassified  (接続道路: *_link を含む) である way フィーチャーを抽出して作成。
赤: motorway, motorway_link; 青: trunk, trunk_link; 緑: primary, primary_link;
オレンジ: secondary, secondary_link; 紫: tertiary, tertiary_link; グレー: unclassified

























つくばジャンクション (常磐自動車道 - 首都圏中央連絡自動車道) 付近
ノード (グレー): 複数の道路の接続点 (交差点, 合流・分岐点, 属性が異なる道路間の接合点)
ノード (赤): 接続点以外の道路の端点
















1. 道路に該当する way フィーチャーの抽出

[OSM] リーダー (Use Basic Element Feature Types Only モード) によって読み込まれる way フィーチャーのうち、道路に該当するフィーチャーは highway 属性を持っています(ただし、属性名は Workbench 画面上には公開されません)。この highway 属性には道路の種類を表す文字列が格納されているので、その値によって道路網データの作成対象とする way フィーチャーを選択することができます。
ワークスペース例では、まず、AttributeExposer によって highway 属性をインターフェース上に現してから、Tester によって道路網データ作成の対象とする道路に該当する way フィーチャーを抽出しています。
OSM データにおける highway その他の道路関係の属性については次のページを参照してください。

2. 道路網のノードに該当する node フィーチャーの抽出

(1) 複数の道路の接続点 node 抽出

[OSM] リーダーによって読み込まれる way フィーチャーは、各頂点に該当する node フィーチャーの id 属性を nd{}.ref というリスト属性によって保持しています。ここで、way フィーチャーを nd{} リストについて展開すると頂点数分のフィーチャーが作成され、それらは各頂点の参照先の node フィーチャーの id を格納した ref 属性を持つことになります (参照: 文字列の分割とリスト属性の展開)。したがって、そのうち2回以上出現する id (ref 属性の値) と一致する id を持つ node フィーチャーが、複数の道路の接続点であると判断できます。

ListExploder -> DuplicateRemover [Duplicate] -> FeatureMerger がその処理を行っており、接続点に該当する node フィーチャーは FeatureMerger の Merged ポートから出力されます。

(2) 接続点以外の道路端点 node 抽出

行き止まりである場合やダウンロードしたデータの範囲の最も外側に位置している場合、その道路の端点は他の道路と接続していませんが、道路網のデータとしては、それらの端点に該当する node フィーチャーも道路網のノードとして抽出する必要があります。各 way フィーチャーの両端点に該当する node の id は、nd{}.ref リストの先頭と末尾の要素に格納されているので、前述の接続点 node には該当しなかった node フィーチャー (FeatureMerger の NotMerged ポートから出力される) のうち、その id が nd{}.ref の先頭または末尾の要素と一致するものが、そのような道路端点の node であると判断できます。

ListIndexer x 2 (先頭と末尾の nd{}.ref 要素抽出) -> FeatureMerger_2 がその処理を行っており、接続点以外の道路端点に該当する node フィーチャーは FeatureMerger_2 の Merged ポートから出力されます。
なお、DuplicateRemover_2 は必須ではありませんが、ref 属性の値が重複するフィーチャーを除外することで FeatureMerger_2 の効率が多少は良くなることが期待できることから設けました。

3. 接続点 node による way フィーチャーの分割

PointOnLineOverlayer の Point ポートに接続点 node フィーチャー、Line ポートに way フィーチャーを入力することにより、接続点に一致する頂点で way フィーチャーが分割されます。これにより、ネットワークデータ (グラフ構造) として利用可能な道路網を構成することができます。
立体交差など、平面上では交差しているように見えるが、その交点で接続していない複数の way フィーチャーは交点と一致する頂点 (node) を共有しないので、そこにネットワークのノードが生じることはありません。

Tips
(1) TopologyBuilder 及びいくつかのトランスフォーマーを追加することにより、道路ラインに両端点のノード ID を属性として与えることができます。
(2) 変換後の道路網データは、ShortestPathFinder による最短経路探索用のデータとして使うことができます。道路に該当する way フィーチャーは highway 属性 (道路の種別) の他に、lanes (車線数), oneway (一方通行フラグ) などの属性も持っているので、距離だけでなく、それらの属性も加味して定義した重み (コスト) による最短経路探索も可能です。

2015-12-05

OpenStreetMap データのダウンロードと抽出

任意のバウンディングボックスをカバーする範囲の OpenStreetMap (OSM) のデータは、簡単な HTTP API によってダウンロードすることができます。また、FME は OSM のデータフォーマットをサポートしているので、ダウンロードしたデータを読み込み、加工したり他のフォーマットで保存したりすることも可能です。
ここでは、特定の市町村をカバーする2次メッシュ区画の単位で OSM データをダウンロードし、そのデータから node, highway フィーチャーを抽出してメッシュ区画単位でグループ化されたデータセットに整えるところまでを自動化するワークスペース例を掲げます。
FME 2015.1.3.1 build 15573

=====
1. 全国の市区町村ポリゴンデータ(フォーマットは任意)から特定の市区町村のポリゴンを選択し、その領域をカバーする2次メッシュ区画の単位で OSM データをダウンロードする。
2. ダウンロードしたデータから node, highway フィーチャーを読み込み、メッシュ区画でクリップする。
=====

FMEワークスペース例
















(全国の市区町村ポリゴンデータの読込部分は省略)
Tester: 特定の市区町村のポリゴンを抽出
JpStdGridAccumulator (FME Store): 市区町村の領域をカバーする2次メッシュ区画 (矩形ポリゴン) を作成
BoundsExtractor: メッシュ区画の東西南北端の座標値を抽出
AttributeCreator: メッシュごとのデータダウンロード用の URL (HTTP API) と保存先ファイルパスを作成
HTTPCaller: OSM データ (XML) をダウンロードしてディスクに保存
(データのダウンロードはここまで)

FeatureReader: 保存した OSM データから node, highway フィーチャーを読み込む
Clipper: メッシュ区画ごとにフィーチャーをクリップ
FeatureTypeFilter: node フィーチャーと highway フィーチャーに振り分ける

結果: 千葉県柏市の領域をカバーする2次メッシュ区画でクリップした OSM highway ラインフィーチャー
背景オレンジ色のポリゴンは柏市の領域, 赤色のラインは2次メッシュ区画境界
左: 全域 (2次メッシュ5区画), 右: 一部拡大





















OSM データダウンロード用の URL については、次のページに記載されている XAPI を使用しました。
JA:データのダウンロード (原文: Downloading data)

引用:
==========
The API is limited to bounding boxes of about 0.5 degree by 0.5 degree and you should avoid using it if possible. For larger areas you might try to use XAPI, for example:
http://overpass.osm.rambler.ru/cgi/xapi_meta?*[bbox=11.5,48.1,11.6,48.2]
==========

OSM に限らず、ウェブ上で公開されているデータは、URL や API (および、認証を要するサイトの場合は認証に必要なパラメーター) を知っていれば HTTPCaller や FTPCaller によってダウンロードを自動化することができます。
正しい URL 等を指定した場合でも、サーバー、ネットワーク、あるいは通信回線の都合によってダウンロードに失敗することがありますが、その場合でもワークスペースの実行は停止することはなく、<Rejected> ポートからエラーの内容等を格納した属性を持ったフィーチャーが出力されるので、失敗の理由等を確認することができます。

上記ワークスペース例で抽出した全てのフィーチャーは2次メッシュコードを属性として持つので、2次メッシュ区画単位で任意のフォーマットの GIS データとして保存することができます。

=====
AttributeCreator で URL を作成する部分と HTTPCaller は、OSMDownloader (FME Store トランスフォーマー) で置き換えることができます。

サーバーに連続してリクエストを発行する場合、前回のリクエストによるダウンロード完了と次のリクエスト発行の間にわずかな間をおかないと失敗する可能性が高くなります。その場合には、HTTPCaller (またはOSMDownloader) の前に Decelerator を挿入し、各リクエストの発行を若干遅らせることを検討してください。

2015-12-01

ラスターデータセットの再編成 - 高解像度土地利用土地被覆図

広い地域をカバーする地理データセットは、グリッドで分割した多数のファイルで構成されていることが良くあります。その場合のグリッドとしては、標準地域メッシュ(1次~3次)が使用されるケースが多いと思われますが、その他の基準による場合もあります。JAXA(宇宙航空研究開発機構)が公開している高解像度土地利用土地被覆図データもそのひとつで、1度×1度のグリッドタイルで日本全域を分割したGeotiff形式のラスターデータセット(全122ファイル)によって提供されています。
ここでは、このデータセットを1次メッシュ区画(東西方向1度×南北方向40分)単位のファイルで構成されるデータセットに再編成する例を掲げます。
FME 2015.1.3.1 build 15573

=====
高解像度土地利用土地被覆図ホームページで公開されている「AVNIR-2高解像度土地利用土地被覆図(日本全域, バージョン14.02)」GeoTiff形式データ(1度グリッドタイル単位122ファイル)を、1次メッシュ区画(1度×40分)単位のGeotiff形式ファイルで構成されるデータセットに再編成する。
作成するファイル名は、"LC_****.tif" (****は1次メッシュコード)とする。
=====

FMEワークスペース例

















[GEOTIFF] リーダー: 元のラスターデータセット(全122ファイル)を読み込む。
JpStdGridAccumulator (FME Store): 全てのラスターをカバーする範囲の1次メッシュ区画ポリゴンを作成する。
Clipper: 元のラスターを1次メッシュ区画ポリゴンでクリップする。
Sorter: 1次メッシュコードでソートする。
RasterMosaicker: 1次メッシュコードごとにモザイク(結合)する。
[GEOTIFF] ライター: 指定したフォルダにモザイク後のラスターデータをGeotiff形式で保存する。

結果: 千葉県の領域をカバーする範囲の FME Data Inspector による表示例
左: オリジナル(1度×1度グリッドタイル, 5ファイル), 右: 再編後(1次メッシュ区画=1度×40分, 6ファイル)
個別のラスターデータの境界を白ラインで示しています。



























JpStdGridAccumulator は、入力フィーチャーのジオメトリをカバーする範囲について、パラメーターで指定された種類(この例では1次メッシュ)のメッシュ区画に分割して各区画を表す矩形ポリゴンを作成するとともに、その属性にメッシュコードを与えます。Clipper によってメッシュ区画ポリゴンでラスターをクリップすることにより、メッシュ区画境界でラスターを分割するとともに、それらにメッシュコードを格納した属性を与えることができます。
分割後のラスターについて、RasterMosaicker によってメッシュコードが等しいグループごとにモザイク(結合)すれば、1次メッシュ区画単位のラスターが作成されます。

Sorter は必須ではありませんが、フィーチャーの順番をメッシュコードによってソートしたうえで、RasterMosaicker の Input is Ordered by Group パラメーターを Yes に設定することにより、処理効率が多少は良くなることが期待されます。

FME 2015.1以降では、ライターフィーチャータイプの出力先フィーチャータイプ名フィールドでも文字列連結式が設定できるようになりました。この例では、"LC_" とメッシュコード属性値を連結することにより、出力先ファイル名を "LC_<メッシュコード>.tif" としました。