Analisis Rute Geospasial Menggunakan pgRouting di ServBay
pgRouting
adalah ekstensi yang sangat kuat untuk basis data PostgreSQL dan PostGIS, khusus dikembangkan untuk menyediakan fungsi analisis rute dan jaringan bagi data geospasial. Dengan pgRouting
, pengembang dapat melakukan kueri kompleks pada data jaringan jalan, seperti mencari rute terpendek antara dua titik, menyelesaikan masalah Traveling Salesperson (TSP), atau melakukan analisis area layanan (service area). Fitur-fitur ini sangat berguna dalam pembangunan aplikasi peta, perencanaan logistik, dan analisis transportasi.
Artikel ini akan menjelaskan secara detail cara mengaktifkan ekstensi pgRouting
untuk basis data PostgreSQL Anda di lingkungan pengembangan web lokal ServBay, serta langkah-langkah konfigurasi dasar dan analisis rute yang bisa dijalankan.
Ringkasan
ServBay menawarkan lingkungan pengembangan lokal terintegrasi yang mudah digunakan bagi developer di macOS, lengkap dengan berbagai server web, basis data, dan bahasa pemrograman. Paket PostgreSQL yang disediakan ServBay sudah termasuk ekstensi pgRouting
dan PostGIS
. Artinya, Anda tidak perlu mengunduh atau mengompilasi ekstensi-ekstensi ini secara manual, cukup mengaktifkannya di basis data Anda.
Prasyarat
Sebelum mulai menggunakan pgRouting
, pastikan Anda telah memenuhi syarat berikut:
- ServBay sudah terpasang dan berjalan: Jika Anda belum memasang ServBay, silakan unduh dan instal versi terbaru melalui Situs Resmi ServBay.
- Paket PostgreSQL pada ServBay telah terinstal dan berjalan: Pastikan pada antarmuka aplikasi ServBay, paket PostgreSQL sudah terpasang dan statusnya "Running".
- Memahami dasar SQL dan operasi PostgreSQL: Panduan ini mengasumsikan Anda sudah mengenal database PostgreSQL dan kueri SQL.
- Memahami dasar PostGIS:
pgRouting
bergantung padaPostGIS
untuk menangani tipe data dan fungsi geospasial. Pastikan ekstensi PostGIS sudah diaktifkan pada database Anda, yang biasanya sudah tersedia pada paket PostgreSQL ServBay.
Instalasi dan Aktivasi Ekstensi pgRouting
Ekstensi pgRouting
sudah disiapkan di lingkungan ServBay. Anda hanya perlu mengaktifkan ekstensi ini pada basis data yang ingin digunakan.
Koneksi ke Basis Data PostgreSQL:
Anda bisa menghubungkan diri ke database PostgreSQL menggunakan berbagai cara, seperti melalui tool command line
psql
, aplikasi grafis (seperti pgAdmin, DBeaver), atau library klien dari bahasa pemrograman.Menggunakan tool command line
psql
yang disediakan ServBay adalah cara yang umum dan sederhana. Anda bisa membuka terminal yang sudah dikonfigurasikan dari tombol "Terminal" di aplikasi ServBay, atau secara manual menambahkan folder bin ServBay ke PATH sistem Anda.Di terminal, gunakan perintah berikut untuk masuk ke basis data target (misal: database bernama
servbay_geo_db
dengan user defaultservbay
):bashpsql -U servbay -d servbay_geo_db
1Jika nama database, username, atau password Anda berbeda, silakan sesuaikan perintahnya.
Cek dan Aktifkan Ekstensi PostGIS (Jika Belum):
pgRouting
membutuhkanPostGIS
. Sebelum mengaktifkanpgRouting
, pastikan PostGIS sudah terpasang. Pada promptpsql
, masukkan:sqlCREATE EXTENSION IF NOT EXISTS postgis;
1Perintah ini akan membuat ekstensi PostGIS jika belum ada.
Aktifkan pgRouting:
Pada koneksi database yang sama, jalankan perintah SQL berikut untuk mengaktifkan ekstensi
pgRouting
:sqlCREATE EXTENSION pgrouting;
1Jika berhasil, output yang muncul mirip dengan
CREATE EXTENSION
.Verifikasi Instalasi:
Anda bisa mengecek ekstensi yang telah aktif dengan perintah berikut:
sql\dx
1Di daftar output, seharusnya muncul
postgis
danpgrouting
beserta detailnya.
Konfigurasi pgRouting: Menyiapkan Data Jaringan Jalan dan Pembuatan Topologi
Algoritma pgRouting
dijalankan di atas tabel yang mewakili struktur jaringan jalan. Umumnya, terdapat sebuah tabel dengan data garis (segmen jalan), masing-masing memiliki ID, node asal, node tujuan, dan bobot/jarak (seperti jarak tempuh atau waktu). Untuk perhitungan rute yang efisien, Anda juga harus membangun struktur "topologi" dari segmen-segmen data tersebut, sehingga keterhubungan antar ruas jalan dan simpul (node) dapat diketahui.
Membuat Tabel Data Jaringan Jalan
Berikut contoh pembuatan tabel bernama ways
untuk menyimpan data jaringan jalan, yang mencakup ID segmen jalan, ID node asal dan tujuan, biaya perjalanan searah dan berlawanan (cost
, reverse_cost
), serta geometri garis memakai tipe PostGIS GEOMETRY
.
sql
-- Membuat tabel untuk data jaringan jalan
CREATE TABLE ways (
id SERIAL PRIMARY KEY, -- Identitas unik segmen jalan
source INTEGER, -- ID node awal
target INTEGER, -- ID node akhir
cost DOUBLE PRECISION, -- Biaya searah (misal: jarak atau waktu)
reverse_cost DOUBLE PRECISION, -- Biaya berlawanan arah
geom GEOMETRY(LineString, 4326) -- Geometri segmen jalan, menggunakan tipe LineString dan SRID 4326 (WGS 84)
);
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
Penjelasan:
SERIAL PRIMARY KEY
: Otomatis menghasilkan ID unik setiap segmen jalan.source
,target
: Mewakili node awal dan akhir pada topologi. Ini bisa diisi secara otomatis atau manual saat membuat topologi.cost
,reverse_cost
: Menyimpan bobot biaya jalan. Untuk jalan satu arah,reverse_cost
bisa berisiNULL
atau nilai sangat besar.geom
: Menyimpan data garis jalan, tipe PostGISGEOMETRY
.LineString
berarti berbentuk garis,4326
adalah SRID untuk sistem koordinat WGS 84 (biasa dipakai pada GPS).
Menyisipkan Data Contoh
Anda dapat menyisipkan beberapa data contoh ke tabel ways
:
sql
-- Menyisipkan data segmen jalan contoh
INSERT INTO ways (source, target, cost, reverse_cost, geom) VALUES
(1, 2, 1.0, 1.0, ST_SetSRID(ST_MakeLine(ST_MakePoint(116.4074, 39.9042), ST_MakePoint(116.4084, 39.9052)), 4326)),
(2, 3, 1.0, 1.0, ST_SetSRID(ST_MakeLine(ST_MakePoint(116.4084, 39.9052), ST_MakePoint(116.4094, 39.9062)), 4326)),
(3, 4, 1.0, 1.0, ST_SetSRID(ST_MakeLine(ST_MakePoint(116.4094, 39.9062), ST_MakePoint(116.4104, 39.9072)), 4326));
1
2
3
4
5
2
3
4
5
Penjelasan:
ST_MakePoint(x, y)
: Membuat titik (point) berdasarkan koordinat longitude dan latitude.ST_MakeLine(point1, point2)
: Membuat garis (LineString) antara dua titik.ST_SetSRID(geometry, srid)
: Menetapkan sistem referensi spasial (SRID) untuk objek geometri.- Data di atas mewakili tiga segmen jalan yang saling tersambung, masing-masing dengan biaya 1.0. Koordinat menunjukkan contoh area di pusat kota Beijing.
Membuat Topologi
Setelah data jaringan jalan siap, gunakan fungsi pgr_createTopology
untuk membuat topologi. Fungsi ini akan menganalisis geometri segmen jalan untuk menemukan node-node penghubung, lalu mengisi otomatis kolom source
dan target
, serta membuat tabel node baru (misalnya [nama_tabel]_vertices_pgr
).
sql
-- Membuat topologi untuk data jaringan jalan
-- Parameter:
-- 'ways': Nama tabel data jaringan jalan
-- 0.00001: Nilai toleransi bagi dua titik dianggap sebagai node yang sama
-- 'geom': Nama kolom data geometri
-- 'id': Nama kolom ID segmen jalan
SELECT pgr_createTopology('ways', 0.00001, 'geom', 'id');
1
2
3
4
5
6
7
2
3
4
5
6
7
Penjelasan:
pgr_createTopology
: Fungsi utama daripgRouting
untuk membangun model node-edge untuk jaringan.- Nilai toleransi sangat penting untuk menentukan seberapa dekat dua titik bisa diakui sebagai node yang sama. Pilih toleransi sesuai ketelitian data Anda.
Setelah fungsi ini dijalankan, kolom source
dan target
pada tabel ways
akan terisi, dan tabel ways_vertices_pgr
akan terbentuk, memuat data semua node pada jaringan beserta koordinatnya.
Analisis Rute menggunakan pgRouting
Setelah topologi dibuat, Anda dapat menggunakan berbagai algoritma rute yang disediakan pgRouting
. Berikut beberapa contoh algoritma yang umum digunakan.
Analisis Rute Terpendek (Dijkstra)
Mencari rute terpendek antara dua simpul adalah kebutuhan paling sering. pgRouting
menyediakan implementasi algoritma Dijkstra.
sql
-- Mencari rute terpendek dari node 1 ke node 4
-- Parameter:
-- 'SELECT id, source, target, cost FROM ways': Query data edge pada jaringan, harus memuat id, source, target, cost
-- 1: ID node awal
-- 4: ID node tujuan
-- directed := true: Apakah jaringan dianggap berarah (jika cost dan reverse_cost berbeda)
SELECT seq, id1 AS node, id2 AS edge, cost, geom
FROM pgr_dijkstra(
'SELECT id, source, target, cost FROM ways',
1, -- ID node awal
4, -- ID node tujuan
directed := true -- Jika ingin memperhitungkan reverse_cost, set ke false atau diabaikan
)
JOIN ways ON edge = ways.id; -- Menggabungkan hasil dengan tabel ways untuk mengambil geometri
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
Penjelasan:
pgr_dijkstra
: Menjalankan algoritma Dijkstra.- Query pertama mengembalikan data edge pada jaringan minimal kolom id, source, target, cost. Jika ingin mendukung rute dua arah, perlu kolom reverse_cost dan directed di-set ke false.
- Parameter kedua dan ketiga adalah ID node awal dan tujuan.
JOIN ways ON edge = ways.id
: Untuk mendapatkan informasi geometri segmen jalan, sangat berguna untuk visualisasi.
Traveling Salesperson Problem (TSP)
Algoritma TSP mencari lintasan terpendek untuk melewati beberapa lokasi (node) yang ditentukan.
sql
-- Menyelesaikan TSP mengunjungi node 1, 2, 3, 4 dari node 1
-- Parameter:
-- 'SELECT id, x::float8 AS x, y::float8 AS y FROM ways_vertices_pgr': Query node yang harus dikunjungi beserta koordinatnya
-- start_id := 1: ID node awal
SELECT seq, node, edge, cost
FROM pgr_tsp(
'SELECT id, ST_X(the_geom)::float8 AS x, ST_Y(the_geom)::float8 AS y FROM ways_vertices_pgr WHERE id IN (1, 2, 3, 4)', -- Query node dan koordinat
start_id := 1 -- ID node awal
);
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
Penjelasan:
pgr_tsp
: Menjalankan algoritma TSP.- Parameter pertama adalah query SQL yang mengembalikan minimal id, x, y untuk node yang akan dikunjungi.
start_id
: ID node mulai perjalanan.
Analisis Service Area (Jarak/ Waktu Layanan)
Analisis service area menentukan area atau segmen jalan yang dapat dijangkau dari satu atau beberapa titik awal dalam batas biaya tertentu (jarak atau waktu).
sql
-- Dari node 1, cari semua segmen jalan yang bisa dicapai dengan biaya maksimal 2
-- Parameter:
-- 'SELECT id, source, target, cost FROM ways': Query edge jaringan
-- 1: ID node awal
-- 2: Batasan biaya maksimal
-- directed := true: Apakah jaringan berarah
SELECT seq, id1 AS node, id2 AS edge, cost, geom
FROM pgr_drivingDistance(
'SELECT id, source, target, cost FROM ways',
1, -- ID node awal
2, -- Batas biaya maksimal
directed := true
)
JOIN ways ON edge = ways.id; -- Join untuk mendapatkan geometri segmen jalan
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
Penjelasan:
pgr_drivingDistance
: Menjalankan analisis area layanan.- Query pertama sama dengan pgr_dijkstra.
- Parameter kedua adalah ID node awal.
- Parameter ketiga adalah batas biaya maksimal.
- Data hasil JOIN dengan ways untuk keperluan visualisasi.
Visualisasi Hasil Analisis Rute
Visualisasi hasil analisis dari pgRouting
sangat penting untuk memahami dan menyajikan informasi rute. Anda bisa memakai perangkat lunak GIS desktop atau memanfaatkan library peta di aplikasi web.
Menggunakan GIS Desktop (misal QGIS)
QGIS adalah aplikasi GIS desktop open-source yang gratis dan bisa langsung terhubung dengan basis data PostgreSQL/PostGIS, termasuk hasil-hasil dari pgRouting
.
- Buka QGIS.
- Pilih menu Layer > Data Source Manager.
- Pilih PostGIS di menu kiri.
- Klik New untuk membuat koneksi database baru.
- Isi detail koneksi PostgreSQL ServBay Anda (misal: Host:
localhost
, Port:5432
, Database:servbay_geo_db
, User:servbay
, Password: password PostgreSQL Anda) dan klik "Test Connection" untuk memeriksa. - Jika koneksi berhasil, tabel-tabel database seperti
ways
danways_vertices_pgr
akan muncul. - Pilih tabel atau view yang ingin ditampilkan (misal view hasil kueri rute terpendek), lalu klik Add untuk menambahkannya ke peta QGIS.
Visualisasi di Aplikasi Web (Leaflet atau OpenLayers)
Untuk web, Anda memerlukan backend (misal PHP, Node.js, Python di ServBay) untuk menjalankan kueri pgRouting
dan mengembalikan hasil (biasanya format GeoJSON) ke frontend. Di frontend, Anda bisa memakai Leaflet atau OpenLayers untuk menampilkan data tersebut.
Berikut struktur HTML dasar untuk menambahkan garis polyline statis di Leaflet. Untuk visualisasi dinamis, lakukan:
- Jalankan kueri
pgRouting
di backend. - Konversi hasil geometri dari database menjadi GeoJSON.
- Siapkan endpoint API untuk mengirim GeoJSON ke frontend.
- Di frontend JavaScript, gunakan
L.geoJSON
untuk menampilkan data.
html
<!DOCTYPE html>
<html>
<head>
<title>Contoh Visualisasi Web pgRouting ServBay</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
<style>
#map { height: 600px; width: 100%; } /* Mengatur ukuran tampilan peta */
</style>
</head>
<body>
<h1>Visualisasi Hasil pgRouting ServBay</h1>
<div id="map"></div>
<script>
// Inisialisasi peta di posisi tengah area contoh
var map = L.map('map').setView([39.906, 116.409], 14);
// Tambahkan peta dasar OpenStreetMap
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
}).addTo(map);
// Contoh data GeoJSON hasil dari pgRouting (statis)
// Dalam aplikasi nyata, geojsonData diambil dari backend via AJAX
var geojsonData = {
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {
"id": 1,
"cost": 1.0
},
"geometry": {
"type": "LineString",
"coordinates": [
[116.4074, 39.9042],
[116.4084, 39.9052]
]
}
},
{
"type": "Feature",
"properties": {
"id": 2,
"cost": 1.0
},
"geometry": {
"type": "LineString",
"coordinates": [
[116.4084, 39.9052],
[116.4094, 39.9062]
]
}
},
{
"type": "Feature",
"properties": {
"id": 3,
"cost": 1.0
},
"geometry": {
"type": "LineString",
"coordinates": [
[116.4094, 39.9062],
[116.4104, 39.9072]
]
}
}
]
};
// Tambahkan GeoJSON ke peta Leaflet
L.geoJSON(geojsonData, {
style: function (feature) {
return {color: "#ff0000", weight: 4}; // Tampilkan rute dengan garis merah tebal
}
}).addTo(map);
// Atur view agar mencakup semua fitur
if (L.geoJSON(geojsonData).getBounds().isValid()) {
map.fitBounds(L.geoJSON(geojsonData).getBounds());
}
</script>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
Simpan file HTML di direktori root website ServBay Anda (misal /Applications/ServBay/www/pgrouting-demo/index.html
) dan buka melalui ServBay (misal http://pgrouting-demo.servbay.demo
) untuk melihat pemetaan jalur contoh. Perhatian: ini hanya contoh statis untuk memperlihatkan integrasi GeoJSON ke Leaflet.
Hal yang Perlu Diperhatikan
- Kualitas Data: Hasil dari
pgRouting
sangat tergantung pada kualitas data jaringan jalan yang Anda gunakan. Pastikan data bersih, lengkap, dan struktur topologi sudah benar. - Performa: Untuk jaringan jalan berskala besar, proses perhitungan rute bisa memakan waktu atau sumber daya. Gunakan indeks, sederhanakan jaringan, atau pilih algoritma yang lebih efisien bila perlu.
- Kapasitas Memori: Topologi besar membutuhkan memori besar juga. Pastikan server basis data Anda punya resource memadai.
Tanya Jawab (FAQ)
T: Saya mendapat error "extension does not exist" saat menjalankan CREATE EXTENSION pgrouting;
, apa solusinya?
J: Pastikan dulu paket PostgreSQL sudah terpasang dan berjalan di ServBay. Cek juga versi database yang digunakan sudah mendukung pgRouting, serta pastikan paket distribusi PostgreSQL di ServBay memang mencakup ekstensi pgRouting (umumnya sudah termuat). Jika masalah tetap terjadi, cek file log ServBay/PostgreSQL untuk detail error. Selalu gunakan user dengan hak akses cukup (misal user servbay
).
T: Bagaimana memilih nilai toleransi (tolerance) pada fungsi pgr_createTopology
?
J: Nilai tolerance disesuaikan dengan ketelitian data geospasial Anda. Tolerance menentukan dua titik yang dianggap node sama jika jaraknya di bawah nilai tersebut. Untuk data GPS akurat, tolerance bisa sangat kecil (misal 0.000001 atau kurang). Data tidak akurat atau dari berbagai sumber, gunakan tolerance agak besar. Jangan terlalu besar agar segmen tidak tersambung salah.
T: Bagaimana menangani jalan satu arah atau larangan putar balik?
J: Atur nilai kolom cost
dan reverse_cost
di tabel ways
. Untuk jalan satu arah, set reverse_cost
ke NULL
atau nilai besar agar tidak dapat dilewati. Untuk aturan lalu lintas yang lebih kompleks seperti larangan putar balik, hal ini biasanya memerlukan pemodelan jalan dan rule yang lebih detail serta bisa diakomodasi oleh pengaturan advance di pgRouting.
Kesimpulan
Dengan ServBay, menyiapkan basis data PostgreSQL yang mendukung pgRouting
di lingkungan pengembangan lokal menjadi proses yang cepat dan sederhana. Anda cukup mengaktifkan ekstensi dengan perintah SQL, menyiapkan data jaringan jalan dan topologinya, lalu memanfaatkan algoritma rute geospasial dari pgRouting
sesuai kebutuhan. Dengan bantuan tools GIS desktop atau library pemetaan web, visualisasi hasil rute juga menjadi mudah. ServBay mengurangi kompleksitas pengaturan lingkungan sehingga Anda dapat fokus mengembangkan logika aplikasi dan fungsionalitas geospasial dengan lebih efisien.