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).
Vmerepresentasikan himpunan simpul. Elemen dariVdisebut 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: |
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.
|
[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". 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;CatatanInstal 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.