vvvvでOpenStreetMapのデータを読み込み表示してみる(その2)

Pocket

この記事はvvvv Advent Calendar3日目の記事です。


前回の続きです。
前回はnode要素しか使用してませんでしたが、今回はway要素とtag要素を使用してみます。
way要素はnode要素を繋いで建物や公園などのエリア、道路などを表現しているらしいです。
tag要素はnodeやwayの情報が入っています。建物の名前とか。
※XMLの詳細はこちら。
wiki.openstreetmap.org JA;OSM_XML

way要素とtag要素の情報を可視化すると、
とても地図らしい感じになりました。

パッチはこの様になりました。

緯度経度を-1~1の座標にマッピングするパッチはよく使うことになりそうだったのでサブパッチにしています。
煩雑なリンクを回避するためにS/Rで元のXMLデータは飛ばしています。

今回のキモとなるノードはKeySortとLineStripです。

vvvvでのプログラミングでよく悩むことなるのが以下の様な処理。
Spread2の値にSpread1の値を割り当てたい。

このパッチの例でいうと以下の処理です。
way要素はnode要素の繋がりを表現しています。


<way id="15772074" version="29" timestamp="2017-02-21T14:01:17Z" changeset="46275900" uid="220682" user="minourii">
<nd ref="158030142"/>
<nd ref="158030154"/>
<nd ref="1676868474"/>
<nd ref="472421284"/>
...
</way>

<nd ref="158030142"/>がnodeのidなのでそのidのノードの座標を持ってきて線でつないでやればwayが可視化できます。

なので、nodeの位置座標が入っているSpredsからnode_idをキーにして座標を取得してやらねばなりません。
KeySortノードはその処理を行っています。
ただ、今回は自分のPCではちょっと重たかったのでS+Hノードなどを使って一回だけ計算するようにしています。
これはパフォーマンス次第なので必須の処理ではないですが。
KeySortノードの詳しい使い方はヘルプパッチに分かり易く書いているのでそちらを参照してください。

※関連するノードとしては
=ノードとSelectノードを組み合わせとか、Siftノードあたりも場合によっては使えるかもしれません。
最終手段は「プラグインを書く」ですが…。

そして、KeySortノードが選別した座標を今度は線で繋いでやらねばならないですが、
全部のSliceを繋いでしまうと余計な線が表示されてしまうので、それぞれのway要素毎にnode情報を一まとめにしながら線を繋ぎます。
(違うway要素のnode情報へは線を繋がない。)
それにはLineStripノードが便利でした。
way要素配下のnd要素を取得するGetElementsノードで一つのway要素がいくつのnd要素を持つのかがbin情報として取得できるので、
それをLineStripノードのBin Sizeピンへ渡してやれば実現できます。

※LineノードでもBinSizeというピンがあったので出来るのかと思いましたがうまくいきませんでした。
(使い方が悪かったのかも…)

続く(かも)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*