ServBay'de pgRouting ile Coğrafi Rota Analizi
pgRouting
, PostgreSQL ve PostGIS veritabanları için güçlü bir eklenti olup, coğrafi veriler üzerinde kapsamlı rota ve ağ analizi yetenekleri sunar. pgRouting
sayesinde geliştiriciler, yol ağı verileri üzerinde karmaşık sorgular gerçekleştirebilir; örneğin iki nokta arasındaki en kısa yolu bulabilir, gezgin satıcı problemi (TSP) çözebilir veya servis alanı (servis bölgesi) analizi yapabilirler. Bu işlevler harita tabanlı uygulama geliştirme, lojistik planlama, ulaşım analizi gibi birçok senaryoda oldukça faydalıdır.
Bu rehberde, ServBay adlı yerel web geliştirme ortamında PostgreSQL veritabanınız için pgRouting
eklentisini nasıl kolaylıkla etkinleştireceğiniz ve temel yapılandırma ile rota analizi işlemlerini nasıl gerçekleştireceğiniz adım adım açıklanacaktır.
Genel Bakış
ServBay, macOS üzerinde geliştiricilere çeşitli web sunucuları, veritabanları ve programlama dilleri önceden entegre edilmiş hepsi bir arada kolay bir yerel geliştirme ortamı sunar. ServBay’in PostgreSQL paketiyle birlikte pgRouting
ve PostGIS
eklentileri de gelir. Bu sayede eklentileri manuel olarak indirip derlemenize gerek kalmadan, yalnızca veritabanınızda etkinleştirerek doğrudan kullanabilirsiniz.
Ön Koşullar
pgRouting
kullanmaya başlamadan önce aşağıdaki koşulları sağladığınızdan emin olun:
- ServBay Kurulu ve Çalışıyor Olmalı: Eğer ServBay yüklü değilse ServBay Resmi Sitesini ziyaret ederek en son sürümü indirip kurun.
- ServBay’de PostgreSQL Paketi Kurulu ve Başlatılmış: ServBay uygulamasında PostgreSQL paketinin kurulu ve “Çalışıyor” durumunda olduğundan emin olun.
- Temel SQL ve PostgreSQL Bilgisi: Bu rehber, PostgreSQL ve SQL sorgularının temel kullanımına aşina olduğunuzu varsayar.
- PostGIS Hakkında Bilgi:
pgRouting
, coğrafi veri türleri ve işlevlerini sağlamak içinPostGIS
’e bağımlıdır. VeritabanınızdaPostGIS
eklentisinin etkinleştirildiğinden emin olun. ServBay ile gelen PostgreSQL paketi genellikle PostGIS ile birlikte gelir.
pgRouting Eklentisinin Kurulumu ve Etkinleştirilmesi
ServBay, pgRouting
eklenti dosyalarını sizin için hazırlar; tek yapmanız gereken, kullanmak istediğiniz belirli veritabanında eklentiyi etkinleştirmek olacaktır.
PostgreSQL Veritabanına Bağlantı:
PostgreSQL veritabanına bağlanmak için farklı yöntemler kullanabilirsiniz; komut satırı aracı
psql
, grafiksel araçlar (ör. pgAdmin, DBeaver) veya programlama dilleri için istemci kütüphaneleri gibi.ServBay’in sağladığı
psql
komut satırı aracı ile bağlanmak genellikle en hızlı ve doğrudan yöntemdir. ServBay uygulamasındaki “Terminal” butonu ile uygun ortam değişkenleriyle hazır bir terminal penceresi açabilir veya ServBay’in bin klasörünü sistem PATH’inize elle ekleyebilirsiniz.Terminalde hedef veritabanınıza (örneğin
servbay_geo_db
adlı veritabanı, varsayılanservbay
kullanıcısı ile) şu komutla bağlanabilirsiniz:bashpsql -U servbay -d servbay_geo_db
1Eğer veritabanı adı, kullanıcı adı veya şifreniz farklıysa, komutu uygun şekilde düzenleyin.
PostGIS Eklentisini Kontrol Edin ve Etkinleştirin (Daha Önce Aktif Değilse):
pgRouting
içinPostGIS
gereklidir. Etkin değilse öncelikle PostGIS’i aktif hale getirin.psql
istemcisinde şunu yazın:sqlCREATE EXTENSION IF NOT EXISTS postgis;
1Bu komut, PostGIS eklentisini zaten varsa atlar, yoksa oluşturur.
pgRouting Eklentisini Oluşturun:
Aynı veritabanı bağlantısı içinden aşağıdaki SQL komutuyla
pgRouting
eklentisini kurun:sqlCREATE EXTENSION pgrouting;
1Başarılıysa,
CREATE EXTENSION
benzeri bir çıktı göreceksiniz.Kurulumu Doğrulayın:
Yüklü eklentileri listeleyerek
pgRouting
’in başarıyla etkinleştirildiğinden emin olabilirsiniz:sql\dx
1Çıktıda
postgis
vepgrouting
eklentilerinin bulunduğunu görmelisiniz.
pgRouting Yapılandırması: Yol Ağı Verisi ve Topoloji Oluşturma
pgRouting
algoritmaları, bir yol ağını temsil eden tablo üzerinde çalışır. Genellikle bu tablo, her bir yol kesimi (segmenti) için başlangıç ve bitiş noktası ile ağırlık (mesafe, süre vb.) bilgilerini içerir. Rota hesaplamalarını verimli yapmak için, ayrıca bu kesimlerden bir “topoloji” (yani yol kesimi arasındaki bağlantı) oluşturmak gerekir.
Yol Ağı Veri Tablosunun Oluşturulması
Aşağıda, yol ağı verisini saklamak için kullanılabilecek örnek bir ways
tablosunun oluşturulması gösteriliyor. Tablo, yol kesiminin ID'si, kaynak düğüm ID'si, hedef düğüm ID'si, ileri ve geri yönde seyahat maliyeti (cost
, reverse_cost
) ile PostGIS’in GEOMETRY veri tipiyle yolun geometri bilgisini içerir.
sql
-- Yol ağı verisi için tablo oluşturma
CREATE TABLE ways (
id SERIAL PRIMARY KEY, -- Yol segmenti için benzersiz tanımlayıcı
source INTEGER, -- Başlangıç düğüm ID'si
target INTEGER, -- Bitiş düğüm ID'si
cost DOUBLE PRECISION, -- Yol segmentinin ileri yöndeki maliyeti (örn: mesafe, süre)
reverse_cost DOUBLE PRECISION, -- Yolun ters yönündeki maliyeti
geom GEOMETRY(LineString, 4326) -- Yol segmentinin geometrisi, LineString tipi ve SRID 4326 (WGS 84)
);
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
Açıklama:
SERIAL PRIMARY KEY
: Yol segmenti için otomatik artan benzersiz bir ID üretir.source
,target
: Segmentin ağdaki başlangıç ve bitiş düğüm ID’si. Bunlar topolojinin oluşturulması sırasında otomatik atanır/ilişkilenir.cost
,reverse_cost
: Yol üzerinden geçişin maliyeti. Eğer yol tek yönlü isereverse_cost
aynı değerden farklı, ya da geçilmeyecekseNULL
veya çok büyük bir değer olabilir.geom
: Yolun geometrisini PostGIS’inGEOMETRY
tipiyle saklar.LineString
=doğrusal yol,4326
WGS 84 küresel koordinat sistemi (GPS).
Örnek Veri Ekleme
ways
tablosuna örnek birkaç yol segmenti ekleyebilirsiniz:
sql
-- Örnek yol segmentleri ekleme
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
Açıklama:
ST_MakePoint(x, y)
: Belirtilen koordinatlarla nokta (Point) objesi oluşturur.ST_MakeLine(point1, point2)
: İki nokta arasında çizgi (LineString) oluşturur.ST_SetSRID(geometry, srid)
: Geometriye uzamsal referans (SRID) atar.- Örnek veriyle Beijing'in bir bölgesinde üç yol segmenti ve hepsi 1.0 maliyetli olarak tanımlanmıştır.
Topolojinin Oluşturulması
Yol ağı tablo verisi hazır olduğunda, pgr_createTopology
fonksiyonu ile topoloji oluşturulur. Bu fonksiyon, yol segmentlerinin geometrisini analiz ederek, bağlantı noktalarını (düğümleri) tanımlar ve tabloya source
ile target
alanlarını doldurur; ayrıca yeni bir düğüm tablosu (genellikle [tablo_adı]_vertices_pgr
) yaratır.
sql
-- Yol ağına topoloji oluştur
-- Parametreler:
-- 'ways': Topolojisi oluşturulacak tablo adı
-- 0.00001: Tolerans değeri; iki noktanın aynı düğüm olup olmadığını belirler
-- 'geom': Geometri bilgisinin bulunduğu sütun
-- 'id': Yol ID'sinin bulunduğu sütun
SELECT pgr_createTopology('ways', 0.00001, 'geom', 'id');
1
2
3
4
5
6
7
2
3
4
5
6
7
Açıklama:
pgr_createTopology
:pgRouting
’in temel fonksiyonlarından biridir, ağın düğüm-kenar (node-edge) modelini oluşturur.- Tolerans değeri, iki ucun aynı düğüm olarak kabul edilmesi için aralarındaki azami mesafeyi belirler. Değerin seçiminde veri hassasiyeti ve ölçeği dikkate alınmalıdır.
Bu fonksiyon çalıştırıldığında, ways
tablosundaki source
ve target
sütunları güncellenecek ve tablonun yanında bir de ways_vertices_pgr
adında tüm düğümlerin ve koordinatlarının bulunduğu yeni bir tablo oluşturulacaktır.
pgRouting ile Rota Analizi
Bir kez topoloji oluşturulduktan sonra pgRouting
’in sunduğu çeşitli algoritmalarla rota analizi yapabilirsiniz. Aşağıda sık kullanılan bazı algoritma örnekleri yer almaktadır.
En Kısa Yol Analizi (Dijkstra)
İki düğüm arasındaki en kısa yolu bulmak genellikle en yaygın rota ihtiyaçlarındandır. pgRouting
, Dijkstra algoritmasını destekler.
sql
-- Düğüm 1’den düğüm 4’e en kısa yolun sorgulanması
-- Parametreler:
-- 'SELECT id, source, target, cost FROM ways': Ağı tanımlayan veri sorgusu, mutlaka id, source, target, cost içermeli
-- 1: Başlangıç düğüm ID’si
-- 4: Hedef düğüm ID’si
-- directed := true: Ağ yönlü mü değil mi?
SELECT seq, id1 AS node, id2 AS edge, cost, geom
FROM pgr_dijkstra(
'SELECT id, source, target, cost FROM ways',
1, -- Başlangıç düğüm ID’si
4, -- Hedef düğüm ID’si
directed := true -- Eğer ters maliyetleri de hesaba katmak isterseniz, false yapılabilir
)
JOIN ways ON edge = ways.id; -- Sonuç, geometri ve diğer bilgiler için ways tablosuna join edilir
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
Açıklama:
pgr_dijkstra
: Dijkstra en kısa yol algoritmasını çalıştırır.- İlk parametre SQL sorgusu olup kenar (yol segmenti) bilgilerini döndürmeli (id, source, target, cost). Ters yönlü yol için
reverse_cost
da eklenebilir ve directed=false yapılabilir. - Diğer iki parametre, başlangıç ve bitiş düğümünün ID’sidir.
- Sonuçlar, yolların geometrisiyle birleştirilebilir; böylece analiz sonuçları haritada görselleştirilebilir.
Gezgin Satıcı Problemi (Traveling Salesperson Problem - TSP)
TSP algoritması, belirli bir dizi noktayı (düğümü) ziyaret eden en kısa veya en düşük maliyetli döngüyü bulmayı amaçlar.
sql
-- Düğümler 1, 2, 3, 4’ü ziyaret edecek TSP çözümü (başlangıç: 1)
-- Parametreler:
-- 'SELECT id, x::float8 AS x, y::float8 AS y FROM ways_vertices_pgr': Ziyaret edilecek düğümler ve koordinatları sorgusu
-- start_id := 1: Başlangıç düğüm ID’si
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)', -- Ziyaret edilecek düğümler ve koordinatları
start_id := 1 -- Başlangıç düğüm ID’si
);
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
Açıklama:
pgr_tsp
: Gezgin satıcı problemine çözüm üretir.- İlk parametre, ziyaret edilecek düğüm ID ve koordinatlarını içeren sorgudur (id, x, y). Bu veri genellikle
ways_vertices_pgr
tablosundan alınır. start_id
: Tura başlayacak düğüm ID’si.
Servis Alanı Analizi (Driving Distance / Driving Time)
Belirli bir başlangıç noktası/verilen noktalardan, verilen bir rota maliyeti (mesafe/süre) sınırı içinde hangi yol segmentlerinin veya bölgelerin erişilebilir olduğunu belirler.
sql
-- Düğüm 1’den çıkıp toplam maliyeti 2 olan tüm erişilebilir yolları bul
-- Parametreler:
-- 'SELECT id, source, target, cost FROM ways': Ağı tanımlayan sorgu
-- 1: Başlangıç düğüm ID’si
-- 2: En yüksek erişim maliyeti
-- directed := true: Ağın yönlü olup olmadığı
SELECT seq, id1 AS node, id2 AS edge, cost, geom
FROM pgr_drivingDistance(
'SELECT id, source, target, cost FROM ways',
1, -- Başlangıç düğüm ID’si
2, -- En yüksek ulaşılabilir maliyet
directed := true
)
JOIN ways ON edge = ways.id; -- Sonuç, geometriyle birleştirilebilir
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
Açıklama:
pgr_drivingDistance
: Servis alanı analizini gerçekleştirir.- İlk parametre, diğer rota algoritmalarındakine benzer şekilde bir SQL sorgusudur.
- İkinci parametre, başlangıç düğümünün ID’si.
- Üçüncü parametre, en yüksek izin verilen maliyettir (örn. mesafe/süre).
- Sonuçları harita üzerinde göstermek için JOIN ile geometri alınabilir.
Rota Sonuçlarının Görselleştirilmesi
pgRouting
analizlerinin görselleştirilmesi, rota bulgularını anlamak ve sunmak için önemlidir. Bu amaçla masaüstü CBS araçlarını veya web uygulamalarında harita kütüphanelerini kullanabilirsiniz.
Masaüstü CBS Araçlarıyla (Örn. QGIS) Görselleştirme
QGIS, PostgreSQL/PostGIS veritabanlarıyla doğrudan bağlantı kurup coğrafi verilerinizi ve pgRouting
sonuçlarını gösterebilen ücretsiz bir masaüstü CBS uygulamasıdır.
- QGIS’i açın.
- Katmanlar (Layer) > Veri Kaynağı Yöneticisi (Data Source Manager)’ı seçin.
- Sol menüde PostGIS’i seçin.
- Yeni (New) butonuyla yeni bir veritabanı bağlantısı yaratın.
- ServBay PostgreSQL bağlantı bilgilerinizi (ör: Host:
localhost
, Port:5432
, Database:servbay_geo_db
, User:servbay
, Password: PostgreSQL şifreniz) girin. "Bağlantıyı Test Et" butonuyla kontrol edebilirsiniz. - Bağlantı kurulduktan sonra, veritabanında
ways
veways_vertices_pgr
gibi tabloları görebilirsiniz. - Görüntülemek istediğiniz tabloyu veya sonucu katman olarak ekleyip haritada analizlerinizi izleyebilirsiniz.
Web Uygulamalarında Görselleştirme (Leaflet/OpenLayers)
Web uygulamaları için, arka uçta bir servis (örn. PHP, Node.js, Python; ServBay üzerinde de çalıştırabilirsiniz) ile pgRouting
sorguları çalıştırılır; sonuçlar (genellikle GeoJSON formatında) ön uca iletilir. Ön uçta ise harita kütüphanesi ile (ör. Leaflet, OpenLayers) bu coğrafi veriler gösterilir.
Aşağıda, Leaflet ile basit bir statik hattı haritaya ekleyen örnek HTML bulunmaktadır. Dinamik rota sonuçları için:
- Arka uçta
pgRouting
sorgusu çalıştırılır. - Sonuçlardaki yol geometrileri, GeoJSON veya harita kütüphanesinin desteklediği bir formata dönüştürülür.
- API yoluyla GeoJSON verisi ön tarafa sunulur.
- JavaScript’te Leaflet’in
L.geoJSON
fonksiyonu kullanılarak rota ekrana çizdirilir.
html
<!DOCTYPE html>
<html>
<head>
<title>ServBay pgRouting Web Görselleştirme Örneği</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%; } /* Harita konteynerinin boyutu */
</style>
</head>
<body>
<h1>ServBay pgRouting Sonuç Görselleştirmesi</h1>
<div id="map"></div>
<script>
// Harita nesnesini oluştur ve başlangıç koordinatlarını ayarla
var map = L.map('map').setView([39.906, 116.409], 14); // Örnek veri merkezine göre
// OpenStreetMap taban haritası ekle
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
}).addTo(map);
// Örnek: pgRouting sonucu GeoJSON verisi haritaya ekleniyor
// Gerçek uygulamada geojsonData AJAX ile arka uçtan dinamik alınacaktır
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]
]
}
}
]
};
// L.geoJSON ile haritaya veri ekleniyor
L.geoJSON(geojsonData, {
style: function (feature) {
return {color: "#ff0000", weight: 4}; // Kırmızı kalın rota çizgisi
}
}).addTo(map);
// Eklenen özelliklerin tamamını ekranda göstermek için görünüm ayarlanıyor
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
Bu HTML dosyasını ServBay sitesinin kök dizinine (ör. /Applications/ServBay/www/pgrouting-demo/index.html
) kaydedip ServBay üzerinden (ör. http://pgrouting-demo.servbay.demo
) erişebilirsiniz; örnek bir haritada rotanızı görebilirsiniz. Yalnızca statik bir örnektir, gerçek uygulamada GeoJSON dinamik olarak arka uçtan gelmelidir.
Dikkat Edilecek Hususlar
- Veri Kalitesi:
pgRouting
analiz sonuçlarının doğruluğu tamamen yol ağı verisinin kalitesine bağlıdır. Verinizin eksiksiz ve topolojik olarak doğru olduğundan emin olun. - Performans: Büyük yol ağlarında rota hesaplaması zaman alabilir. Bu durumda indeks kullanmak, ağ yapısını sadeleştirmek veya daha uygun algoritmaları değerlendirmek gerekir.
- Bellek: Geniş topolojik ağlar için yüksek bellek gerekebilir. Veritabanı sunucunuzun kaynaklarının yeterli olduğundan emin olun.
Sıkça Sorulan Sorular (SSS)
S: CREATE EXTENSION pgrouting;
komutunda "eklenti yok" hatası alıyorum, ne yapmalıyım?
C: Öncelikle ServBay’de PostgreSQL paketinin kurulu ve çalışmakta olduğunu kontrol edin. Sonra, bağlandığınız veritabanı/versiyonda pgRouting
’in desteklenip desteklenmediğini ve ServBay’in PostgreSQL paketinin bu eklentileri içerdiğini kontrol edin (ServBay genellikle içerir). Sorun devam ederse, hatayla ilgili daha ayrıntılı bilgi almak için ServBay veya PostgreSQL loglarına bakın ve veritabanına yeterli yetkilerle (servbay
kullanıcısı gibi) bağlandığınızdan emin olun.
S: pgr_createTopology
fonksiyonundaki tolerans değeri (tolerance) nasıl seçilir?
C: Tolerans, coğrafi veri doğruluğunuza göre seçilmelidir. İki düğümün aynı sayılması için aralarındaki azami mesafedir. GPS gibi yüksek hassasiyetli verilerde çok küçük bir değer (ör. 0.000001) yeterli olur. Kaynağı farklı veya daha az hassasiyette verilerde daha büyük bir değer gerekebilir. Çok büyük tolerans ilgisiz yolların yanlışlıkla birleşmesine yol açabilir.
S: Tek yön yolları veya U dönüşü yasağı gibi trafik kuralları nasıl modellenir?
C: ways
tablosundaki cost
ve reverse_cost
alanları tam olarak bu senaryoyu yönetmek için vardır. Tek yönlü yollarda ters yön için reverse_cost
sütununu NULL
ya da çok büyük bir değer yaparak geçişi engelleyebilirsiniz. U dönüşü veya benzeri kısıtlamalar için ise karmaşık yol ağı modelleri veya analiz sonrası ek işleme ihtiyacı olabilir; pgRouting
’in bu tarz gelişmiş işlevleri de mevcuttur.
Özet
ServBay sayesinde, yerel geliştirme ortamında pgRouting destekli bir PostgreSQL veritabanı kurmak oldukça kolay. Sadece birkaç SQL komutuyla eklentiyi etkinleştirebilir, yol ağınızı hazırlayıp topolojisini oluşturabilir ve ardından pgRouting’in güçlü coğrafi rota algoritmalarıyla analizlerinizi yapabilirsiniz. Masaüstü CBS yazılımları veya web harita kütüphaneleriyle de analiz sonuçlarınızı kolayca görselleştirip, web uygulamalarınız ve coğrafi projeleriniz için güçlü veri desteği sunabilirsiniz. ServBay, karmaşık ortam yapılandırmasını ortadan kaldırarak geliştiricilerin uygulama mantığı ve işlevlerine odaklanmasını sağlar.