Google Earth(TM) 地図サービスのオススメスポット・Wiki更新状況・おもしろい情報の紹介などを書き綴っていきます。

金曜日, 12月 05, 2008

pgRouting+OpenStreetMapを試す - SQL編

 データの作成は前回までで終了しました。ここからはデータベースを実際に触ってみたいと思います。  パシフィコ横浜(35.459787,139.635447)から中途半端ではありますが、一方通行の通り(35.450191,139.638392)までのルートを検索するというのを課題にします。  今回は、端末からpsqlを触ります。
psql -U postgres osm
 レジュメ通りですので、osmに接続します。  ところで、レジュメに記載されているルート検索アルゴリズムは3通りあり、いずれも道のidを渡すようになっています。例えばShooting-Star algorithmのshortest_path_shooting_star関数はsource_idとtarget_idを必要としています。  グーグルアース等で利用するには緯度・経度から検索したいところです。他によい方法があるかもわかりませんが、とりあえず、PostGISの機能を利用して、検索開始場所の緯度・経度から最も近い道を探し、なおかつ、その道の中でも検索開始場所に最も近い部分を検索することにします。
SELECT gid FROM ways ORDER BY Distance(the_geom,GeomFromText('POINT(139.635447 35.459787)',4326));
 上記SQL文は、端的に述べれば「POINT(139.635447 35.459787)から近い順に、gidを選ぶ」ということになるでしょうか。  ちなみに、4326は世界測地系を指定しています。(参考:Bubble://ちずろぐ/別館/SRID)  結果は次の画像のようになりました。 pgRoutingの復習1  gid=26の道がスタート地点から一番近い道のようです。  次は、gid=26上の点で、スタート地点から一番近い点を求めたいところです。まずはgid=26の道の座標を確認してみます。
SELECT asEWKT(the_geom) FROM ways WHERE gid = 26;
 結果は次のようになりました。(一部抜粋)
SRID=4326;MULTILINESTRING((139.6337473 35.460318,139.633824 35.4602207,139.6339788 35.4600243,139.6342115 35.4597289,139.6345221 35.4593345,139.6348368 35.458935,139.6352296 35.4584362,139.635288 35.4583743))
 このgid=26の道の始点を0、終点を1として、スタート地点から(gid=26の道上で)一番近い点がどこにあるのかを探ります。
SELECT line_locate_point(GeometryN(MLineFromText('SRID=4326;MULTILINESTRING((139.6337473 35.460318,139.633824 35.4602207,139.6339788 35.4600243,139.6342115 35.4597289,139.6345221 35.4593345,139.6348368 35.458935,139.6352296 35.4584362,139.635288 35.4583743))'),1),PointFromText('Point(139.635447 35.459787)',4326));
 すると、次のような結果が返ってきました。(一部抜粋)
line_locate_point ------------------- 0.592158169301421 (1 row)
 つまり、gid=26の道の始点から0.592158169301421の点が、スタート地点から一番近いということになります。  続く… (参照サイト) PostGIS リファレンス PostGISの関数

0 コメント: