الاسم
ST_Relate — تختبر ما إذا كان لشكلين هندسيين علاقة طوبولوجية تطابق نمط مصفوفة تقاطع، أو تحسب مصفوفة التقاطع الخاصة بهما
المختصر
boolean ST_Relate(geometry geomA, geometry geomB, text intersectionMatrixPattern);
text ST_Relate(geometry geomA, geometry geomB);
text ST_Relate(geometry geomA, geometry geomB, integer boundaryNodeRule);
الوصف
تتيح هذه الدوال اختبار العلاقة المكانية (الطوبولوجية) بين شكلين هندسيين وتقييمها، كما يعرّفها نموذج التقاطعات التسعة الموسّع بالأبعاد (DE-9IM).
يُحدَّد DE-9IM بوصفه مصفوفة من 9 عناصر تشير إلى بُعد التقاطعات بين الداخل والحدود والخارج لشكلين هندسيين. ويُمثَّل بسلسلة نصية من 9 محارف تستخدم الرموز 'F' و'0' و'1' و'2' (مثل 'FF1FF0102').
يمكن اختبار نوع معيّن من العلاقات المكانية بمطابقة مصفوفة التقاطع مع نمط مصفوفة تقاطع. يمكن أن تتضمن الأنماط الرمزين الإضافيين 'T' (بمعنى «التقاطع غير فارغ») و'*' (بمعنى «أي قيمة»). تتوفر العلاقات المكانية الشائعة عبر الدوال المسمّاة ST_Contains وST_ContainsProperly وST_Covers وST_CoveredBy وST_Crosses وST_Disjoint وST_Equals وST_Intersects وST_Overlaps وST_Touches وST_Within. يتيح استخدام نمط صريح اختبار شروط متعددة من التقاطع والعبور وغيرها في خطوة واحدة. كما يتيح اختبار علاقات مكانية ليست لها دالة علاقة مكانية مسمّاة. على سبيل المثال، للعلاقة «Interior-Intersects» (تقاطع الداخل) النمط DE-9IM T********، ولا يقيّمها أي مسند مسمّى.
لمزيد من المعلومات راجع قسم 5.1, “تحديد العلاقات المكانية”.
الشكل 1: تختبر ما إذا كان شكلان هندسيان مرتبطين مكانيًا وفقًا لـ intersectionMatrixPattern المُعطى.
|
|
|
خلافًا لمعظم مسندات العلاقات المكانية المسمّاة، لا يتضمن هذا تلقائيًا استدعاءً للفهرس. والسبب أن بعض العلاقات تتحقق لأشكال هندسية لا تتقاطع (مثل Disjoint). إذا كنت تستخدم نمط علاقة يتطلب التقاطع، فأضف استدعاء الفهرس &&. |
|
|
|
من الأفضل استخدام دالة علاقة مسمّاة إن توفرت، لأنها تستخدم تلقائيًا الفهرس المكاني عند وجوده. كما قد تطبّق تحسينات أداء غير متاحة مع التقييم الكامل لـ relate. |
الشكل 2: تُعيد سلسلة مصفوفة DE-9IM للعلاقة المكانية بين الشكلين الهندسيين المُدخلين. يمكن اختبار مطابقة سلسلة المصفوفة لنمط DE-9IM باستخدام ST_RelateMatch.
الشكل 3: مثل الشكل 2، لكنه يتيح تحديد قاعدة عُقد الحدود. تتيح قاعدة عُقد الحدود تحكمًا أدق في ما إذا كانت نقاط نهايات MultiLineStrings تُعدّ واقعة في الداخل (Interior) أو الحدود (Boundary) وفق DE-9IM. قيم boundaryNodeRule هي:
-
1: OGC-Mod2 - تقع نهايات الخطوط في الحدود إذا تكررت عددًا فرديًا من المرات. هذه هي القاعدة التي يعرّفها معيار OGC SFS، وهي الافتراضية لـST_Relate. -
2: Endpoint - تقع جميع النهايات في الحدود. -
3: MultivalentEndpoint - تقع النهايات في الحدود إذا تكررت أكثر من مرة. بعبارة أخرى، تتكون الحدود من جميع النهايات «المتصلة» أو «الداخلية» (لا «غير المتصلة/الخارجية»). -
4: MonovalentEndpoint - تقع النهايات في الحدود إذا ظهرت مرة واحدة فقط. بعبارة أخرى، تتكون الحدود من جميع النهايات «غير المتصلة» أو «الخارجية».
هذه الدالة ليست في مواصفة OGC، لكنها ضمنية. راجع s2.1.13.2
تطبّق هذه الدالة مواصفة OGC Simple Features Implementation Specification for SQL 1.1. s2.1.1.2 // s2.1.13.3
تطبّق هذه الدالة مواصفة SQL/MM. SQL-MM 3: 5.1.25
تُنفَّذ بواسطة وحدة GEOS
حُسّنت في: 2.0.0 - أُضيف دعم تحديد قاعدة عُقد الحدود.
|
|
|
حُسّنت في: 3.0.0 فُعّل دعم |
أمثلة
استخدام الدالة ذات القيمة المنطقية لاختبار العلاقات المكانية.
SELECT ST_Relate('POINT(1 2)', ST_Buffer( 'POINT(1 2)', 2), '0FFFFF212');
st_relate
-----------
t
SELECT ST_Relate(POINT(1 2)', ST_Buffer( 'POINT(1 2)', 2), '*FF*FF212');
st_relate
-----------
t
اختبار نمط علاقة مكانية مخصص بوصفه شرطًا في استعلام، مع && لتمكين استخدام الفهرس المكاني.
-- Find compounds that properly intersect (not just touch) a poly (Interior Intersects)
SELECT c.* , p.name As poly_name
FROM polys AS p
INNER JOIN compounds As c
ON c.geom && p.geom
AND ST_Relate(p.geom, c.geom,'T********');
حساب مصفوفة التقاطع للعلاقات المكانية.
SELECT ST_Relate( 'POINT(1 2)',
ST_Buffer( 'POINT(1 2)', 2));
-----------
0FFFFF212
SELECT ST_Relate( 'LINESTRING(1 2, 3 4)',
'LINESTRING(5 6, 7 8)' );
-----------
FF1FF0102
استخدام قواعد عُقد حدود مختلفة لحساب العلاقة المكانية بين LineString وMultiLineString ذي نهاية مكررة (3 3):
-
باستخدام القاعدة OGC-Mod2 (1) تقع النهاية المكررة في داخل MultiLineString، لذا فإن مدخل مصفوفة DE-9IM [aB:bI] هو
0و[aB:bB] هوF. -
باستخدام القاعدة Endpoint (2) تقع النهاية المكررة في حدود MultiLineString، لذا فإن مدخل مصفوفة DE-9IM [aB:bI] هو
Fو[aB:bB] هو0.
WITH data AS (SELECT
'LINESTRING(1 1, 3 3)'::geometry AS a_line,
'MULTILINESTRING((3 3, 3 5), (3 3, 5 3))':: geometry AS b_multiline
)
SELECT ST_Relate( a_line, b_multiline, 1) AS bnr_mod2,
ST_Relate( a_line, b_multiline, 2) AS bnr_endpoint
FROM data;
bnr_mod2 | bnr_endpoint
-----------+--------------
FF10F0102 | FF1F00102