All Products
Search
Document Center

PolarDB:Model Jalur

Last Updated:Jul 02, 2025

Topik ini menjelaskan detail dan penggunaan model jalur.

Pendahuluan

Ikhtisar

Model jalur adalah struktur graf yang dijelaskan oleh simpul dan sisi, digunakan untuk perencanaan jalur pada jaringan jalan, pencarian dan perencanaan dalam navigasi GPS pada peta elektronik, serta perutean. Model jalur sepenuhnya kompatibel dengan fungsi-fungsi pgRouting dan memungkinkan migrasi aplikasi yang ada secara mulus. Data jalur merupakan diagram jaringan geometris yang terdiri dari sisi dan simpul, digunakan untuk membangun jaringan jalan dan lalu lintas.

GanosBase Networking adalah ekstensi mesin spatio-temporal PostgreSQL (PolarDB untuk PostgreSQL). GanosBase Networking menyediakan serangkaian fungsi dan prosedur tersimpan untuk menemukan jalur tercepat, terpendek, atau optimal berdasarkan model biaya. GanosBase Networking mendukung analisis geospasial dan beberapa algoritma untuk analisis jalur serta analisis jaringan dalam database.

Fitur

GanosBase Networking menyediakan serangkaian fungsi untuk perencanaan jalur dan analisis jaringan:

  • Algoritma Johnson.

  • Algoritma Floyd-Warshall.

  • Algoritma pencarian jalur A* atau A* dua arah.

  • Algoritma pencarian jalur Dijkstra atau Dijkstra dua arah.

  • Algoritma salesman keliling.

  • Algoritma Prim.

  • Algoritma Kruskal.

  • Algoritma K jalur terpendek.

  • Analisis aliran.

  • Operasi topologi.

  • Operasi komponen.

  • Kontraksi.

  • Algoritma jalur terpendek dengan pembatasan belokan.

Beberapa fungsi juga memungkinkan Anda mengatur biaya atau matriks biaya untuk perhitungan.

Skenario

GanosBase Networking dapat digunakan dalam skenario berikut:

  • Perencanaan rute

    Dalam industri seperti logistik, layanan pengiriman, dan layanan taksi, GanosBase Networking dapat digunakan untuk menghitung jalur terpendek atau tercepat antara dua titik guna perencanaan dan optimasi rute. Untuk jalur non-geografis, seperti koneksi antara node Internet, GanosBase Networking dapat membantu mendapatkan topologi jaringan yang lebih baik.

  • Analisis geospasial

    GanosBase Networking dapat digunakan untuk melakukan analisis berdasarkan jaringan jalan, seperti pencarian tetangga terdekat dan analisis zona layanan. Tugas-tugas ini memungkinkan pemahaman distribusi dan hubungan data geospasial untuk pengambilan keputusan dan perencanaan lebih lanjut.

  • Manajemen arus lalu lintas

    GanosBase Networking dapat digunakan untuk menganalisis data volume lalu lintas, memprediksi kemacetan, dan memberikan rekomendasi optimasi. Ini membantu dalam mengoptimalkan aplikasi seperti manajemen lalu lintas perkotaan dan sistem transportasi cerdas.

Komponen

Graf

Graf adalah pasangan terurut G = (V ,E).

  • V merepresentasikan himpunan simpul. Elemen dari V disebut simpul atau node.

  • E ⊆ {( u, v ) | u , v ∈ V }.

Graf diklasifikasikan menjadi berbagai jenis seperti graf tak berarah, graf sederhana tak berarah, graf berarah, dan graf sederhana berarah.

Dalam GanosBase, graf disajikan dengan cara berikut:

  • Graf dengan biaya.

  • Graf dengan biaya dan biaya balik.

Graf dapat ditentukan sebagai berarah atau tak berarah untuk perhitungan.

Graf dengan biaya

Graf dengan biaya berisi kolom-kolom berikut dalam database:

Kolom

Deskripsi

id

Pengenal unik dari sebuah sisi.

source

Node awal dari sebuah sisi.

target

Node akhir dari sebuah sisi.

cost

Biaya dari sebuah sisi, yaitu bobot sisi dari node awal ke node akhir.

Graf dengan biaya dan biaya balik

Graf dengan biaya dan biaya balik berisi kolom-kolom berikut dalam database:

Kolom

Deskripsi

id

Pengenal unik dari sebuah sisi.

source

Node awal dari sebuah sisi.

target

Node akhir dari sebuah sisi.

cost

Biaya dari sebuah sisi, yaitu bobot sisi dari node awal ke node akhir.

reverse_cost

Biaya balik dari sebuah sisi, yaitu bobot sisi dari node akhir ke node awal.

Struktur tubuh fungsi

GanosBase Networking kompatibel dengan fungsi-fungsi pgRouting. Berikut adalah struktur tubuh fungsi:

pgr_<name>(Inner_queries, Parameters, [ Optional_parameters ])

Perhatikan parameter-parameter berikut:

  • Inner_queries: query internal, yaitu pernyataan SQL untuk membuat data yang diperlukan oleh fungsi.

  • Parameters: parameter yang diperlukan oleh fungsi.

  • Optional_parameters: parameter opsional. Parameter ini memiliki nilai default jika tidak ditentukan.

Sebuah fungsi mungkin memiliki overload yang berbeda. Berikut adalah overload yang paling umum:

  • Satu-ke-satu: menavigasi dari satu node awal ke satu node akhir.

  • Satu-ke-banyak: menavigasi dari satu node awal ke banyak node akhir.

  • Banyak-ke-satu: menavigasi dari banyak node awal ke satu node akhir.

  • Banyak-ke-banyak: menavigasi dari banyak node awal ke banyak node akhir.

  • Kombinasi: menavigasi dari banyak node awal ke banyak node akhir yang ditentukan menggunakan tupel. Setiap tupel menentukan node awal dan node akhir.

Struktur data tempat query internal bergantung

Anda perlu membangun query internal untuk melewatkan struktur graf ke model fungsi. Query internal dapat diklasifikasikan ke dalam jenis-jenis berikut berdasarkan tipe kebutuhan:

  • SQL tepi.

  • SQL tepi umum: berlaku untuk algoritma pencarian jalur Dijkstra atau Dijkstra dua arah.

  • SQL tepi umum tanpa ID: berlaku untuk algoritma semua-pasangan.

  • SQL tepi umum dengan nilai x dan y: berlaku untuk algoritma pencarian jalur A* atau A* dua arah.

  • SQL kombinasi.

  • SQL pembatasan.

  • SQL titik.

SQL tepi umum

Kolom

Tipe

Nilai default

Deskripsi

id

integer

Tidak ada nilai default

Pengenal unik dari sebuah sisi.

source

integer

Tidak ada nilai default

Node awal dari sebuah sisi.

target

integer

Tidak ada nilai default

Node akhir dari sebuah sisi.

cost

numeric

Tidak ada nilai default

Biaya dari sebuah sisi, yaitu bobot sisi dari node awal ke node akhir.

reverse_cost

numeric

-1

Biaya balik dari sebuah sisi, yaitu bobot sisi dari node akhir ke node awal.

Ketika nilai parameter ini negatif, sisi \((target \rightarrow source)\) bukan bagian dari graf.

SQL tepi umum tanpa ID

Kolom

Tipe

Nilai default

Deskripsi

source

integer

Tidak ada nilai default

Node awal dari sebuah sisi.

target

integer

Tidak ada nilai default

Node akhir dari sebuah sisi.

cost

numeric

Tidak ada nilai default

Biaya dari sebuah sisi, yaitu bobot sisi dari node awal ke node akhir.

reverse_cost

numeric

-1

Biaya balik dari sebuah sisi, yaitu bobot sisi dari node akhir ke node awal.

Ketika nilai parameter ini negatif, sisi \((target \rightarrow source)\) bukan bagian dari graf.

SQL tepi umum dengan nilai x dan y

Kolom

Tipe

Nilai default

Deskripsi

source

integer

Tidak ada nilai default

Node awal dari sebuah sisi.

target

integer

Tidak ada nilai default

Node akhir dari sebuah sisi.

cost

numeric

Tidak ada nilai default

Biaya dari sebuah sisi, yaitu bobot sisi dari node awal ke node akhir.

Ketika nilai parameter ini negatif, sisi \((source \rightarrow target)\) bukan bagian dari graf.

reverse_cost

numeric

-1

Biaya balik dari sebuah sisi, yaitu bobot sisi dari node akhir ke node awal.

Ketika nilai parameter ini negatif, sisi \((target \rightarrow source)\) bukan bagian dari graf.

x1

numeric

Tidak ada nilai default

Koordinat x dari node awal sebuah sisi.

y1

numeric

Tidak ada nilai default

Koordinat y dari node awal sebuah sisi.

x2

numeric

Tidak ada nilai default

Koordinat x dari node akhir sebuah sisi.

y2

numeric

Tidak ada nilai default

Koordinat y dari node akhir sebuah sisi.

SQL pembatasan

Kolom

Tipe

Nilai default

Deskripsi

path

integer array

Tidak ada nilai default

Urutan ID sisi yang membentuk jalur yang tidak diizinkan untuk dilewati.

cost

numeric

Tidak ada nilai default

Biaya untuk melewati jalur yang tidak diizinkan untuk dilewati.

SQL titik

Kolom

Tipe

Nilai default

Deskripsi

pid

integer

nilai otomatis

Pengenal unik dari sebuah node.

edge_id

integer

Tidak ada nilai default

Pengenal unik dari sisi terdekat dari node tersebut.

fraction

numeric

Tidak ada nilai default

Posisi relatif node pada sisi. Nilai valid berkisar dari 0 hingga 1.

side

char

b

Posisi node saat ini. Nilai valid: b (kedua sisi), r (kanan), dan l (kiri). Nilai default adalah b.

Struktur data kolom hasil

Kolom yang berbeda dikembalikan untuk fungsi yang berbeda.

Kolom hasil untuk jalur

Kolom

Tipe

Deskripsi

seq

integer

Nilai berurutan yang dimulai dari 1.

path_seq

integer

Posisi relatif dalam jalur. Nilai berurutan dimulai dari 1.

[start_vid]

big integer

Pengenal unik dari simpul awal. Nilai ini hanya dikembalikan ketika query berisi beberapa simpul awal.

[end_vid]

big integer

Pengenal unik dari simpul akhir. Nilai ini hanya dikembalikan ketika query berisi beberapa simpul akhir.

node

big integer

Pengenal sebuah node dalam jalur dari "start_vid" ke "end_vid".

edge

big integer

Pengenal sisi dari node saat ini ke node berikutnya dalam urutan jalur. -1 menunjukkan node terakhir dari jalur.

cost

float

Biaya dari node saat ini ke node berikutnya dalam urutan jalur.

agg_cost

float

Total biaya dari "start_vid" ke "node".

Fungsi pgr_withPoints mengembalikan kolom-kolom berikut:

Kolom

Tipe

Deskripsi

seq

integer

Nilai berurutan dimulai dari 1.

path_seq

integer

Posisi relatif dalam jalur. Nilai berurutan dimulai dari 1.

[start_vid]

big integer

Pengenal unik dari simpul awal. Nilai ini hanya dikembalikan ketika query berisi beberapa simpul awal.

  • Pengenal dari simpul awal adalah angka positif.

  • Pengenal dari simpul akhir adalah angka negatif.

[end_vid]

big integer

Pengenal unik dari simpul akhir. Nilai ini hanya dikembalikan ketika query berisi beberapa simpul akhir.

  • Pengenal dari simpul akhir adalah angka positif.

  • Pengenal dari simpul awal adalah angka negatif.

node

big integer

Pengenal sebuah node dalam jalur dari "start_vid" ke "end_vid".

  • Pengenal dari simpul adalah angka positif.

  • Pengenal dari node adalah angka negatif.

edge

big integer

Pengenal sisi dari node saat ini ke node berikutnya dalam urutan jalur. -1 menunjukkan node terakhir dari jalur.

cost

float

Biaya dari node saat ini ke node berikutnya dalam urutan jalur.

agg_cost

float

Total biaya dari "start_vid" ke "node". 0 menunjukkan catatan pertama dari jalur.

Fungsi pgr_dijkstraNear mengembalikan kolom-kolom berikut:

Kolom

Tipe

Deskripsi

seq

integer

Nilai berurutan yang dimulai dari 1.

path_seq

integer

Posisi relatif dalam jalur. Nilai berurutan dimulai dari 1.

start_vid

big integer

Pengenal unik dari simpul awal dari jalur saat ini.

end_vid

big integer

Pengenal unik dari simpul akhir dari jalur saat ini.

node

big integer

Pengenal sebuah node dalam jalur dari "start_vid" ke "end_vid".

edge

big integer

Pengenal sisi dari node saat ini ke node berikutnya dalam urutan jalur. -1 menunjukkan node terakhir dari jalur.

cost

float

Biaya dari node saat ini ke node berikutnya dalam urutan jalur.

agg_cost

float

Total biaya dari "start_vid" ke "node".

Kolom hasil untuk jalur ganda

Kolom-kolom berikut dikembalikan untuk fungsi-fungsi yang selektif untuk jalur ganda:

Kolom

Tipe

Deskripsi

seq

integer

Nilai berurutan yang dimulai dari 1.

path_id

integer

Pengenal unik dari jalur.

ID jalur pertama dari "start_vid" ke "end_vid" adalah 1.

path_seq

integer

Posisi relatif dalam jalur. Nilai berurutan dimulai dari 1.

[start_vid]

big integer

Pengenal unik dari simpul awal. Nilai ini hanya dikembalikan ketika query berisi beberapa simpul akhir.

[end_vid]

big integer

Pengenal unik dari simpul akhir. Nilai ini hanya dikembalikan ketika query berisi beberapa simpul akhir.

node

big integer

Pengenal sebuah node dalam jalur dari "start_vid" ke "end_vid".

edge

big integer

Pengenal sisi dari node saat ini ke node berikutnya dalam urutan jalur. -1 menunjukkan node terakhir dari jalur.

cost

float

Biaya dari node saat ini ke node berikutnya dalam urutan jalur.

agg_cost

float

Total biaya dari "start_vid" ke "node".

Kolom-kolom berikut dikembalikan untuk fungsi-fungsi yang tidak selektif untuk jalur ganda:

Kolom

Tipe

Deskripsi

seq

integer

Nilai berurutan yang dimulai dari 1.

path_id

integer

Pengenal unik dari jalur.

ID jalur pertama dari "start_vid" ke "end_vid" adalah 1.

path_seq

integer

Posisi relatif dalam jalur. Nilai berurutan dimulai dari 1.

start_vid

big integer

Pengenal unik dari simpul awal.

end_vid

big integer

Pengenal unik dari simpul akhir.

node

big integer

Pengenal sebuah node dalam jalur dari "start_vid" ke "end_vid".

edge

big integer

Pengenal sisi dari node saat ini ke node berikutnya dalam urutan jalur. -1 menunjukkan node terakhir dari jalur.

cost

float

Biaya dari node saat ini ke node berikutnya dalam urutan jalur.

agg_cost

float

Total biaya dari "start_vid" ke "node".

Kolom hasil untuk fungsi biaya

Kolom-kolom berikut dikembalikan untuk fungsi biaya atau matriks biaya:

Kolom

Tipe

Deskripsi

start_vid

big integer

Pengenal unik dari simpul awal.

end_vid

big integer

Pengenal unik dari simpul akhir.

agg_cost

float

Total biaya dari jalur dari "start_vid" ke "end_vid".

Mulai Cepat

Ikhtisar

Bagian ini menjelaskan penggunaan dasar mesin GanosBase Networking, termasuk pembuatan ekstensi, pembuatan tabel, penyisipan data, pembaruan atribut, pembuatan topologi, dan kueri jalur.

Sintaksis

  • Buat ekstensi.

     CREATE Extension Ganos_Networking cascade;
    Catatan

    Instal ekstensi ke skema publik untuk menghindari kemungkinan masalah izin.

    CREATE extension Ganos_Networking WITH schema public cascade;
  • Buat tabel.

     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
     );
  • Sisipkan rekaman.

     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);
  • Perbarui atribut tabel.

     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'   -- kedua arah
                WHEN (cost>0 AND reverse_cost<0) THEN 'FT'  -- arah dari LINESSTRING
                WHEN (cost<0 AND reverse_cost>0) THEN 'TF'  -- arah sebaliknya dari LINESTRING
                ELSE '' END;
  • Buat topologi.

     SELECT pgr_createTopology('edge_table',0.001);
  • Kueri jalur terpendek.

    -- Gunakan algoritma pencarian jalur Dijkstra.
     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)
    
     -- Gunakan algoritma pencarian jalur 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 |    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)  
    
     -- Gunakan algoritma jalur terpendek dengan pembatasan belokan (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)
  • Hapus ekstensi (opsional).

     Drop Extension Ganos_Networking cascade;

Pernyataan SQL

Untuk informasi lebih lanjut tentang pernyataan SQL, lihat dokumentasi resmi pgRouting.