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 (一方通行フラグ) などの属性も持っているので、距離だけでなく、それらの属性も加味して定義した重み (コスト) による最短経路探索も可能です。

0 件のコメント:

コメントを投稿