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

PolarDB:パスモデル

最終更新日:Aug 25, 2026

本トピックでは、パスモデルの目的、基本コンポーネント、およびクイックスタートについて説明します。

モデルの目的

概要

パスモデルは、点と辺で構成されるグラフ構造です。道路ネットワークに基づく経路計画、電子地図の 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

現在のポイントの位置です。値は、次のいずれかである必要があります:b (両方)、r (右)、または l (左)。値が NULL の場合、b として扱われます。

結果列のデータ構造

戻り値の列は、関数によって異なります。

単一パスの結果

カラム

タイプ

説明

seq

整数

1 から始まるシーケンシャルな値。

path_seq

整数

パス全体における相対位置。これは 1 から始まるシーケンシャルな値です。

[start_vid]

big integer

開始頂点の一意の識別子。クエリに複数の開始頂点がある場合にのみ、このカラムが返されます。

[end_vid]

big integer

終了頂点の一意の識別子。クエリに複数の終了頂点がある場合にのみ、このカラムが返されます。

node

big integer

start_vid から end_vid へのパス内のノードの識別子。

edge

big integer

パスシーケンス上の現在のノードから次のノードへのエッジの識別子。値が -1 の場合、パスの最後のノードを示します。

cost

浮動小数点

パスシーケンス上の現在のノードから次のノードへのコスト。

agg_cost

浮動小数点

start_vid から node までの合計コスト。

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 から node までの合計コストです。値が 0 の場合は、パスの最初のレコードを示します。

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

フロート

start_vid から end_vid までのパスの合計コストです。

クイックスタート

はじめに

このクイックスタートガイドでは、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 の公式ドキュメントをご参照ください。