今回はpgroutingの最短経路探索の使い方について説明します。
参考サイト
pgRouting ワークショップマニュアル
テスト環境:
PostgreSQL 9.4
PostGIS 2.2
インストール方法はスタックビルダからです。
PostGIS2.2のインストールで、pgroutingも含まれてインストールされます。
データの準備
経路に使用するデータには4つカラムが必要になります。
1.ユニークキー
2.length(ラインの長さ)
3.source
4.target
3・4はpgroutingがidを入れるものです。sourceは始点id、targetは終点idが挿入されます。
トポロジー作成
pgr_createTopologyでトポロジーを作成させます。
select pgr_createTopology('route', -- 対象のテーブル 1, -- ラインとラインの接続を許容する距離 'geom', -- geometryカラム 'ogc_fid'); -- ユニークキー -- 逆走の場合の距離を追加 今回は長さをそのまま挿入 alter table route drop if exists reverse_cost; ALTER TABLE route ADD COLUMN reverse_cost double precision; UPDATE route SET reverse_cost = length;
最短経路探索を実行
SELECT seq, id1 AS node, -- 始点id id2 AS edge, -- ラインid cost, geom FROM pgr_dijkstra(' SELECT ogc_fid AS id, source::integer, target::integer, length::double precision AS cost FROM route', -- 経路に使うテーブル where文をつかえば、使用経路を絞れる。 30, -- 始点id 38, -- 終点id true, -- 有向グラフかどうか false) a -- 逆向きの場合にreverse_costを使用するかどうか left join -- geometry情報を付与するため route as b on b.ogc_fid = a.id2
ジオメトリの一つにしたい場合は, st_linemerge(geom)かst_union(geom)で
経路の距離合計はsum(cost)でわかります。
これで、始点と終点を指定するば、最短の距離が求められるようになりました。
ラインの単位でしか経路を見つけることができません。
ラインの中心あたりまでの経路・距離を求めたい場合はラインを分割する必要があります。
私は複数のライン上にあるポイント間の距離を求めたくて、pgroutingを使用しました。
ラインをポイントのある部分で分割して、距離を求めました。
もっと簡単な方法があるとは思うのですが、見つけられませんでした。
次回はラインをポイントで分割したクエリを関数にしたものを紹介できればいいなっとおもっています。