16.2. الدرس: نموذج المعالم البسيطة¶
كيف يمكننا تخزين المعالم الجغرافية وتمثيلها في قاعدة بيانات؟ سنتناول في هذا الدرس إحدى الطرق، وهي نموذج المعالم البسيطة (Simple Feature Model) كما عرّفه OGC.
هدف هذا الدرس: معرفة ماهية نموذج SFS وكيفية استخدامه.
16.2.1. ما هو OGC¶
نشأ اتحاد Open Geospatial Consortium (OGC)، وهو منظمة دولية تطوعية لوضع المعايير بالتوافق، في عام 1994. يتعاون في OGC أكثر من 370 منظمة تجارية وحكومية وغير ربحية وبحثية حول العالم في عملية توافق مفتوحة تشجع على تطوير وتطبيق المعايير الخاصة بالمحتوى والخدمات الجغرافية المكانية، ومعالجة بيانات نظم المعلومات الجغرافية، ومشاركة البيانات. - Wikipedia
16.2.2. ما هو نموذج SFS¶
نموذج Simple Feature for SQL (SFS) هو طريقة غير طوبولوجية لتخزين البيانات الجغرافية المكانية في قاعدة بيانات، ويعرّف دوالًا للوصول إلى هذه البيانات ومعالجتها وإنشائها.
يعرّف النموذج البيانات الجغرافية المكانية من الأنواع Point و Linestring و Polygon (وتجميعاتها في كائنات Multi).
لمزيد من المعلومات، اطّلع على معيار OGC Simple Feature for SQL.
16.2.3. إضافة حقل شكل هندسي إلى الجدول¶
لنُضف حقل نقاط إلى جدول الأشخاص:
alter table people add column geom geometry;
16.2.4. إضافة قيد مبني على نوع الشكل الهندسي¶
ستلاحظ أن نوع حقل الشكل الهندسي لا يحدد ضمنيًا نوع الشكل الهندسي للحقل، ولذلك نحتاج إلى قيد:
alter table people
add constraint people_geom_point_chk
check(st_geometrytype(geom) = 'ST_Point'::text
OR geom IS NULL);
يضيف هذا قيدًا إلى الجدول بحيث لا يقبل إلا شكلًا هندسيًا من نوع نقطة أو قيمة فارغة (null).
16.2.5. ★★★ جرّب بنفسك:¶
أنشئ جدولًا جديدًا باسم cities وأضف إليه بعض الأعمدة المناسبة، بما فيها حقل شكل هندسي لتخزين المضلعات (حدود المدن). تأكد من أن له قيدًا يفرض أن تكون الأشكال الهندسية مضلعات.
الإجابة
16.2.6. تعبئة الجدول geometry_columns¶
عند هذه المرحلة يجب عليك أيضًا إضافة إدخال إلى الجدول geometry_columns:
insert into geometry_columns values
('','public','people','geom',2,4326,'POINT');
لماذا؟ تستخدم بعض التطبيقات geometry_columns لمعرفة الجداول التي تحتوي على بيانات أشكال هندسية في قاعدة البيانات.
ملاحظة
إذا تسببت عبارة INSERT أعلاه في خطأ، فشغّل هذا الاستعلام أولًا:
select * from geometry_columns;
إذا احتوى العمود f_table_name على القيمة people، فهذا الجدول مسجل بالفعل ولا تحتاج إلى فعل أي شيء آخر.
تشير القيمة 2 إلى عدد الأبعاد؛ وفي هذه الحالة بُعدان: X و Y.
تشير القيمة 4326 إلى الإسقاط الذي نستخدمه؛ وفي هذه الحالة WGS 84، الذي يُشار إليه بالرقم 4326 (راجع النقاش السابق حول EPSG).
★☆☆ جرّب بنفسك:¶
أضف إدخال geometry_columns مناسبًا لطبقة المدن الجديدة
الإجابة
insert into geometry_columns values
('','public','cities','geom',2,4326,'POLYGON');
16.2.7. إضافة سجل شكل هندسي إلى الجدول باستخدام SQL¶
بعد أن أصبحت جداولنا مدعمة جغرافيًا، يمكننا تخزين الأشكال الهندسية فيها:
insert into people (name,house_no, street_id, phone_no, geom)
values ('Fault Towers',
34,
3,
'072 812 31 28',
'SRID=4326;POINT(33 -33)');
ملاحظة
في الإدخال الجديد أعلاه، ستحتاج إلى تحديد الإسقاط (SRID) الذي تريد استخدامه. وذلك لأنك أدخلت الشكل الهندسي للنقطة الجديدة باستخدام سلسلة نصية عادية، وهي لا تضيف معلومات الإسقاط الصحيحة تلقائيًا. ومن البديهي أن النقطة الجديدة يجب أن تستخدم SRID نفسه الخاص بمجموعة البيانات التي تُضاف إليها، لذلك عليك تحديده.
لو كنت تستخدم في هذه المرحلة واجهة رسومية مثلًا، لكان تحديد الإسقاط لكل نقطة تلقائيًا. بعبارة أخرى، لن تحتاج عادةً إلى القلق بشأن استخدام الإسقاط الصحيح لكل نقطة تريد إضافتها إذا كنت قد حددته مسبقًا لمجموعة البيانات تلك، كما فعلنا سابقًا.
ربما حان الوقت الآن لفتح QGIS ومحاولة عرض الجدول people. وينبغي أيضًا أن نجرب تعديل السجلات وإضافتها وحذفها ثم تنفيذ استعلامات select في قاعدة البيانات لنرى كيف تغيرت البيانات.
لتحميل طبقة PostgreSQL في QGIS، استخدم خيار القائمة أو زر شريط الأدوات:
سيفتح ذلك نافذة الحوار:
انقر على الزر New لفتح نافذة الحوار هذه:
ثم عرّف اتصالًا جديدًا، مثلًا:
Name: myPG
Service:
Host: localhost
Port: 5432
Database: address
User:
Password:
للتحقق من أن QGIS عثر على قاعدة البيانات address وأن اسم المستخدم وكلمة المرور صحيحان، انقر على Test Connect. إذا نجح الاتصال، فعّل المربعين بجوار Save Username و Save Password. ثم انقر على OK لإنشاء هذا الاتصال.
بالعودة إلى نافذة الحوار Add PostgreSQL Layers، انقر على Connect وأضف الطبقات إلى مشروعك كالمعتاد.
★★☆ جرّب بنفسك:¶
صُغ استعلامًا يعرض اسم الشخص واسم الشارع والموقع (من العمود geom) كنص عادي.
الإجابة
select people.name,
streets.name as street_name,
st_astext(people.geom) as geometry
from streets, people
where people.street_id=streets.id;
النتيجة:
name | street_name | geometry
--------------+-------------+---------------
Roger Jones | High street |
Sally Norman | High street |
Jane Smith | Main Road |
Joe Bloggs | Low Street |
Fault Towers | Main Road | POINT(33 -33)
(5 rows)
كما ترى، يسمح القيد الذي وضعناه بإضافة قيم فارغة (null) إلى قاعدة البيانات.
16.2.8. الخلاصة¶
رأيت كيف تضيف كائنات مكانية إلى قاعدة بياناتك وتعرضها في برامج نظم المعلومات الجغرافية.
16.2.9. ما التالي؟¶
سترى فيما يلي كيف تستورد البيانات إلى قاعدة بياناتك وتصدّرها منها.
