Topik ini menjelaskan tujuan, komponen dasar, dan panduan memulai cepat untuk model jalur.
Tujuan model
Pendahuluan
Model jalur adalah struktur graf yang terdiri dari titik dan sisi. Model ini digunakan untuk menyelesaikan permasalahan seperti perencanaan jalur berbasis jaringan jalan, navigasi GPS pada peta digital, dan routing. Model jalur sepenuhnya kompatibel dengan antarmuka PGRouting dan mendukung migrasi lancar aplikasi yang sudah ada. Data jalur membentuk graf jaringan geometris yang terdiri dari sisi dan node, yang terutama digunakan untuk membangun jaringan jalan dan lalu lintas.
GanosBase Networking adalah ekstensi mesin spasial-temporal untuk PolarDB for PostgreSQL. Ekstensi Networking menyediakan fungsi dan prosedur tersimpan untuk menemukan jalur tercepat, terpendek, atau optimal berdasarkan model biaya. Ekstensi ini menawarkan fitur routing geospasial dan mendukung berbagai algoritma analisis jalur dan jaringan, sehingga menambahkan kemampuan analisis jalur dan jaringan ke dalam database.
Ikhtisar fungsi
GanosBase Networking menyediakan serangkaian fungsi perencanaan jalur dan analisis jaringan:
Algoritma Johnson.
Algoritma Floyd-Warshall.
Algoritma jalur terpendek A* dan A* dua arah.
Algoritma jalur terpendek Dijkstra dan Dijkstra dua arah.
Algoritma Traveling Salesperson.
Algoritma Prim.
Algoritma Kruskal.
Algoritma K-jalur terpendek.
Analisis aliran.
Operasi topologi graf.
Operasi komponen graf.
Kontraksi graf.
Algoritma Turn Restriction Shortest Path (TRSP).
Beberapa fungsi juga mendukung perhitungan menggunakan biaya atau matriks biaya.
Skenario bisnis utama
GanosBase Networking dapat digunakan dalam berbagai skenario:
Perencanaan rute optimal
Pada industri seperti logistik, pengiriman ekspres, dan layanan taksi, Anda dapat menggunakan GanosBase Networking untuk menghitung jalur terpendek atau tercepat antara dua titik guna perencanaan dan optimasi rute. Untuk jalur non-geografis, seperti koneksi antar node Internet, GanosBase Networking juga membantu menemukan topologi jaringan yang optimal.
Analisis geospasial
Anda dapat menggunakan GanosBase Networking untuk melakukan analisis berbasis jaringan jalan, seperti pencarian tetangga terdekat dan analisis wilayah layanan. Analisis ini membantu Anda memahami distribusi dan hubungan data geospasial guna meningkatkan pengambilan keputusan dan perencanaan.
Manajemen arus lalu lintas
Anda dapat menggabungkan GanosBase Networking dengan data arus lalu lintas untuk menganalisis traffic, memprediksi kemacetan, dan memperoleh saran optimasi. Hal ini bernilai tinggi untuk aplikasi seperti manajemen lalu lintas perkotaan dan sistem transportasi cerdas.
Komponen dasar
Konsep graf
Graf adalah pasangan terurut yang direpresentasikan dengan rumus G = (V, E), di mana:
Vmerepresentasikan himpunan vertex dalam graf. Elemen-elemen dalamVdisebut vertex atau node.E ⊆ {( u, v ) | u , v ∈ V }.
Terdapat beberapa jenis graf, seperti Graf tak berarah, graf tak berarah simple, Graf berarah, dan graf berarah simple.
Dalam GanosBase, terdapat dua cara merepresentasikan graf:
Graf biaya.
Graf biaya maju dan balik.
Anda dapat menentukan jenis graf sebagai berarah atau tak berarah saat menjalankan perhitungan.
Graf biaya
Graf biaya memiliki struktur berikut dalam database:
Kolom | Deskripsi |
id | Identifier unik dari sisi. |
source | Titik awal dari sisi. |
target | Titik akhir dari sisi. |
cost | Bobot (biaya) dari sisi dari titik awal ke titik akhir. |
Graf biaya maju dan balik
Graf biaya maju dan balik memiliki struktur berikut dalam database:
Nama Kolom | Deskripsi |
id | Identifier unik dari sisi. |
source | Titik awal dari sisi. |
target | Titik akhir dari sisi. |
cost | Bobot (biaya) dari sisi dari titik awal ke titik akhir. |
reverse_cost | Bobot (biaya) dari sisi dari titik akhir ke titik awal. |
Struktur badan fungsi
GanosBase Networking kompatibel dengan standar pgRouting. Struktur umum suatu fungsi adalah:
pgr_<name>(Inner_queries, Parameters, [ Optional_parameters ])Di mana:
Inner_queries: Kueri internal. Parameter ini berupa string SQL yang digunakan untuk membangun data yang dibutuhkan fungsi.
Parameters: Parameter wajib yang dibutuhkan fungsi.
Optional_parameters: Parameter opsional. Parameter ini memiliki nilai default dan dapat diabaikan.
Suatu fungsi dapat memiliki overload yang berbeda. Overload umum meliputi:
Satu-ke-satu: Navigasi dari satu titik awal ke satu titik akhir.
Satu-ke-banyak: Navigasi dari satu titik awal ke banyak titik akhir.
Banyak-ke-satu: Navigasi dari banyak titik awal ke satu titik akhir.
Banyak-ke-banyak: Navigasi dari banyak titik awal ke banyak titik akhir.
Kombinasi: Navigasi dari berbagai titik awal ke berbagai titik akhir. Setiap tupel menentukan sepasang titik awal dan akhir.
Struktur data untuk kueri internal
Untuk mengirimkan struktur graf ke model fungsi, Anda harus membuat kueri internal. Kueri ini dikategorikan berdasarkan jenis permintaan sebagai berikut:
Edge SQL.
Kueri sisi umum: Berlaku untuk algoritma jalur terpendek Dijkstra dan Dijkstra dua arah.
Kueri sisi umum tanpa ID: Berlaku untuk algoritma All Pairs.
Kueri sisi umum dengan nilai X/Y: Berlaku untuk algoritma jalur terpendek A* dan A* dua arah.
Combinations SQL.
Restrictions SQL.
Points SQL.
Kueri sisi umum
Kolom | Type | Default | Deskripsi |
id | integer | None | Identifier unik dari sisi. |
source | integer | None | Titik awal dari sisi. |
target | integer | None | Titik akhir dari sisi. |
cost | numeric | None | Bobot dari sisi. |
reverse_cost | numeric | -1 | Bobot dari sisi dari titik akhir ke titik awal. Jika nilainya negatif, sisi \((target \rightarrow source)\) tidak ada dalam graf. |
Kueri sisi tanpa ID
Kolom | Tipe | Default | Deskripsi |
source | integer | None | Titik awal dari sisi. |
target | integer | None | Titik akhir dari sisi. |
cost | numeric | None | Bobot dari sisi. |
reverse_cost | numeric | -1 | Bobot dari sisi dari titik akhir ke titik awal. Jika nilainya negatif, sisi \((target \rightarrow source)\) tidak ada dalam graf. |
Kueri sisi dengan nilai X/Y
Kolom | Tipe | Default | Deskripsi |
source | integer | None | Titik awal dari sisi. |
target | integer | None | Titik akhir dari sisi. |
cost | numeric | None | Bobot dari sisi. Jika nilainya negatif, sisi \((source \rightarrow target)\) tidak ada dalam graf. |
reverse_cost | numeric | -1 | Bobot dari sisi dari titik akhir ke titik awal. Jika nilainya negatif, sisi \((target \rightarrow source)\) tidak ada dalam graf. |
x1 | numeric | None | Koordinat X dari titik awal sisi. |
y1 | numeric | None | Koordinat Y dari titik awal sisi. |
x2 | numeric | None | Koordinat X dari titik akhir sisi. |
y2 | numeric | None | Koordinat Y dari titik akhir sisi. |
Kueri pembatasan
Kolom | Tipe | Default | Deskripsi |
path | array integer | None | Urutan ID dari semua sisi yang tidak dapat dilewati. |
cost | numeric | None | Biaya untuk melewati sisi yang tidak dapat dilewati. |
Kueri titik
Kolom | Tipe | Default | Deskripsi |
pid | integer | auto value | Identifier unik dari titik. |
edge_id | integer | None | Identifier unik dari sisi terdekat dengan titik tersebut. |
fraction | numeric | None | Posisi relatif titik pada sisi. Nilainya harus antara 0 dan 1. |
side | char | b | Posisi titik saat ini. Nilainya harus salah satu dari berikut: |
Struktur data kolom hasil
Kolom yang dikembalikan bervariasi tergantung fungsi yang digunakan.
Hasil untuk satu jalur
Kolom | Type | Deskripsi |
seq | integer | Nilai berurutan yang dimulai dari 1. |
path_seq | integer | Posisi relatif dalam keseluruhan jalur. Ini adalah nilai berurutan yang dimulai dari 1. |
[start_vid] | big integer | Identifier unik untuk vertex awal. Kolom ini hanya dikembalikan jika kueri memiliki beberapa vertex awal. |
[end_vid] | big integer | Identifier unik untuk vertex akhir. Kolom ini hanya dikembalikan jika kueri memiliki beberapa vertex akhir. |
node | big integer | Identifier dari node dalam jalur dari "start_vid" ke "end_vid". |
edge | big integer | Identifier dari sisi dari node saat ini ke node berikutnya dalam urutan jalur. Nilai -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". |
Berlaku untuk fungsi pgr_withPoints:
Kolom | Tipe | Deskripsi |
seq | integer | Nilai berurutan yang dimulai dari 1. |
path_seq | integer | Posisi relatif dalam keseluruhan jalur. Ini adalah nilai berurutan yang dimulai dari 1. |
[start_vid] | big integer | Identifier unik untuk vertex atau titik awal. Kolom ini hanya dikembalikan jika kueri memiliki beberapa vertex awal.
|
[end_vid] | big integer | Identifier unik dari vertex atau titik akhir hanya dikembalikan jika kueri berisi beberapa vertex awal.
|
node | big integer | Identifier dari node dalam jalur dari "start_vid" ke "end_vid".
|
edge | big integer | Identifier dari sisi dari node saat ini ke node berikutnya dalam urutan jalur. Nilai -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". Nilai 0 menunjukkan catatan pertama dari jalur. |
Berlaku untuk fungsi pgr_dijkstraNear:
Kolom | Tipe | Deskripsi |
seq | integer | Nilai berurutan yang dimulai dari 1. |
path_seq | integer | Posisi relatif dalam keseluruhan jalur. Ini adalah nilai berurutan yang dimulai dari 1. |
start_vid | big integer | Identifier unik dari vertex awal jalur saat ini. |
end_vid | big integer | Identifier unik dari vertex akhir jalur saat ini. |
node | big integer | Identifier dari node dalam jalur dari "start_vid" ke "end_vid". |
edge | big integer | Identifier dari sisi dari node saat ini ke node berikutnya dalam urutan jalur. Nilai -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". |
Hasil untuk beberapa jalur
Berlaku untuk fungsi yang selektif terhadap beberapa jalur:
Kolom | Tipe | Deskripsi |
seq | integer | Nilai berurutan yang dimulai dari 1. |
path_id | integer | Identifier unik dari jalur. ID jalur pertama dari "start_vid" ke "end_vid" adalah 1. |
path_seq | integer | Posisi relatif dalam keseluruhan jalur. Ini adalah nilai berurutan yang dimulai dari 1. |
[start_vid] | big integer | Identifier unik untuk vertex awal. Kolom ini hanya dikembalikan jika kueri memiliki beberapa vertex awal. |
[end_vid] | big integer | Identifier unik untuk vertex akhir. Kolom ini hanya dikembalikan jika kueri memiliki beberapa vertex akhir. |
node | big integer | Identifier dari node dalam jalur dari "start_vid" ke "end_vid". |
edge | big integer | Identifier dari sisi dari node saat ini ke node berikutnya dalam urutan jalur. Nilai -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". |
Berlaku untuk fungsi yang tidak selektif terhadap beberapa jalur:
Kolom | Tipe | Deskripsi |
seq | integer | Nilai berurutan yang dimulai dari 1. |
path_id | integer | Identifier unik dari jalur. ID jalur pertama dari "start_vid" ke "end_vid" adalah 1. |
path_seq | integer | Posisi relatif dalam keseluruhan jalur. Ini adalah nilai berurutan yang dimulai dari 1. |
start_vid | big integer | Identifier unik dari vertex awal. |
end_vid | big integer | Identifier unik dari vertex akhir. |
node | big integer | Identifier dari node dalam jalur dari "start_vid" ke "end_vid". |
edge | big integer | Identifier dari sisi dari node saat ini ke node berikutnya dalam urutan jalur. Nilai -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". |
Hasil untuk fungsi biaya
Berlaku untuk fungsi yang menggunakan biaya atau matriks biaya:
Nama Kolom | Tipe | Deskripsi |
start_vid | big integer | Identifier unik dari vertex awal. |
end_vid | big integer | Identifier unik dari vertex akhir. |
agg_cost | float | Total biaya jalur dari "start_vid" ke "end_vid". |
Panduan Memulai Cepat
Pendahuluan
Panduan memulai cepat ini menjelaskan penggunaan dasar mesin GanosBase Networking, termasuk cara membuat ekstensi, membuat tabel, memasukkan data, memperbarui properti, membuat topologi, dan mengkueri jalur.
Penjelasan sintaks
Buat ekstensi.
CREATE Extension Ganos_Networking cascade;CatatanInstal ekstensi dalam skema public untuk menghindari 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 );Masukkan catatan.
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 properti 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' -- Both ways WHEN (cost>0 AND reverse_cost<0) THEN 'FT' -- In the direction of the LINESTRING WHEN (cost<0 AND reverse_cost>0) THEN 'TF' -- In the reverse direction of the LINESTRING ELSE '' END;Buat topologi.
SELECT pgr_createTopology('edge_table',0.001);Kueri jalur terpendek.
-- Dijkstra shortest path 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* path 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) -- TRSP path 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)Hapus ekstensi (opsional).
Drop Extension Ganos_Networking cascade;
Referensi SQL
Untuk manual SQL lengkap, lihat dokumentasi resmi pgRouting.