[OSGeoJapan-discuss] ポリゴン処理の話題
Hiroshi Miura(@osmf)
miurahr @ osmf.jp
2013年 9月 14日 (土) 20:43:34 PDT
OSMFJ 三浦です。
ちょっとした話題を提供すると共に、やりかたが正しいのかどうかの相談を
GISの専門の皆様にさせてほしいです
<経緯>
分散タイルサーバを実現するTileMan(*1)プロジェクトで、
lua-nginx-osm ライブラリ(*2)というのを、コアライブラリとして開発しています。
TileManの機能については、State of the Map 2013(*3)のプレゼンを参照ください。
#関連URLは末尾にあります
この中で、次のような機能を実現しています。
1) ポリゴン指定した地域をデータとして持っている。
2) タイルサーバで、タイル要求されたX/Y/Zoomについて、
そのタイルが、(1)の地域に含まれているかどうかを判定する。
3) 含まれている場合、タイルを生成する。
地域データは、geofabrikのデータ(*4)を意識しています。
DBとして、特定の地域のデータだけPostGISに持っておいて、タイル要求がきたときに、
それがDBに入っていればレンダリング実施、そうでなければ、アップストリームの
tile.openstreetmap.orgへ要求、みたいな処理(*5)を実現しています。
これは、他の製品でもありそうな機能ですよね。
<背景>
さて、上記の処理を行うために、
is_inside_regionという関数(*6)を定義しました。計算速度を上げるために、
簡易なアルゴリズムを採用しました。ポイントは以下です
res = (y1 - y2) * nx + (x2 - x1) * ny + x1 * y2 - x2 * y1
(x1, y1) (x2, y2) は、地域を指定するポリゴンの一辺のベクトル
(nx, ny)は、判定するタイル要求の位置
上記は外積をとっており、全ての辺について判定して、すべて負でなければ、
すべての辺の内側に、判定するタイル要求の位置があることが分かります。
しかし、この判定ロジックには、弱点があり、比較するポリゴンは、かならず
convex polygon (凸多角形)である必要があるのです。
<本題>
そこで、たとえば japan.kml (*7)のような凹凸多角形(concave polygon)を凸多面体に分割することにしました。
単純なケースでは、手作業でも可能ですが、複雑になると、手作業では不可能になります。
このような問題は、計算幾何学で研究されていて、素晴らしいライブラリがすでに提供されています。
そこで、CGALを用いて、ポリゴンを複数の多角形に変換し、LUAのプログラムを生成するようなユーティリティプログラム
(*9)を書くことにしました。(GEOSには、該当機能がないみたいでした)
実際に触ってみたい方は、つぎのようにお願いします
$ git clone https://github.com/miurahr/lua-nginx-osm.git
$ cd lua-nginx-osm
$ apt-get install libcgal-dev cmake make
$ make
これでプログラムが生成されるはずです。実行は、
$ utils/poly2lua/poly2lua -t
ここで(-t)をつけると、テストモードで、内蔵の日本の定義データを元に、複数の多角形(緯度経度)を示すデータを生成します。
また、osm/data/*.kml が元データで、 osm/data/*.luaが生成された複数の凸多角形のデータです。
ライブラリがC++用なので、C++でサンプルプログラムを参考に書いたですが、
出来が悪いかもしれません。
☆
☆ で、ここで質問ですが、どうやったら、この生成されたデータが正しく凸多角形であることがわかるでしょうか?
☆
本件は、ブログにかきました(*11)
------------------
(*1)https://github.com/osmfj/tileman
(*2)https://github.com/miurahr/lua-nginx-osm
(*3) http://miurahr.github.io/2013-0908-tileman.html#/title
(*4)http://download.geofabrik.de/asia/japan.html
(*5)https://github.com/osmfj/tileman/blob/master/doc/typical_configuration.png
(*6)https://github.com/miurahr/lua-nginx-osm/blob/master/osm /tile.lua#L81
(*7)https://github.com/miurahr/lua-nginx-osm/blob/master/osm/data/japan.kml
(*8) http://www.cgal.org/
(*9)https://github.com/miurahr/lua-nginx-osm/blob/master/utils/poly2lua.cpp
(*10)https://github.com/miurahr/lua-nginx-osm/blob/master/utils/kml2poly.py
(*11)http://blogs.da-cha.jp/momokuri.php/title-71
More information about the OSGeoJapan-discuss
mailing list