トップOpenStreetMap > OSM陸地ポリゴンをOSMデータから構築する

OSM陸地ポリゴンをOSMデータから構築する

海岸線データ

OSMデータに海岸線データ(natural=coastline)は含まれるが、適当なノード数の折れ線データが分散して存在する だけである[1]。中には、place=island relation としてポリゴンを形成するものもあるが、そうでないケースもある。

陸地ポリゴンあるいは水域ポリゴンとしてシェイプファイルが提供されているが[2]、テキストファイル形式にするには、例えば、PostgreSQL/PostGISデータベースにインポートして、それをテキスト形式でエクスポートするといった手間 がかかる。

そこで、OSMデータ(xml形式)の 海岸線wayデータをつなぎ合わせて、構築することを試みる。

対象は日本地図とする。その場合には対象となるデータ量は少ないため、 シンプルな構造で、海岸線 wayデータをメモリ上に置くことができるであろう。2パス方式として、 第二パスで、折れ線の頂点(node)の座標をセットしてゆく。

海岸線wayデータの連結

海岸線wayデータは先頭node の id をキー、wayデータを値とする HashMap で管理する。新しい海岸線 way データについては、HashMapのエントリーの前後につながるものがないかを調べる。つながるものがあれば、繋いだ上で、 エントリーを更新する。前と後ろにつながるものがあれば、エントリーは一つ減少する。また、way が閉ループになれば、それは陸地ポリゴンリストに移す。

最終的に閉ループにならないものがあれば、OSMデータそのものにエラーがあることになり、そのときは、 陸地ポリゴンの更新をやめ、以前のデータを使う。自分で誤りを正せる場合にはOSMデータを修正し、そうでないときは誰かかが修正してくれるのを待つ。

大きなポリゴンの分割

北海道、本州、四国、九州といった大きなポリゴンは複数に分割する。どのように分割するかは、予め、手作業で決めておく。分割の際には分割線と海岸線が交差してはならないため、チェックして交差が見つかったときは、 エラー出力して、その分割はやめる。プログラムで、交差の起きない分割線を探すのは時間がかかると思われるため、 手動で、分割線の候補を決めておく。 決めていたノードが無くなったり、海岸線が大幅に変更されたときは、分割線候補を見直す。

低ズーム用データ

例えば描画の精度を画素とした場合、高ズームでは10画素、20画素離れたnodeが低ズームでは同じ位置になる。 当然、このような node は間引いてよい。

もっと積極的に間引こうとしたときは、間引きにより、自己交差が生まれることがあることに注意を要する。 自己交差が生まれないようにチェックしながら間引くか、自己交差が生まれた場合、小さな自己交差の部分を切り取る。

また、ポリゴンの塗りつぶしプログラムによっては小さな自己交差があっても問題がないケースもある。 しかし、完璧とは言えないので、間引きでは自己交差を避けた方が無難である。

A.リファレンス

[1] OpenStreetMapのデータ構造
[2] Data Derived from OpenStreetMap for Download