hakata_ex_cost_db=# \e
start_seq | end_seq | line_name
-----------+---------+-----------------------------------
1 | 6 | Dummy Railway Line JR鹿児島本線
7 | 7 | Dummy Railway Line JR篠栗線
8 | 10 | Dummy Railway Line 地下鉄航空線
12 | 12 | Dummy Bus Line 天神エリア限定バス
という結果が出てきました。start_seq と end_seq が同じ番号になっているところがありますが、これは、どのように解釈すれば良いでしょうか
SELECT seq, node, edge, cost, agg_cost FROM pgr_dijkstra('SELECT gid as id, source, target,length_m as cost FROM ways',66619, 92554, false);
WITH path AS ( SELECT seq, node, edge, cost, agg_cost FROM pgr_dijkstra( 'SELECT gid as id, source, target, cost, reverse_cost FROM ways', 66619, 92554 ) ), full_path AS ( SELECT path.seq, path.node, path.edge, path.cost, path.agg_cost, ways.length_m AS length_m, ways.name AS line_name FROM path LEFT JOIN ways ON path.edge = ways.gid ) SELECT seq, node, edge, cost, agg_cost, length_m, line_name FROM full_path ORDER BY seq;
----- ダイクストラ66619, 92554 の結果の一覧表示
WITH path AS (
SELECT
seq,
edge,
b.name AS line_name,
b.the_geom
FROM
pgr_dijkstra(
'SELECT gid as id, source, target, cost, reverse_cost FROM ways',
66619, 92554
) a
INNER JOIN
ways b
ON
a.edge = b.gid
ORDER BY seq
)
SELECT
MIN(seq) AS start_seq,
MAX(seq) AS end_seq,
line_name
FROM
path
WHERE
line_name LIKE '%Dummy Railway Line%'
OR line_name LIKE '%Dummy Bus Line%'
GROUP BY
line_name
ORDER BY
start_seq;
以下のSQL文で、"Dummy Rail Line" と "Dummy Bus Line" に該当する start_seq と end_seq を取得できます。
SQL文
WITH path AS (
SELECT
seq,
edge,
b.name AS line_name
FROM
pgr_dijkstra(
'SELECT gid as id, source, target, cost, reverse_cost FROM ways',
66619, 92554
) a
INNER JOIN
ways b
ON
a.edge = b.gid
ORDER BY seq
)
SELECT
MIN(seq) AS start_seq,
MAX(seq) AS end_seq,
CASE
WHEN line_name LIKE '%Dummy Railway Line%' THEN 'Dummy Rail Line'
WHEN line_name LIKE '%Dummy Bus Line%' THEN 'Dummy Bus Line'
END AS line_type
FROM
path
WHERE
line_name LIKE '%Dummy Railway Line%'
OR line_name LIKE '%Dummy Bus Line%'
GROUP BY
CASE
WHEN line_name LIKE '%Dummy Railway Line%' THEN 'Dummy Rail Line'
WHEN line_name LIKE '%Dummy Bus Line%' THEN 'Dummy Bus Line'
END
ORDER BY
start_seq;
SQL文のポイント
WITH句で経路情報を取得:pgr_dijkstraの結果にways.nameを結合して、全経路のエッジ情報を準備します。
CASE文で分類:line_nameに基づき、Dummy Rail LineとDummy Bus Lineの2種類に分類します。- この処理により、元の路線名が詳細でも、2つのカテゴリに整理されます。
MINとMAXで開始と終了を取得:- 経路順序 (
seq) の最小値 (start_seq) と最大値 (end_seq) を取得します。
- 経路順序 (
- グループ化:
CASE文で分類された路線タイプごとにグループ化 (GROUP BY) します。
- ソート順序:
- 結果は
start_seqの順に並びます。
- 結果は
結果例
以下のような結果が得られます:
| start_seq | end_seq | line_type |
|---|---|---|
| 1 | 10 | Dummy Rail Line |
| 12 | 15 | Dummy Bus Line |
注意事項
- 必要に応じて、
WHERE条件やLIKE演算子を調整してください。 - 出力をさらに簡潔にしたい場合や、追加情報が必要な場合はお知らせください。適切に対応します。


