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
演算子を調整してください。 - 出力をさらに簡潔にしたい場合や、追加情報が必要な場合はお知らせください。適切に対応します。