このトピックでは、パスモデルの詳細と使用方法について説明します。
概要
概要
経路モデルは、ノードとエッジによって記述されるグラフ構造であり、道路網上の経路計画、電子地図上のGPSナビゲーションにおける経路探索および計画、ならびにルーティングに使用される。 パスモデルは pgRouting 関数と完全に互換性があり、既存のアプリケーションをスムーズに移行できます。 パスデータは、エッジとノードで構成されるジオメトリックネットワーク図です。 道路網と交通網の構築に使用されます。
GanosBase Networkingは、PostgreSQL (PolarDB for PostgreSQL ) の時空間エンジン拡張です。 GanosBase Networkingは、コストモデルに基づいて最速、最短、または最適なパスを見つけるための一連の関数とストアドプロシージャを提供します。 GanosBase Networkingは地理空間ルーティング機能を提供し、パス分析とネットワーク分析のための複数のアルゴリズムをサポートします。 パス分析とネットワーク分析はデータベースでサポートされています。
機能
GanosBase Networkingは、パス計画とネットワーク分析のための一連の機能を提供します。
ジョンソンのアルゴリズム。
Floyd-Warshallアルゴリズム。
A * または双方向A * 経路発見アルゴリズム。
ダイクストラまたは双方向ダイクストラの経路探索アルゴリズム。
巡回セールスマンアルゴリズム。
プリムのアルゴリズム。
Kruskalのアルゴリズム。
K最短経路アルゴリズム。
フロー分析。
トポロジ操作。
コンポーネント操作。
収縮。
ターン制限最短パスアルゴリズム。
一部の関数では、計算用のコストまたはコスト行列を設定することもできます。
シナリオ
GanosBaseネットワーキングは、次のシナリオで使用できます。
ルート計画
物流、配送サービス、タクシーサービスなどの業界では、GanosBase Networkingを使用して、ルート計画と最適化のために2つのポイント間の最短または最速のパスを計算できます。 インターネットノード間の接続など、地理的でないパスの場合は、GanosBase Networkingを使用してより良いネットワークトポロジを取得できます。
地理空間解析
GanosBase Networkingを使用して、最近傍検索やサービスゾーン分析など、道路ネットワークに基づいた分析を実行できます。 これらの分析タスクにより、地理空間データの分布と関係を理解して、さらなる意思決定と計画を行うことができます。
トラフィックフロー管理
GanosBaseネットワーキングを使用して、交通量データを分析し、混雑を予測し、最適化の推奨事項を提供できます。 これにより、都市交通管理やインテリジェント交通システムなどのアプリケーションを最適化できます。
コンポーネント
グラフ
グラフは、G = (V ,E) の順序対である。
Vは頂点の集合を表す。Vの要素は、頂点またはノードと呼ばれる。E ⊆ {( u, v ) | u, v ∈ V }。
グラフは、無向グラフ、無向単純グラフ、有向グラフ、有向単純グラフなど、様々な種類に分類される。
GanosBaseでは、グラフは次の方法で表示されます。
コスト付きのグラフ。
コストと逆コストのグラフ。
グラフは、有向または無向として指定できます。
グラフとコスト
コストを含むグラフには、データベース内の次の列が含まれます。
列 | 説明 |
id | エッジの一意の識別子。 |
source | エッジの開始ノード。 |
target | エッジの終了ノード。 |
cost | 開始ノードから終了ノードまでのエッジの重みであるエッジのコスト。 |
グラフとコストと逆コスト
コストと逆コストを含むグラフには、データベースに次の列が含まれます。
列 | 説明 |
id | エッジの一意の識別子。 |
source | エッジの開始ノード。 |
target | エッジの終了ノード。 |
cost | 開始ノードから終了ノードまでのエッジの重みであるエッジのコスト。 |
reverse_cost | エッジの逆コスト。これは、終了ノードから開始ノードまでのエッジの重みです。 |
構造の関数ボディ
GanosBase NetworkingはpgRouting機能と互換性があります。 関数本体の次の構造を参照してください。
pgr_<name>(Inner_queries, Parameters, [ Optional_parameters ])次のパラメータに注意してください。
Inner_queries: 内部クエリ。関数に必要なデータを作成するためのSQL文です。
パラメータ: 関数に必要なパラメータ。
Optional_parameters: オプションのパラメーター。 これらのパラメーターは、指定されていない場合はデフォルト値を持ちます。
関数は、異なるオーバーロードを有することができる。 次の最も一般的なオーバーロードを参照してください。
1対1: 1つの開始ノードから1つの終了ノードに移動します。
1対多: 1つの開始ノードから複数の終了ノードに移動します。
多対1: 複数の開始ノードから1つの終了ノードに移動します。
多対多: 複数の開始ノードから複数の終了ノードに移動します。
組み合わせ: 複数の開始ノードから、タプルを使用して指定された複数の終了ノードに移動します。 各タプルは、開始ノードおよび終了ノードを指定する。
内部クエリが依存するデータ構造
関数モデルにグラフ構造を渡すには、内部クエリを作成する必要があります。 内部クエリは、要件タイプによって次のタイプに分類できます。
エッジSQL。
一般エッジSQL: ダイクストラまたは双方向ダイクストラの経路探索アルゴリズムに適用可能。
IDなしの一般エッジSQL: すべてペアアルゴリズムに適用できます。
xおよびy値を有する一般エッジSQL: A * または双方向A * 経路探索アルゴリズムに適用可能。
組み合わせSQL。
制限SQL。
ポイントSQL。
一般エッジSQL
列 | データ型 | デフォルト値 | 説明 |
id | integer | デフォルト値なし | エッジの一意の識別子。 |
source | integer | デフォルト値なし | エッジの開始ノード。 |
target | integer | デフォルト値なし | エッジの終了ノード。 |
cost | numeric | デフォルト値なし | 開始ノードから終了ノードまでのエッジの重みであるエッジのコスト。 |
reverse_cost | numeric | -1 | エッジの逆コスト。これは、終了ノードから開始ノードまでのエッジの重みです。 このパラメーターの値が負の場合、edge \((target \rightarrow source)\) はグラフの一部ではありません。 |
IDなしの一般エッジSQL
列 | データ型 | デフォルト値 | 説明 |
source | integer | デフォルト値なし | エッジの開始ノード。 |
target | integer | デフォルト値なし | エッジの終了ノード。 |
cost | numeric | デフォルト値なし | 開始ノードから終了ノードまでのエッジの重みであるエッジのコスト。 |
reverse_cost | numeric | -1 | エッジの逆コスト。これは、終了ノードから開始ノードまでのエッジの重みです。 このパラメーターの値が負の場合、edge \((target \rightarrow source)\) はグラフの一部ではありません。 |
一般エッジSQLとxとyの値
列 | データ型 | デフォルト値 | 説明 |
source | integer | デフォルト値なし | エッジの開始ノード。 |
target | integer | デフォルト値なし | エッジの終了ノード。 |
cost | numeric | デフォルト値なし | 開始ノードから終了ノードまでのエッジの重みであるエッジのコスト。 このパラメーターの値が負の場合、edge \((source \rightarrow target)\) はグラフの一部ではありません。 |
reverse_cost | numeric | -1 | エッジの逆コスト。これは、終了ノードから開始ノードまでのエッジの重みです。 このパラメーターの値が負の場合、edge \((target \rightarrow source)\) はグラフの一部ではありません。 |
x1 | numeric | デフォルト値なし | エッジの開始ノードのx座標。 |
y1 | numeric | デフォルト値なし | エッジの開始ノードのy座標。 |
x2 | numeric | デフォルト値なし | エッジの終了ノードのx座標。 |
y2 | numeric | デフォルト値なし | エッジの終了ノードのy座標。 |
制限SQL
列 | データ型 | デフォルト値 | 説明 |
パス | integer array | デフォルト値なし | 取得が許可されていないパスを形成するエッジIDのシーケンス。 |
cost | numeric | デフォルト値なし | 取得が許可されていないパスを取得するコスト。 |
ポイントSQL
列 | データ型 | デフォルト値 | 説明 |
pid | integer | オート値 | ノードの一意の識別子。 |
edge_id | integer | デフォルト値なし | ノードの最も近いエッジの一意の識別子。 |
fraction | numeric | デフォルト値なし | エッジ上のノードの相対位置。 有効な値の範囲は0から1です。 |
side | char | b | 現在のノードの位置。 有効な値: |
結果列のデータ構造
関数ごとに異なる列が返されます。
パスの結果列
列 | データ型 | 説明 |
seq | integer | 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」から「ノード」までの合計コスト。 |
pgr_withPoints関数は、次の列を返します。
列 | データ型 | 説明 |
seq | integer | シーケンシャル値は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」から「ノード」までの合計コスト。 0はパスの最初のレコードを示します。 |
pgr_dijkstraNear関数は、次の列を返します。
列 | データ型 | 説明 |
seq | integer | 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」から「ノード」までの合計コスト。 |
複数パスの結果列
複数のパスを選択する関数には、次の列が返されます。
列 | データ型 | 説明 |
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」から「ノード」までの合計コスト。 |
複数のパスに対して選択的でない関数に対して、次の列が返されます。
列 | データ型 | 説明 |
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」から「ノード」までの合計コスト。 |
コスト関数の結果列
コストまたはコスト行列関数に対して、次の列が返されます。
列 | データ型 | 説明 |
start_vid | big integer | 開始頂点の一意の識別子。 |
end_vid | big integer | 終了する頂点の一意の識別子。 |
agg_cost | float | "start_vid" から "end_vid" までのパスの合計コスト。 |
クイックスタート
概要
このセクションでは、拡張作成、テーブル作成、データ挿入、属性更新、トポロジ作成、パスクエリなど、GanosBaseネットワーキングエンジンの基本的な使用方法について説明します。
構文
エクステンションを作成します。
CREATE Extension Ganos_Networking cascade;説明パブリックスキーマに拡張機能をインストールして、アクセス許可の問題を回避します。
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' -- both ways WHEN (cost>0 AND reverse_cost<0) THEN 'FT' -- direction of the LINESSTRING WHEN (cost<0 AND reverse_cost>0) THEN 'TF' -- reverse direction of the LINESTRING ELSE '' END;トポロジを作成します。
SELECT pgr_createTopology('edge_table' 、0.001);最短パスを照会します。
-- Use the Dijkstra's pathfinding algorithm. 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) -- Use the A* pathfinding algorithm. 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) -- Use the turn restricted shortest path (TRSP) algorithm. 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の公式ドキュメント」をご参照ください。