すべてのプロダクト
Search
ドキュメントセンター

PolarDB:パスモデル

最終更新日:Oct 17, 2024

このトピックでは、パスモデルの詳細と使用方法について説明します。

概要

概要

経路モデルは、ノードとエッジによって記述されるグラフ構造であり、道路網上の経路計画、電子地図上の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

現在のノードの位置。 有効な値: b (両側) 、r (右) 、およびl (左) 。 デフォルト値は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の公式ドキュメント」をご参照ください。