[PostGIS]pgRoutingの使い方

今回は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)でわかります。

実行結果
ScreenClip

ScreenClip

これで、始点と終点を指定するば、最短の距離が求められるようになりました。
ラインの単位でしか経路を見つけることができません。

ラインの中心あたりまでの経路・距離を求めたい場合はラインを分割する必要があります。

私は複数のライン上にあるポイント間の距離を求めたくて、pgroutingを使用しました。
ラインをポイントのある部分で分割して、距離を求めました。
もっと簡単な方法があるとは思うのですが、見つけられませんでした。

次回はラインをポイントで分割したクエリを関数にしたものを紹介できればいいなっとおもっています。

コメントを残す

メールアドレスが公開されることはありません。