2014/01/18
PostGIS
 >  今日のアンカンファレンスのデータ(pgRouting)
今日は、午後 PostgreSQL アンカンファレンス で pgRouting 2.0 について発表した際のデータを置きます。主催者・参加者の皆様にはお世話になりました。内容は、下記題目のほんの入口で、pgRouting 2.0 を地下鉄など公共交通機関の経路探索に使えるか試す出発点でした。アンカンファレンスという気楽に発表できる場があって良かったです。


↓ 発表用に作成した二つのテーブルのダンプファイルで、平文の SQL です。実行環境の詳細は 2013/12/07 のとおりですが、PostgreSQL の配列型と PostGIS のジオメトリ型を使えれば大ていインポートできると思います。

https://kenpg.up.seesaa.net/image/20140118_tbl.zip


↓ テーブルのうち _stn の方、駅データです。経路探索で直接は使いませんが、次のリンクテーブルの元になる、駅に一意の ID を振ったものです。


↓ テーブルのうち _lnk の方、経路探索に使うリンクデータです。基本的にこれだけあれば、今日発表した pgRouting 2.0 の経路探索を試すことができます。


発表で説明したとおり、下記が駅・リンクテーブルの元で、東京メトロのデータはなく2003年時点の営団(帝都高速度交通営団)の駅・路線です。現在に比べ副都心線がありませんが、今回はまず pgRouting 2.0 を試すのが主眼なので良しとしました。

国土数値情報 : 鉄道時系列データ
http://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N05.html


以下、発表で使ったうち二つのクエリと実行結果を記します。最初は市ヶ谷(ID : 40)→ 代々木上原(同 80)をダイクストラ法で、pgRouting の pgr_dijkstra 関数が返すレコード型を単純に列に展開したもの。
SELECT (pgr_dijkstra( -- ダイクストラ法
'
SELECT lid id
, sid[1] source
, sid[array_length(sid, 1)] target
, ST_Length(geom :: geography) AS cost

FROM "201401"."18_pgr_lnk"
' -- 前頁のクエリを文字列で渡す

, 40 -- 駅ID(市ヶ谷)
, 80 -- 駅ID(代々木上原)
, FALSE -- オプション(今日は説明省略)
, FALSE -- 〃
)).* ;


次は押上(ID : 7)→ 代々木上原(同 80)を上と同じダイクストラ法で、pgr_dijkstra 関数の戻り値にリンクテーブルの駅・路線名を結合して結果の経路を明示したもの。
WITH a AS (
SELECT 7 nid1, 80 nid2 -- 押上 -> 代々木上原
), b AS (
SELECT (pgr_dijkstra(text '
SELECT lid id, sid[1] source, sid[array_length(sid, 1)] target
, ST_Length(geom :: geography) AS cost
FROM "201401"."18_pgr_lnk"
' -- ダイクストラ法に渡すクエリ
, nid1, nid2, FALSE, FALSE)).* FROM a
), c AS (
SELECT * FROM "201401"."18_pgr_lnk"
), d AS (
SELECT b.seq, ARRAY[c.sid[1], c.sid[array_length(c.sid, 1)]] sid
, CASE WHEN b.id1 = c.sid[1] THEN
ARRAY[c.sname[1], c.sname[array_length(c.sname, 1)]]
ELSE ARRAY[c.sname[array_length(c.sname, 1)], c.sname[1]] END sname
FROM b
JOIN c ON b.id2 = c.lid
)
SELECT seq, d.sname, array_agg(rname) rname, (array_agg(geom))[1] geom
FROM c
JOIN d ON c.sid @> d.sid
GROUP BY seq, d.sname
ORDER BY seq ;


↓ 発表時の再掲で、リンクテーブルを R で読み込みプロットしたもの。最初が全駅を小さな点で示し、次がノード(起終駅または乗換駅)だけを示しています。

https://kenpg.up.seesaa.net/image/20140118_plr_lnk.pdf



以上、今日の PostgreSQL アンカンファレンス の補足的な内容でした。いずれ別記事で、国土数値情報のデータから駅・リンクテーブルを作る過程、ダイクストラ法以外の経路探索関数の使用、リンクテーブルを上のように可視化する PL/R のコードなどを書きます。

今日の発表でも触れたとおり、pgRouting を含め一般的な経路探索プログラムの対象は道路上の移動です。それを、運行ダイヤや乗換コストがある公共交通機関に適用するには様々な課題がありますが、研究課題の一つとして今後も地道に探究したいと思います。
<< 配列を分割(境界要素を両方に含め…
複数の大小グラフを一頁にレイアウ… >>
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。