كيفية استخدام PostGIS في ServBay: إضافة الإمكانيات المكانية لـ PostgreSQL
إضافة PostGIS
هي توسعة قوية لقاعدة بيانات PostgreSQL، حيث تضيف دعمًا لأنواع البيانات المكانية والدوال والمؤشرات. هذا يعني أنك قادر على تخزين معلومات جغرافية كالنقاط، الخطوط، المضلعـات، وغيرها ضمن قاعدة البيانات، بالإضافة لتنفيذ استعلامات وتحليلات مكانية معقدة. بالنسبة للمطورين الذين يحتاجون التعامل مع الخرائط أو خدمات المواقع أو أي تطبيق ويب يعتمد على الموقع الجغرافي، فإن PostGIS أداة لا غنى عنها.
ServBay، المصمم خصيصًا لنظام macOS كبيئة تطوير ويب محلية، يأتي متكاملًا مع حزمة PostgreSQL، كما يتم تثبيت إضافة PostGIS معه بشكل افتراضي. هذا يبسط عملية استخدام PostGIS محليًا دون الحاجة لتجميع أو تثبيت اعتمادات بشكل يدوي.
في هذا المقال سنوضح بالتفصيل كيف يمكنك تفعيل والبدء باستخدام PostGIS في بيئة ServBay، لمساعدتك في إضافة ميزات البيانات المكانية إلى مشروعك بسرعة.
المتطلبات الأساسية
قبل استخدام PostGIS، تأكد من إتمام المتطلبات التالية:
- تثبيت وتشغيل ServBay: تأكد من أن صب ServBay مثبّت ويعمل بنجاح على نظام macOS.
- تفعيل وتشغيل حزمة PostgreSQL: ضمن لوحة تحكم ServBay، تحقق أن حزمة PostgreSQL مفعلة وحالتها Running. إذا لم تكن مفعلة، ابحث عنها في لوحة ServBay، فعلها، ثم ابدأ تشغيلها.
- الوصول إلى قاعدة بيانات PostgreSQL: تعلّم كيفية الاتصال بقاعدة بيانات PostgreSQL التي تعمل ضمن ServBay عبر أداة الأوامر
psql
أو عبر واجهة رسومية مثل TablePlus أو pgAdmin. افتراضيًا، يمكنك الاتصال عبرpsql -U postgres
.
تثبيت وتفعيل إضافة PostGIS
ServBay يأتي مجهزًا بكل ملفات PostGIS اللازمة، ولا تحتاج لتحميلها يدويًا. كل ما عليك هو "تفعيل" هذه الإضافة في قاعدة البيانات التي تريد استخدام PostGIS فيها.
إليك خطوات تفعيل إضافة PostGIS:
الاتصال بقاعدة البيانات المستهدفة: افتح تطبيق الطرفية، واستخدم أمر
psql
للاتصال بقاعدة بياناتك. استبدلyour_username
باسم مستخدم قاعدة البيانات الخاص بك (مثال:postgres
) وyour_database
باسم القاعدة المستهدفة.bashpsql -U your_username -d your_database
1إذا أردت التفعيل ضمن المستخدم والقاعدة الافتراضية
postgres
، يمكنك ببساطة تنفيذ:bashpsql -U postgres
1إنشاء امتداد PostGIS في قاعدة البيانات: بعد نجاح الاتصال، نفذ الأمر SQL التالي من داخل واجهة
psql
:sqlCREATE EXTENSION postgis;
1هذا الأمر سيقوم بإعداد كل الكائنات المطلوبة لتشغيل PostGIS (أنواع بيانات جديدة، دوال، معاملات... إلخ) في القاعدة الحالية.
التحقق من تثبيت PostGIS بنجاح: ضمن واجهة
psql
، يمكنك استخدام الأمر\dx
لرؤية جميع الامتدادات المتوفرة في القاعدة.sql\dx
1إذا ظهرت إضافة
postgis
في القائمة مع الإصدار، فهذا يشير إلى تفعيلها بنجاح.List of installed extensions
1
Name | Version | Schema | Description -----------+---------+------------+-------------------------------------------------------------- plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language postgis | 3.3.2 | public | PostGIS geometry and geography spatial types and functions (2 rows) ``` (يرجى الملاحظة: رقم إصدار PostGIS قد يختلف حسب إصدار ServBay)
الآن أصبحت إضافة PostGIS مفعلة وجاهزة للاستخدام في قاعدة البيانات المحددة.
إعداد بيانات PostGIS
بعد تفعيل PostGIS، يمكنك إنشاء جداول جديدة تحتوي على بيانات مكانية، أو إضافة أعمدة مكانية (spatial columns) للجداول الموجودة. توفر PostGIS نوعين رئيسيين من الحقول المكانية: geometry
و geography
. نوع geometry
يستعمل للحسابات في نظام إحداثيات ثنائي الأبعاد، بينما geography
مناسب للعمليات على سطح الكرة (مثل سطح الأرض) وغالبًا يُستخدم لتخزين إحداثيات خطوط العرض والطول.
إنشاء جدول يحتوي على حقل مكاني
فيما يلي مثال لإنشاء جدول باسم locations
يحتوي على عمود مكاني لتخزين نقاط المواقع.
إنشاء الجدول: من خلال سطر أوامر
psql
أو بأي عميل قاعدة بيانات رسومي:sqlCREATE TABLE locations ( id SERIAL PRIMARY KEY, name VARCHAR(100), geom GEOMETRY(Point, 4326) );
1
2
3
4
5GEOMETRY(Point, 4326)
: يحدد أن العمودgeom
من نوعGEOMETRY
ويخزن نقاط (Point)، مع SRID رقم 4326 وهو معرف WGS84 المرجعي (المستخدم في أنظمة GPS وخرائط الإنترنت).- يمكنك بالطبع استخدام أنواع هندسية أخرى مثل
LineString
أوPolygon
وتغيير SRID بحسب متطلبات مشاريعك.
إدخال بيانات نموذجية: استخدم دوال PostGIS لإضافة كائنات هندسية عبر سلسلة WKT. دالة
ST_GeomFromText()
شائعة لهذا الغرض.sqlINSERT INTO locations (name, geom) VALUES ('مقر ServBay الرئيسي', ST_GeomFromText('POINT(116.4074 39.9042)', 4326)), -- مثال (بكين) ('مكتب ServBay شنغهاي', ST_GeomFromText('POINT(121.4737 31.2304)', 4326)); -- مثال (شنغهاي)
1
2
3لاحظ أن ترتيب
POINT(خط الطول خط العرض)
وفقًا لمعيار WKT.
إنشاء فهرس مكاني (Spatial Index)
إذا كان لديك الكثير من البيانات المكانية في جدولك، فإن إنشاء فهرس مكاني ضروري جدًا لتحسين أداء الاستعلامات، خصوصًا للعمليات المكانية مثل البحث بنطاق أو البحث عن الجار الأقرب. تستخدم PostGIS غالبًا فهرس GiST (Generalized Search Tree).
إنشاء فهرس GiST: يمكنك تنفيذ الأمر التالي من عميل
psql
أو أي أداة تدعم SQL:sqlCREATE INDEX idx_locations_geom ON locations USING GIST (geom);
1هذا الأمر سينشئ فهرس GiST على عمود
geom
بجدولlocations
. سيستخدم محرك PostgreSQL هذا الفهرس لتسريع الاستعلامات المكانية تلقائيًا.
استخدام PostGIS للاستعلامات المكانية
تقدم PostGIS مئات الدوال لإجراء عمليات مكانية متنوعة. فيما يلي بعض الأمثلة الشائعة التي يحتاجها مطورو الويب:
احتساب المسافة بين نقطتين
احسب المسافة الخطية بين موقعين جغرافيين:
SELECT ST_Distance(
ST_GeomFromText('POINT(116.4074 39.9042)', 4326), -- النقطة أ
ST_GeomFromText('POINT(121.4737 31.2304)', 4326) -- النقطة ب
);
2
3
4
- الدالة
ST_Distance()
: تحتسب المسافة بين كائنين هندسيين. إذا كان نوع العمودgeometry
والنظام المرجعي (SRID) هو 4326، فالنتيجة بوحدة الدرجة (ليست متر). للحصول على نتائج دقيقة بوحدة المتر، استعمل النوعgeography
أو دالةST_Distance(geography_a, geography_b, use_spheroid)
.
الاستعلام عن الاحتواء (Containment)
تحقق مما إذا كان كائن هندسي يحتوي آخر (مثال: نقطة تقع ضمن منطقة محددة):
SELECT name FROM locations
WHERE ST_Contains(
ST_GeomFromText('POLYGON((116.0 39.0, 117.0 39.0, 117.0 40.0, 116.0 40.0, 116.0 39.0))', 4326), -- مستطيل كمثال
geom
);
2
3
4
5
- الدالة
ST_Contains(geometry A, geometry B)
: تعيد true إذا كان A يغطي تمامًا B.
الاستعلام عن أقرب جار (Nearest Neighbor)
ابحث عن أقرب مكان لنقطة معينة باستخدام GiST index لتسريع البحث:
SELECT name, ST_Distance(geom, ST_GeomFromText('POINT(116.4074 39.9042)', 4326)) AS distance
FROM locations
ORDER BY geom <-> ST_GeomFromText('POINT(116.4074 39.9042)', 4326)
LIMIT 5;
2
3
4
- عامل
<->
هو عامل "المسافة" الخاص بـ PostGIS ويعمل بسرعة عالية مع GiST للعثور على أقرب الكائنات.
التحليل المكاني باستخدام PostGIS
بالإضافة للاستعلامات الأساسية، تقدم PostGIS دوال تحليلية قوية مثل إنشاء مناطق عازلة (buffer)، تقاطع الكائنات، ودمج الأشكال.
تحليل المنطقة العازلة (Buffer)
أنشئ منطقة محيطة بكائن هندسي بمسافة معينة:
SELECT ST_Buffer(geom, 0.01)
FROM locations
WHERE name = 'مقر ServBay الرئيسي';
2
3
- الدالة
ST_Buffer(geometry, distance)
: ترسم منطقة حول الكائن الهندسي بالمسافة المحددة. بالنسبة لنظام SRID 4326، المسافة بوحدة الدرجة (0.01 درجة تقريبًا = 1.1 كم).
تحليل التقاطع (Intersection)
احسب الجزء المشترك بين كائنين أو أكثر وارجع كائنًا جديدًا له:
SELECT ST_Intersection(
ST_GeomFromText('POLYGON((116.0 39.0, 117.0 39.0, 117.0 40.0, 116.0 40.0, 116.0 39.0))', 4326),
geom
)
FROM locations
WHERE name = 'مقر ServBay الرئيسي';
2
3
4
5
6
- الدالة
ST_Intersection(geometry A, geometry B)
: تعيد الجزء المتقاطع بين A وB.
تحليل الدمج (Union)
ادمج عدة كائنات هندسية في كائن واحد معقد:
SELECT ST_Union(geom)
FROM locations;
2
- الدالة
ST_Union(geometry set)
: تدمج جميع الكائنات في مجموعة واحدة.
عرض البيانات المكانية بصريًا
عرض بياناتك المكانية المخزنة في PostGIS أمر ضروري ضمن مشاريع الويب. هناك خياران شائعان:
باستخدام برامج GIS المكتبية (مثل QGIS)
QGIS هو برنامج مفتوح المصدر شائع يمكنه الاتصال مباشرة بقواعد بيانات PostGIS لعرض البيانات.
الاتصال بقواعد بيانات PostgreSQL في ServBay:
- افتح QGIS.
- من القائمة اختر
Layer
(طبقة) ->Add Layer
(إضافة طبقة) ->Add PostGIS Layers...
(إضافة طبقات PostGIS...). - في النافذة المنبثقة، اضغط على
New
(جديد) لإنشاء اتصال جديد. - أدخل بيانات الاتصال:
- Name (الاسم): مثلًا
ServBay PostGIS
. - Host (المضيف):
localhost
أو127.0.0.1
. - Port (المنفذ): عادةً
5432
(افتراضي ServBay). - Database (قاعدة البيانات): اسم قاعدة البيانات التي فعلت فيها PostGIS.
- Username (المستخدم): مثال:
postgres
. - Password (كلمة المرور): إذا كنت قد حددتها.
- Name (الاسم): مثلًا
- اضغط
Test Connection
(اختبار الاتصال) لتتأكد من نجاحه. - اضغط
OK
للحفظ ثمConnect
(اتصال).
تحميل البيانات المكانية:
- بعد نجاح الاتصال سترى جميع جداولك.
- اختر الجدول الذي يحتوي على الأعمدة المكانية (مثل
locations
). - اختر الجدول واضغط زر
Add
(إضافة) ثمClose
(إغلاق). ستظهر بياناتك على خريطة QGIS.
استخدام مكتبات الخرائط بالويب (مثل Leaflet)
يمكنك بواسطة مكتبة خرائط JavaScript مثل Leaflet (أو OpenLayers أو Mapbox GL JS) عرض بياناتك المكانية المخزنة في قاعدة البيانات على موقعك. ستحتاج للواجهة الخلفية (مثل PHP أو Node.js أو Python - كلها مدعومة في ServBay) لتحويل البيانات إلى GeoJSON ومن ثم إرسالها للواجهة الأمامية.
احفظ الملف التالي كـ HTML ضمن مجلد المواقع الخاص بك في ServBay (مثال: /Applications/ServBay/www/postgis-map/index.html
)، ثم ادخل الموقع المحلي المناظر له عبر ServBay (مثال: postgis-map.servbay.demo
):
<!DOCTYPE html>
<html>
<head>
<title>ServBay PostGIS Leaflet Example</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: 400px; width: 100%; }
</style>
</head>
<body>
<h1>مثال عرض بيانات PostGIS (Leaflet)</h1>
<div id="map"></div>
<script>
// تهيئة الخريطة وتعيين المركز ومستوى التقريب
// المركز المستخدم هنا بالقرب من بكين
var map = L.map('map').setView([39.9042, 116.4074], 10);
// إضافة طبقة OpenStreetMap
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© OpenStreetMap contributors'
}).addTo(map);
// إضافة مؤشر تجريبي (عادة ستحمل البيانات ديناميكا من PostGIS)
// الإحداثيات هنا مطابقة لمثال "مقر ServBay الرئيسي"
var marker = L.marker([39.9042, 116.4074]).addTo(map)
.bindPopup('<b>مقر ServBay الرئيسي</b><br>موقع نموذجي')
.openPopup();
// في التطبيقات الفعلية ستجلب بيانات PostGIS عن طريق AJAX وتستخدم L.geoJSON()
/*
fetch('/api/locations') // من المفترض أن يوفر السيرفر نقطة نهاية عبر /api/locations ترجع GeoJSON
.then(response => response.json())
.then(data => {
L.geoJSON(data).addTo(map);
});
*/
</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
يوضح هذا المثال الاستخدام الأساسي لـ Leaflet. لتحميل بيانات حقيقية من PostGIS يجب عليك بناء خدمة خلفية تتصل بقاعدة البيانات وتعرض البيانات بصيغة GeoJSON عبر HTTP للجهة الأمامية، وهو أمر ممكن بسهولة باستخدام ServBay.
الأسئلة المتكررة (FAQ)
س: واجهت خطأ عند تنفيذ
CREATE EXTENSION postgis;
، ما الحل؟- ج: أولًا تأكد من نجاح اتصالك بقاعدة بيانات PostgreSQL وأن الحساب الحالي يملك صلاحية إنشاء الإضافات (عادة مستخدم
postgres
). كذلك تأكد أن حزمة PostgreSQL تعمل من خلال ServBay. إذا استمرت المشكلة، تحقق من سجلات ServBay وPostgreSQL لمعلومات أكثر.
- ج: أولًا تأكد من نجاح اتصالك بقاعدة بيانات PostgreSQL وأن الحساب الحالي يملك صلاحية إنشاء الإضافات (عادة مستخدم
س: ما هو SRID 4326؟ وهل أستطيع تغيير SRID؟
- ج: SRID (معرف النظام المرجعي للإحداثيات) هو رقم يميز بشكل فريد النظام المرجعي للإحداثيات. الرقم 4326 يرمز لنظام WGS84، وهو الأكثر شيوعًا في خرائط الإنترنت. يمكنك استعمال SRID آخر كـ 3857 (مرسيتور على الويب) حسب حاجتك. اختيار الأنسب يعتمد على مصدر بياناتك وتطبيقك.
س: ما الفرق بين نوعي
geometry
وgeography
؟- ج: نوع
geometry
يعالج الإحداثيات في نظام كارتيسي (ثنائي الأبعاد)، وتكون المسافات/المساحات محسوبة هندسيًا بدقة كافية للمناطق الصغيرة. نوعgeography
يعالج الإحداثيات الكروية (سطح الأرض) ويأخذ في الحسبان انحناء الأرض، ما يجعله مناسبًا للمساحات الكبيرة أو نتائج بدقة جغرافية. اخترgeometry
للعمليات الصغيرة أو التي لا تستلزم دقة انحناء الأرض، أما إذا كانت بياناتك عالمية أو تحتاج للدقة الجغرافية العالية، فاخترgeography
.
- ج: نوع
الخلاصة
PostGIS يزود PostgreSQL بقوة معالجة البيانات المكانية، وهو حجر الأساس لبناء تطبيقات تعتمد على الموقع. بفضل ServBay، يمكنك تفعيل واستعمال PostGIS على بيئة macOS المحلية دون أي عناء أو إعدادات معقدة.
شرحنا هنا خطوات تفعيل PostGIS، إنشاء وإدارة الجداول المكانية، تنفيذ استعلامات مكانية وتحليلية، وأيضًا أساسيات عرض البيانات مكانياً. مع هذه الأساسيات يمكنك بدء بناء تطبيقات ويب مكانية غنية بالميزات في ServBay باستخدام PostGIS. استكشف المزيد في وثائق PostGIS لتتعرف على مزايا وإمكانات أعمق.