本トピックでは、パスモデルの目的、基本コンポーネント、およびクイックスタートについて説明します。
モデルの目的
概要
パスモデルは、点と辺で構成されるグラフ構造です。道路ネットワークに基づく経路計画、電子地図の GPS ナビゲーション、ルーティングなどの問題を解決するために使用されます。パスモデルは PGRouting インターフェイスと完全に互換性があり、既存アプリケーションのスムーズな移行をサポートします。パスデータは、エッジとノードからなる幾何ネットワークグラフを形成し、主に道路ネットワークと交通ネットワークの構築に使用されます。
GanosBase ネットワーキングは、PolarDB for PostgreSQL 用の時空間エンジン拡張機能であり、コストモデルに基づいて最速、最短、または最適なパスを検索するための関数とストアドプロシージャを提供します。また、地理空間ルーティング機能を提供し、さまざまな経路およびネットワーク分析アルゴリズムをサポートすることで、データベースに経路およびネットワーク分析機能を追加します。
機能の概要
GanosBase ネットワーキングは、一連の経路計画およびネットワーク分析機能を提供します:
Johnson のアルゴリズム。
Floyd-Warshall アルゴリズム。
A* および双方向 A* 最短経路アルゴリズム。
Dijkstra および双方向 Dijkstra 最短経路アルゴリズム。
巡回セールスマンアルゴリズム。
Prim のアルゴリズム。
Kruskal のアルゴリズム。
K-最短経路アルゴリズム。
フロー分析。
グラフトポロジー操作。
グラフコンポーネント操作。
グラフ縮約。
ターン制限付き最短経路 (TRSP) アルゴリズム。
一部の機能は、コストまたはコストマトリックスを使用した計算もサポートします。
主要なビジネスシナリオ
GanosBase ネットワーキングは、幅広いシナリオで利用できます:
最適経路計画
物流、宅配便、タクシーサービスなどの業界では、GanosBase ネットワーキングを使用して 2 点間の最短または最速のパスを計算し、ルート計画と最適化を行うことができます。インターネットノード間の接続など、非地理的なパスの場合、GanosBase ネットワーキングは最適なネットワークトポロジを見つけるのにも役立ちます。
地理空間分析
GanosBase ネットワーキングを使用すると、最近傍探索やサービスエリア分析など、道路ネットワークに基づいた分析を実行できます。この分析は、地理空間データの分布と関係を理解し、意思決定と計画を改善するのに役立ちます。
交通流管理
GanosBase ネットワーキングを交通流データと組み合わせることで、交通量を分析し、渋滞を予測し、最適化の提案を取得できます。これは、都市交通管理や高度道路交通システムなどのアプリケーションで役立ちます。
基本コンポーネント
グラフの概念
グラフは、数式 G = (V, E) で表される順序対です。ここで:
Vはグラフ内の頂点の集合を表します。Vの要素は、頂点またはノードと呼ばれます。E ⊆ {( u, v ) | u , v ∈ V }。
グラフには、無向グラフ、単純無向グラフ、有向グラフ、単純有向グラフなど、複数の種類があります。
GanosBase では、グラフを表現する方法が 2 つあります:
コストグラフ。
順方向および逆方向コストグラフ。
計算を実行する際に、いずれのグラフタイプも有向または無向として指定できます。
コストグラフ
コストグラフは、データベース内で次の構造になっています:
列 | 説明 |
id | エッジの一意の識別子。 |
source | エッジの始点。 |
target | エッジの終点。 |
cost | 始点から終点へのエッジの重み (コスト)。 |
順方向および逆方向コストグラフ
順方向および逆方向コストグラフは、データベース内で次の構造になっています:
列名 | 説明 |
id | エッジの一意の識別子。 |
source | エッジの始点。 |
target | エッジの終点。 |
cost | 始点から終点へのエッジの重み (コスト)。 |
reverse_cost | 終点から始点へのエッジの重み (コスト)。 |
関数本体の構造
GanosBase ネットワーキングは pgRouting 標準と互換性があります。関数の一般的な構造は次のとおりです:
pgr_<name>(Inner_queries, Parameters, [ Optional_parameters ])各項目の内容は次のとおりです:
Inner_queries :内部クエリ。このパラメーターは、関数が必要とするデータを構築するための SQL 文字列です。
Parameters :関数が必要とする必須パラメーターです。
Optional_parameters :オプションパラメーター。これらのパラメーターにはデフォルト値があり、省略できます。
関数には複数のオーバーロードを定義できます。一般的なオーバーロードは次のとおりです:
1 対 1:1 つの始点から 1 つの終点にナビゲートします。
1 対多:1 つの始点から複数の終点にナビゲートします。
多対 1:複数の始点から 1 つの終点にナビゲートします。
多対多:複数の始点から複数の終点にナビゲートします。
組み合わせ:複数の異なる始点から複数の異なる終点にナビゲートします。各タプルは、始点と終点のペアを指定します。
内部クエリのデータ構造
グラフ構造を関数モデルに渡すには、内部クエリを構築する必要があります。これらのクエリは、リクエストタイプによって次のように分類されます:
エッジ SQL。
一般的なエッジクエリ:ダイクストラ法および双方向ダイクストラ法の最短経路アルゴリズムに適用します。
ID なしの一般的なエッジクエリ:全ペアアルゴリズムに適用します。
X/Y 値を持つ一般的なエッジクエリ:A* および双方向 A* 最短経路アルゴリズムに適用します。
組み合わせ SQL。
制限 SQL。
ポイント SQL。
一般的なエッジクエリ
列 | 型 | デフォルト | 説明 |
id | integer | なし | エッジの一意の識別子です。 |
source | integer | なし | エッジの始点です。 |
target | integer | なし | エッジの終点です。 |
cost | numeric | なし | エッジのコストです。 |
reverse_cost | numeric | -1 | 終点から始点へのエッジのコストです。 値が負の場合、エッジ \( (target → source) \) はグラフに存在しません。 |
ID なしのエッジクエリ
列 | 型 | デフォルト | 説明 |
source | integer | なし | エッジの始点です。 |
target | integer | なし | エッジの終点です。 |
cost | numeric | なし | エッジのコストです。 |
reverse_cost | numeric | -1 | 終点から始点へのエッジのコストです。 値が負の場合、エッジ \( (target → source) \) はグラフに存在しません。 |
X/Y 値を持つエッジクエリ
列 | 型 | デフォルト | 説明 |
source | integer | なし | エッジの始点です。 |
target | integer | なし | エッジの終点です。 |
cost | numeric | なし | エッジのコストです。 値が負の場合、エッジ \( (source → target) \) はグラフに存在しません。 |
reverse_cost | numeric | -1 | 終点から始点へのエッジのコストです。 値が負の場合、エッジ \( (target → source) \) はグラフに存在しません。 |
x1 | numeric | なし | エッジの始点の X 座標です。 |
y1 | numeric | なし | エッジの始点の Y 座標です。 |
x2 | numeric | なし | エッジの終点の X 座標です。 |
y2 | numeric | なし | エッジの終点の Y 座標です。 |
制限クエリ
列 | 型 | デフォルト | 説明 |
path | integer 配列 | なし | すべての通行不能なエッジの ID のシーケンスです。 |
cost | numeric | なし | 通行不能なエッジをトラバースするためのコストです。 |
ポイントクエリ
列 | 型 | デフォルト | 説明 |
pid | integer | 自動値 | ポイントの一意の識別子です。 |
edge_id | integer | なし | ポイントに最も近いエッジの一意の識別子です。 |
fraction | numeric | なし | エッジ上のポイントの相対位置です。値は 0~1 の範囲である必要があります。 |
side | char | b | 現在のポイントの位置です。値は、次のいずれかである必要があります: |
結果列のデータ構造
戻り値の列は、関数によって異なります。
単一パスの結果
カラム | タイプ | 説明 |
seq | 整数 | 1 から始まるシーケンシャルな値。 |
path_seq | 整数 | パス全体における相対位置。これは 1 から始まるシーケンシャルな値です。 |
[start_vid] | big integer | 開始頂点の一意の識別子。クエリに複数の開始頂点がある場合にのみ、このカラムが返されます。 |
[end_vid] | big integer | 終了頂点の一意の識別子。クエリに複数の終了頂点がある場合にのみ、このカラムが返されます。 |
node | big integer |
|
edge | big integer | パスシーケンス上の現在のノードから次のノードへのエッジの識別子。値が -1 の場合、パスの最後のノードを示します。 |
cost | 浮動小数点 | パスシーケンス上の現在のノードから次のノードへのコスト。 |
agg_cost | 浮動小数点 |
|
pgr_withPoints 関数に適用可能です:
列 | 型 | 説明 |
seq | integer | 1 から始まるシーケンシャルな値です。 |
path_seq | integer | パス全体における相対位置です。これは 1 から始まるシーケンシャルな値です。 |
[start_vid] | big integer | 開始頂点またはポイントの一意の識別子です。この列は、クエリに複数の開始頂点がある場合にのみ返されます。
|
[end_vid] | big integer | 終了頂点またはポイントの一意の識別子です。この列は、クエリに複数の開始頂点が含まれている場合にのみ返されます。
|
node | big integer |
|
edge | big integer | パスシーケンス内の現在のノードから次のノードへのエッジの識別子です。値が -1 の場合は、パスの最後のノードを示します。 |
cost | float | パスシーケンス内の現在のノードから次のノードまでのコストです。 |
agg_cost | float |
|
pgr_dijkstraNear 関数に適用:
列 | 型 | 説明 |
seq | 整数 | 1 から始まるシーケンス値。 |
path_seq | 整数 | パス全体における相対的な位置。1 から始まるシーケンス値。 |
start_vid | ビッグインテジャー | 現在のパスの開始頂点の一意の識別子。 |
end_vid | ビッグインテジャー | 現在のパスの終了頂点の一意の識別子。 |
node | ビッグインテジャー | start_vid から end_vid までのパス内のノードの識別子。 |
edge | ビッグインテジャー | パスシーケンス内の現在のノードから次のノードへのエッジの識別子。この値が -1 の場合、現在の node がパスの最終ノードであることを示します。 |
cost | 浮動小数点数 | パスシーケンス内の現在のノードから次のノードまでのコスト。 |
agg_cost | 浮動小数点数 | start_vid から node までの合計コスト。 |
複数のパスの結果
複数のパスに対して選択的な関数に適用されます。
カラム | タイプ | 説明 |
seq | 整数 | 1 から始まる連番です。 |
path_id | 整数 | パスの一意の識別子です。 "start_vid" から "end_vid" への最初のパスの ID は 1 です。 |
path_seq | 整数 | パス全体における相対位置です。これは 1 から始まる連番です。 |
[start_vid] | ビッグインテジャー | 開始頂点の一意の識別子です。このカラムは、クエリに複数の開始頂点がある場合にのみ返されます。 |
[end_vid] | ビッグインテジャー | 終了頂点の一意の識別子です。このカラムは、クエリに複数の終了頂点がある場合にのみ返されます。 |
node | ビッグインテジャー | "start_vid" から "end_vid" へのパス内のノードの識別子です。 |
edge | ビッグインテジャー | パスシーケンスにおける現在のノードから次のノードへのエッジの識別子です。値が -1 の場合、パスの最後のノードを示します。 |
cost | フロート | パスシーケンスにおける現在のノードから次のノードへのコストです。 |
agg_cost | フロート | "start_vid" から "node" までの累計コストです。 |
複数のパスに対して選択的ではない関数に適用されます:
カラム | タイプ | 説明 |
seq | integer | 1 から始まるシーケンシャルな値です。 |
path_id | integer | パスの一意の識別子です。 "start_vid" から "end_vid" への最初のパスの ID は 1 です。 |
path_seq | integer | パス全体における相対位置です。1 から始まるシーケンシャルな値です。 |
start_vid | big integer | 開始頂点の一意の識別子です。 |
end_vid | big integer | 終了頂点の一意の識別子です。 |
node | big integer | "start_vid" から "end_vid" へのパス内のノードの識別子です。 |
edge | big integer | パスシーケンス内の現在のノードから次のノードへのエッジの識別子です。値が -1 の場合、パスの最後のノードを示します。 |
cost | float | パスシーケンス内の現在のノードから次のノードへのコストです。 |
agg_cost | float | "start_vid" から "node" までの合計コストです。 |
コスト関数群の結果
コストまたはコストマトリックスを用いる関数に適用されます:
列名 | タイプ | 説明 |
start_vid | ビッグインテジャー | 開始頂点の一意の識別子です。 |
end_vid | ビッグインテジャー | 終了頂点の一意の識別子です。 |
agg_cost | フロート |
|
クイックスタート
はじめに
このクイックスタートガイドでは、GanosBase ネットワークエンジンの基本的な使用方法として、エクステンションの作成、テーブルの作成、データの挿入、プロパティの更新、トポロジの作成、パスのクエリなどを説明します。
構文の説明
拡張を作成します。
CREATE Extension Ganos_Networking cascade;説明権限の問題を回避するために、拡張を public スキーマにインストールしてください。
CREATE extension Ganos_Networking WITH schema public cascade;テーブルを作成します。
CREATE TABLE edge_table ( id BIGSERIAL, dir character varying, source BIGINT, target BIGINT, cost FLOAT, reverse_cost FLOAT, capacity BIGINT, reverse_capacity BIGINT, category_id INTEGER, reverse_category_id INTEGER, x1 FLOAT, y1 FLOAT, x2 FLOAT, y2 FLOAT, the_geom geometry );レコードを挿入します。
INSERT INTO edge_table ( category_id, reverse_category_id, cost, reverse_cost, capacity, reverse_capacity, x1, y1, x2, y2) VALUES (3, 1, 1, 1, 80, 130, 2, 0, 2, 1), (3, 2, -1, 1, -1, 100, 2, 1, 3, 1), (2, 1, -1, 1, -1, 130, 3, 1, 4, 1), (2, 4, 1, 1, 100, 50, 2, 1, 2, 2), (1, 4, 1, -1, 130, -1, 3, 1, 3, 2), (4, 2, 1, 1, 50, 100, 0, 2, 1, 2), (4, 1, 1, 1, 50, 130, 1, 2, 2, 2), (2, 1, 1, 1, 100, 130, 2, 2, 3, 2), (1, 3, 1, 1, 130, 80, 3, 2, 4, 2), (1, 4, 1, 1, 130, 50, 2, 2, 2, 3), (1, 2, 1, -1, 130, -1, 3, 2, 3, 3), (2, 3, 1, -1, 100, -1, 2, 3, 3, 3), (2, 4, 1, -1, 100, -1, 3, 3, 4, 3), (3, 1, 1, 1, 80, 130, 2, 3, 2, 4), (3, 4, 1, 1, 80, 50, 4, 2, 4, 3), (3, 3, 1, 1, 80, 80, 4, 1, 4, 2), (1, 2, 1, 1, 130, 100, 0.5, 3.5, 1.999999999999,3.5), (4, 1, 1, 1, 50, 130, 3.5, 2.3, 3.5,4);テーブルのプロパティを更新します。
UPDATE edge_table SET the_geom = st_makeline(st_point(x1, y1), st_point(x2, y2)), dir = CASE WHEN (cost > 0 AND reverse_cost > 0) THEN 'B' -- 両方向 WHEN (cost > 0 AND reverse_cost < 0) THEN 'FT' -- LINESTRING の方向に WHEN (cost < 0 AND reverse_cost > 0) THEN 'TF' -- LINESTRING の逆方向に ELSE '' END;トポロジーを作成します。
SELECT pgr_createTopology('edge_table', 0.001);最短経路をクエリします。
-- ダイクストラ最短経路 SELECT * FROM pgr_dijkstra( 'SELECT id, source, target, cost, reverse_cost FROM edge_table', 2, 3 ); seq | path_seq | node | edge | cost | agg_cost -----+----------+------+------+------+---------- 1 | 1 | 2 | 4 | 1 | 0 2 | 2 | 5 | 8 | 1 | 1 3 | 3 | 6 | 9 | 1 | 2 4 | 4 | 9 | 16 | 1 | 3 5 | 5 | 4 | 3 | 1 | 4 6 | 6 | 3 | -1 | 0 | 5 (6 rows) -- A* パスアルゴリズ SELECT * FROM pgr_astar( 'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2 FROM edge_table', 2, 12, directed := false, heuristic := 2); seq | path_seq | node | edge | cost | agg_cost -----+----------+------+------+------+---------- 1 | 1 | 2 | 2 | 1 | 0 2 | 2 | 3 | 3 | 1 | 1 3 | 3 | 4 | 16 | 1 | 2 4 | 4 | 9 | 15 | 1 | 3 5 | 5 | 12 | -1 | 0 | 4 (5 rows) -- 制限テーブルを作成し、データを挿入します。 CREATE TABLE restrictions ( to_cost FLOAT, target_id BIGINT, from_edge TEXT, via_path TEXT ); INSERT INTO restrictions VALUES (100, 4, '8', '5,8'); -- TRSP パスアルゴリズム SELECT * FROM pgr_trsp( 'SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost FROM edge_table', 2, 7, false, false, 'SELECT to_cost, target_id::int4, from_edge || coalesce('','' || via_path, '''') AS via_path FROM restrictions' ); seq | id1 | id2 | cost -----+-----+-----+------ 0 | 2 | 4 | 1 1 | 5 | 10 | 1 2 | 10 | 12 | 1 3 | 11 | 11 | 1 4 | 6 | 8 | 1 5 | 5 | 7 | 1 6 | 8 | 6 | 1 7 | 7 | -1 | 0 (8 rows)拡張を削除します (オプション)。
DROP Extension Ganos_Networking cascade;
SQL リファレンス
詳細な SQL マニュアルについては、pgRouting の公式ドキュメントをご参照ください。