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)
結果は次の画像のようになりました。
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 コメント:
コメントを投稿