استخدام pgRouting في ServBay لتحليل المسارات الجغرافية المكانية
يعد pgRouting
إضافة قوية لقواعد بيانات PostgreSQL وPostGIS، حيث يوفّر مجموعة واسعة من وظائف تحليل المسارات والشبكات للبيانات الجغرافية المكانية. باستخدام pgRouting
، يمكن للمطورين تنفيذ استعلامات معقدة على بيانات شبكة الطرق، مثل إيجاد أقصر مسار بين نقطتين، أو حل مسألة البائع المتجول (TSP)، أو إجراء تحليل نطاق الخدمة. هذه الميزات مهمة جداً عند تطوير تطبيقات الخرائط، تخطيط اللوجستيات، وتحليل حركة النقل وغيرها من السيناريوهات.
يستعرض هذا المقال بالتفصيل كيفية تفعيل إضافة pgRouting
على قاعدة بيانات PostgreSQL في بيئة ServBay المحلية بسهولة، مع توضيح خطوات الإعداد الأساسية وتنفيذ تحليلات المسارات.
نظرة عامة
يوفّر ServBay بيئة تطوير محلية متكاملة وسهلة على macOS للمطورين، ويتضمن مسبقاً العديد من خوادم الويب وقواعد البيانات ولغات البرمجة. حزمة PostgreSQL في ServBay تأتي مثبت بها بالفعل إضافتي pgRouting
وPostGIS
. هذا يعني أنك لن تحتاج لتحميل أو تجميع هذه الإضافات يدوياً؛ يكفي تمكينها في قاعدة بياناتك والبدء الفوري باستخدامها.
المتطلبات الأساسية
قبل البدء باستخدام pgRouting
، تأكد من توفر ما يلي:
- تثبيت ServBay وتشغيله: إذا لم يكن ServBay مثبتاً لديك، قم بزيارة الموقع الرسمي لـ ServBay لتحميل وتثبيت أحدث نسخة.
- تثبيت وتشغيل حزمة PostgreSQL داخل ServBay: من خلال واجهة تطبيق ServBay، تحقق من أن حزمة PostgreSQL مثبتة في وضعية "تشغيل".
- فهم أساسيات SQL وPostgreSQL: يفترض هذا الدليل أن لديك معرفة عملية بأساسيات استعلامات SQL واستخدام PostgreSQL.
- معرفة أساسيات PostGIS: تعتمد إضافة
pgRouting
علىPostGIS
لمعالجة الأنواع والوظائف الجغرافية المكانية. تأكد أن إضافةPostGIS
مفعلة داخل قاعدة بياناتك. حزمة PostgreSQL في ServBay غالباً ما تتضمن PostGIS تلقائياً.
تثبيت وتفعيل إضافة pgRouting
حزمة ServBay تجهز ملفات إضافة pgRouting
مسبقاً، وكل ما تحتاجه هو تفعيلها في قاعدة البيانات المرغوب استخدامها فيها.
الاتصال بقاعدة بيانات PostgreSQL:
توجد عدة طرق للاتصال بقاعدة البيانات، مثل أداة السطر الأوامر
psql
، أو أدوات رسومية (مثل pgAdmin, DBeaver) أو مكتبات الاتصال البرمجية.استخدام أداة
psql
المقدمة ضمن ServBay هو الخيار الأكثر مباشرة. يمكنك فتح نافذة طرفية معدّة بالمتغيرات البيئية الصحيحة من خلال زر "Terminal" في واجهة ServBay، أو إضافة مسار bin الخاص بـ ServBay إلى متغير PATH في النظام يدوياً.في الطرفية، استخدم الأمر التالي للاتصال بقاعدة البيانات المرغوبة (مثلاً قاعدة بيانات باسم
servbay_geo_db
باستخدام المستخدم الافتراضيservbay
):bashpsql -U servbay -d servbay_geo_db
1إذا كانت بيانات قاعدة البيانات أو المستخدم أو كلمة السر لديك مختلفة، رجاءً عدل الأمر بما يناسبك.
التحقق من تفعيل إضافة PostGIS (في حال عدم تفعيلها):
تعتمد
pgRouting
علىPostGIS
. قبل تفعيل pgRouting، تأكد أن PostGIS مفعلة عبر الأمر التالي في محث psql:sqlCREATE EXTENSION IF NOT EXISTS postgis;
1ينشئ هذا الأمر إضافة PostGIS إذا لم تكن مفعلة مسبقاً، أو يتجاوز التفعيل إن كانت موجودة بالفعل.
إنشاء إضافة pgRouting:
ضمن نفس الاتصال بقاعدة البيانات، نفذ الأمر التالي لإنشاء إضافة pgRouting:
sqlCREATE EXTENSION pgrouting;
1إذا جرى التفعيل بنجاح سترى رسالة مشابهة لـ
CREATE EXTENSION
.التحقق من التثبيت:
يمكنك التأكد من نجاح تفعيل pgRouting عبر عرض قائمة الإضافات المثبتة:
sql\dx
1يجب أن تظهر في القائمة كل من
postgis
وpgrouting
مع المعلومات الخاصة بهما.
إعداد pgRouting: تجهيز بيانات الشبكة وإنشاء الطوبولوجيا
تتطلب خوارزميات pgRouting
وجود جدول يمثل هيكل شبكة الطرق. عادةً يكون هذا الجدول يضم المقاطع (الطرق) مع نقطة البداية والنهاية وكل مقطع يحتوي وزناً (مثل المسافة أو الزمن). لتحليل المسارات بكفاءة، من الضروري بناء طوبولوجيا تُعرّف كيفية اتصال المقاطع (العُقد).
إنشاء جدول بيانات شبكة الطرق
يوضح المثال التالي كيفية إنشاء جدول باسم ways
لتخزين بيانات شبكة الطرق. يحتوي الجدول على معرف كل مقطع، معرف العقدة المصدر، العقدة الهدف، تكاليف الاتجاهين (cost وreverse_cost)، بالإضافة إلى الشكل الهندسي للمقطع باستخدام صنف PostGIS GEOMETRY.
-- إنشاء جدول لتخزين بيانات شبكة الطرق
CREATE TABLE ways (
id SERIAL PRIMARY KEY, -- معرف فريد للمقطع الطرقي
source INTEGER, -- معرف العقدة البادئة
target INTEGER, -- معرف العقدة النهائية
cost DOUBLE PRECISION, -- تكلفة المرور بالمقطع (مثلاً: المسافة أو الزمن)
reverse_cost DOUBLE PRECISION, -- تكلفة الاتجاه المعاكس
geom GEOMETRY(LineString, 4326) -- الشكل الهندسي للمقطع، باستخدام نوع LineString والنظام المرجعي 4326 (WGS 84)
);
2
3
4
5
6
7
8
9
توضيح:
SERIAL PRIMARY KEY
: توليد تلقائي لمعرف فريد لكل مقطع.source
,target
: يعبّران عن نقطة البداية والنهاية للمقطع ضمن الطوبولوجيا.cost
,reverse_cost
: تحدد وزن المرور لكل اتجاه. في حالة الشوارع ذات الاتجاه الواحد، ضعreverse_cost
كـ NULL أو قيمة كبيرة جداً.geom
: يخزّن الهندسة المكانية باستخدام نوع PostGIS LineString بنظام الإحداثيات العالمي WGS 84.
إدخال بيانات نموذجية
يمكنك إضافة بيانات مقاطع طرق نموذجية إلى جدول ways كالتالي:
-- إدخال بيانات نموذجية لمقاطع شبكة الطرق
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));
2
3
4
5
توضيح:
ST_MakePoint(x, y)
: ينشئ نقطة جغرافية باستخدام خطوط الطول والعرض.ST_MakeLine(point1, point2)
: ينشئ مقطعاً خطياً بين نقطتين.ST_SetSRID(geometry, srid)
: يحدد النظام المرجعي للهندسة.- البيانات هنا تمثل ثلاثة مقاطع متصلة بمنطقة نموذجية في بكين، جميعها بتكلفة 1.0.
إنشاء الطوبولوجيا
بعد تجهيز بيانات الشبكة، استخدم دالة pgr_createTopology
لإنشاء الطوبولوجيا. تقوم الدالة بتحليل المقاطع الهندسية وتحديد العُقد وتعبئة أعمدة source
وtarget
في الجدول، بالإضافة إلى إنشاء جدول جديد للعُقد (عادةً باسم [اسم_الجدول]_vertices_pgr
).
-- إنشاء الطوبولوجيا لبيانات الشبكة
-- المعلمات:
-- 'ways': اسم الجدول
-- 0.00001: قيمة التسامح؛ المسافة التي يعتبر فيها نقطتين "عقدة واحدة"
-- 'geom': اسم عمود الهندسة
-- 'id': اسم عمود المعرف
SELECT pgr_createTopology('ways', 0.00001, 'geom', 'id');
2
3
4
5
6
7
توضيح:
pgr_createTopology
: دالة أساسية فيpgRouting
لإنشاء نموذج الشبكة من عُقد ومقاطع.- قيمة التسامح تحدد كم يجب أن يكون قرب النقطتين ليعتبرا نفس العقدة؛ يعتمد الاختيار الصحيح على دقة بياناتك.
بعد التنفيذ، ستمتلئ أعمدة source
وtarget
تلقائياً، ويُنشأ جدول جديد باسم ways_vertices_pgr
يضم جميع العُقد الهندسية.
استخدام pgRouting لتحليل المسارات
بعد إنشاء الطوبولوجيا، يمكنك استخدام خوارزميات pgRouting
المختلفة للتحليلات. فيما يلي بعض الأمثلة لأكثر الخوارزميات شيوعاً.
تحليل أقصر مسار (خوارزمية Dijkstra)
يعتبر العثور على أقصر مسار بين عقدتين من أكثر الاستخدامات شيوعاً. يوفر pgRouting
دالة لخوارزمية Dijkstra.
-- استعلام عن أقصر مسار بين العقدتين 1 و4
-- المعلمات:
-- 'SELECT id, source, target, cost FROM ways': استعلام يُعيد بيانات الشبكة
-- 1: معرف العقدة البادئة
-- 4: معرف العقدة النهائية
-- directed := true: يحدد ما إذا كانت الشبكة موجهة (قيم cost وreverse_cost مختلفة)
SELECT seq, id1 AS node, id2 AS edge, cost, geom
FROM pgr_dijkstra(
'SELECT id, source, target, cost FROM ways',
1, -- معرف العقدة البادئة
4, -- معرف العقدة النهائية
directed := true -- لإهمال التكلفة المعاكسة ضعها false أو احذفها
)
JOIN ways ON edge = ways.id; -- الربط مع جدول ways للحصول على البيانات الهندسية
2
3
4
5
6
7
8
9
10
11
12
13
14
توضيح:
pgr_dijkstra
: ينفذ خوارزمية Dijkstra لأقصر مسار.- المعامل الأول استعلام SQL يرجع بيانات المقاطع (يجب أن يتضمن id, source, target, cost).
- المعامل الثاني والثالث: معرفات البداية والنهاية.
- الربط مع جدول ways للحصول على بيانات الهندسة المفيدة في التصور.
مسألة البائع المتجول (Traveling Salesperson Problem - TSP)
تحل دالة TSP المسار الأدنى تكلفة لزيارة مجموعة من العُقد المحددة.
-- حل TSP لزيارة العقد 1 و2 و3 و4 بدءًا من العقدة 1
-- المعلمات:
-- 'SELECT id, x::float8 AS x, y::float8 AS y FROM ways_vertices_pgr': استعلام يُعيد العقد والكود الجغرافي
-- start_id := 1: معرف العقدة الابتدائية
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)', -- استعلام عن العقد المطلوبة
start_id := 1 -- معرف بداية المسار
);
2
3
4
5
6
7
8
9
توضيح:
pgr_tsp
: ينفذ حل مسألة البائع المتجول.- المعامل الأول: استعلام SQL يرجع id وx وy لكل عقدة، عادة من جدول ways_vertices_pgr.
- start_id يحدد العقدة الانطلاقية.
تحليل نطاق الخدمة (Driving Distance / Driving Time)
يحدد تحليل نطاق الخدمة كل المقاطع التي يمكن الوصول إليها من نقطة البداية ضمن تكلفة معينة.
-- استعلام كل المقاطع القابلة للوصول من العقدة 1 بتكلفة لا تتجاوز 2
-- المعلمات:
-- 'SELECT id, source, target, cost FROM ways': استعلام بناء الشبكة
-- 1: معرف العقدة الابتدائية
-- 2: الحد الأعلى للتكلفة
-- directed := true: لتحديد ما إذا كانت الشبكة موجهة
SELECT seq, id1 AS node, id2 AS edge, cost, geom
FROM pgr_drivingDistance(
'SELECT id, source, target, cost FROM ways',
1, -- معرف العقدة الابتدائية
2, -- الحد الأعلى للتكلفة
directed := true
)
JOIN ways ON edge = ways.id;
2
3
4
5
6
7
8
9
10
11
12
13
14
توضيح:
pgr_drivingDistance
: دالة لتحليل نطاق الخدمة.- الاستعلام الأول كما في Dijkstra.
- الثاني: العقدة الابتدائية.
- الثالث: التكلفة القصوى.
- الربط مع ways للاستفادة من بيانات الهندسة أثناء التصور.
تصور نتائج المسارات
تصور نتائج تحليل pgRouting خطوة مهمة لفهم وعرض الحلول. يمكنك استخدام برامج GIS سطحية مكتبية أو دمج مكتبات الخرائط في تطبيقات الويب.
باستخدام برامج GIS مكتبية (مثل QGIS)
يعتبر QGIS برنامج GIS مجاني ومفتوح المصدر يتيح الاتصال بقواعد بيانات PostgreSQL/PostGIS مباشرة، ويمكنه تحميل وعرض نتائج pgRouting.
- افتح QGIS.
- اختر طبقة (Layer) > إدارة مصادر البيانات (Data Source Manager).
- من القائمة الجانبية اختر PostGIS.
- اضغط على زر جديد (New) لإنشاء اتصال قاعدة بيانات جديد.
- أدخل معلومات اتصال PostgreSQL الخاصة بـ ServBay (مثال: المضيف (Host):
localhost
، المنفذ (Port):5432
، قاعدة البيانات (Database):servbay_geo_db
، المستخدم (User):servbay
، كلمة المرور (Password): كلمة سر PostgreSQL الخاصة بك). يمكنك اختبار الاتصال من زر "اختبار الاتصال". - عند نجاح الاتصال، ستجد جميع الجداول ومن ضمنها
ways
وways_vertices_pgr
. - اختر الجدول أو العرض (view) المرغوب ثم اضغط إضافة (Add) لإظهاره في QGIS.
التصور داخل تطبيق ويب (Leaflet أو OpenLayers)
في تطبيقات الويب، ستحتاج خدمة خلفية (مثلاً PHP، Node.js، Python عادة تديرها داخل ServBay) لتنفيذ استعلامات pgRouting وتمرير النتائج (عادة كـ GeoJSON) للواجهة الأمامية التي تستخدم مكتبة خرائط كـ Leaflet أو OpenLayers.
يوضح المثال التالي هيكل صفحة HTML لعرض مسار خطي ثابت باستخدام Leaflet. لعرض مسارات ديناميكية:
- نفّذ استعلامات pgRouting في الخلفية.
- حول النتائج إلى تنسيق GeoJSON.
- تبادل GeoJSON مع الواجهة الأمامية عبر API.
- استخدم Leaflet أو غيرها لإضافة GeoJSON وعرضه.
<!DOCTYPE html>
<html>
<head>
<title>مثال عرض ويب لمسارات 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%; } /* تعيين أبعاد وعاء الخريطة */
</style>
</head>
<body>
<h1>تصور نتائج pgRouting في ServBay</h1>
<div id="map"></div>
<script>
// تهيئة الخريطة مع المركز والتكبير الافتراضي
var map = L.map('map').setView([39.906, 116.409], 14); // مركز بيانات المثال
// إضافة طبقة 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);
// مثال على إضافة بيانات GeoJSON ثابتة للعرض
// في التطبيق الحقيقي، يتم جلب هذه البيانات 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]
]
}
}
]
};
// إضافة GeoJSON للخريطة مع تحديد النمط
L.geoJSON(geojsonData, {
style: function (feature) {
return {color: "#ff0000", weight: 4}; // إظهار المسار باللون الأحمر
}
}).addTo(map);
// ضبط نطاق الرؤية لاحتواء كل العناصر
if (L.geoJSON(geojsonData).getBounds().isValid()) {
map.fitBounds(L.geoJSON(geojsonData).getBounds());
}
</script>
</body>
</html>
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
91
احفظ ملف HTML أعلاه في مجلد الموقع ضمن ServBay الخاص بك (مثلاً /Applications/ServBay/www/pgrouting-demo/index.html
)، ثم افتحه من خلال ServBay (مثال: http://pgrouting-demo.servbay.demo
) لمشاهدة مثال توضيحي لخريطة تعرض مسار نموذجي. لاحظ أنه مثال ثابت، والغرض منه إظهار كيفية دمج GeoJSON مع Leaflet.
ملاحظات هامة
- جودة البيانات: تعتمد دقة نتائج pgRouting بشكل كبير على جودة بيانات شبكة الطرق المدخلة. تأكد من أن البيانات دقيقة وشاملة ومنظمة طوبولوجياً.
- الأداء: تحليل شبكات كبيرة قد يكون بطيئاً. يفضل استخدام فهارس مناسبة، أو تبسيط الشبكة، أو اختيار خوارزميات أكثر كفاءة عند الحاجة.
- استهلاك الذاكرة: الطوبولوجيا الكبيرة قد تحتاج لذاكرة ضخمة. تأكد من وجود موارد كافية على الخادم.
الأسئلة الشائعة (FAQ)
س: ظهرت لي رسالة خطأ عند تنفيذ CREATE EXTENSION pgrouting;
تفيد بأن الإضافة غير موجودة، فما العمل؟
ج: تحقق أولاً من تثبيت وتشغيل حزمة PostgreSQL ضمن ServBay. ثم تأكد أن إصدار قاعدة البيانات يدعم pgRouting وأن النسخة المثبتة في ServBay تشتمل على الإضافة (ServBay غالباً يضمن ذلك). إذا استمر الخطأ، افحص سجلات ServBay أو PostgreSQL لمزيد من التفاصيل. كما ينصح بالاتصال بقاعدة البيانات باستخدام مستخدم يمتلك الصلاحيات الكافية (مثل المستخدم servbay
).
س: كيف أختار قيمة التسامح (tolerance) لدالة pgr_createTopology
؟
ج: يعتمد ذلك على دقة بياناتك الجغرافية. قيمة التسامح تحدد أقل مسافة بين رأسين يعتبران نفس العقدة. إذا كانت البيانات دقيقة (مثل استخدام GPS)، استعمل قيمة صغيرة مثل 0.000001. إذا كانت أقل دقة أو من مصادر متعددة، قد تختار قيمة أكبر قليلاً لضمان الاتصال، مع الانتباه أن القيم الكبيرة قد تربط مقاطع غير مرتبطة بالخطأ.
س: كيف أتعامل مع الشوارع ذات الاتجاه الواحد أو ممنوعات الدوران والالتفاف؟
ج: عمودا cost
وreverse_cost
في جدول ways مصممان لذلك. بالنسبة للشوارع ذات الاتجاه الواحد، عيّن reverse_cost
إلى NULL أو لقيمة كبيرة جداً (أي غير مسموح بالمرور). أما الحركات المحظورة، فغالباً تحتاج نموذج شبكة أكثر تعقيداً أو معالجة إضافية بعد الاستعلام. توفر pgRouting أيضاً وظائف مطورة للتعامل مع مثل هذه الحالات.
الخلاصة
تسهل ServBay على المطورين إعداد قاعدة بيانات PostgreSQL مزودة بـ pgRouting
محلياً في بيئة تطويرهم. عبر أوامر SQL بسيطة، يمكنك تمكين الإضافة وتجهيز بيانات شبكتك وإنشاء الطوبولوجيا اللازمة، لتستفيد من قوة خوارزميات تحليل المسارات الجغرافية. وعبر ربط النتائج بأدوات GIS المكتبية أو مكتبات رسم الخرائط الويب، تستطيع تصور نتائج التحليلات ودعم تطبيقاتك أو مشاريعك الجغرافية بكفاءة. ServBay تبسط تعقيدات الإعداد وتتيح لك التركيز على منطق التطوير والوظائف بقوة ومرونة.