الاسم
ST_Contains — تختبر ما إذا كانت كل نقطة من B تقع في A، وما إذا كان لداخليهما نقطة مشتركة
المختصر
boolean ST_Contains(geometry geomA, geometry geomB);
الوصف
تُعيد TRUE إذا كان الشكل الهندسي A يحتوي الشكل الهندسي B. يحتوي A الشكلَ B إذا وفقط إذا وقعت جميع نقاط B داخل A (أي في داخله أو على حدوده) (أو بصورة مكافئة، لم تقع أي نقطة من B خارج A)، وكان لداخلي A وB نقطة مشتركة واحدة على الأقل.
بالصيغة الرياضية: ST_Contains(A, B) ⇔ (A ⋂ B = B) ∧ (Int(A) ⋂ Int(B) ≠ ∅)
علاقة الاحتواء انعكاسية: كل شكل هندسي يحتوي نفسه. (وفي المقابل، في المسند ST_ContainsProperly لا يحتوي الشكل الهندسي نفسه احتواءً تامًا البتة.) والعلاقة تخالفية (antisymmetric): إذا كان ST_Contains(A,B) = true وST_Contains(B,A) = true، فيجب أن يكون الشكلان الهندسيان متساويين طوبولوجيًا (ST_Equals(A,B) = true).
ST_Contains هي عكس ST_Within. لذا فإن ST_Contains(A,B) = ST_Within(B,A).
|
|
|
لأن الداخليين يجب أن يشتركا في نقطة، فمن دقائق هذا التعريف أن المضلعات والخطوط لا تحتوي الخطوط والنقاط الواقعة كليًا على حدودها. لمزيد من التفاصيل راجع دقائق Covers وContains وWithin في OGC. يوفر المسند ST_Covers علاقة أكثر شمولًا. |
|
|
|
تتضمن هذه الدالة تلقائيًا مقارنةً للمستطيل المحيط تستفيد من أي فهارس مكانية متاحة على الأشكال الهندسية. لتجنب استخدام الفهرس، استخدم الدالة |
تُنفَّذ بواسطة وحدة GEOS
حُسّنت في: 2.3.0 وُسّع تحسين الاختصار في اختبار نقطة داخل مضلع (PIP) ليدعم MultiPoints ذات النقاط القليلة. كانت الإصدارات السابقة تدعم فقط نقطة داخل مضلع.
|
|
|
حُسّنت في: 3.0.0 فُعّل دعم |
|
|
|
لا تستخدم هذه الدالة مع أشكال هندسية غير صالحة. ستحصل على نتائج غير متوقعة. |
ملاحظة: هذا هو الإصدار «المسموح به» الذي يُعيد قيمة منطقية (boolean)، وليس عددًا صحيحًا.
تطبّق هذه الدالة مواصفة OGC Simple Features Implementation Specification for SQL 1.1. s2.1.1.2 // s2.1.13.3 - مثل within(geometry B, geometry A)
تطبّق هذه الدالة مواصفة SQL/MM. SQL-MM 3: 5.1.31
أمثلة
تُعيد ST_Contains القيمة TRUE في الحالات التالية:
|
|
|
|
تُعيد ST_Contains القيمة FALSE في الحالات التالية:
|
|
بسبب شرط تقاطع الداخل، تُعيد ST_Contains القيمة FALSE في الحالات التالية (في حين تُعيد ST_Covers القيمة TRUE):
|
|
-- A circle within a circle
SELECT ST_Contains(smallc, bigc) As smallcontainsbig,
ST_Contains(bigc,smallc) As bigcontainssmall,
ST_Contains(bigc, ST_Union(smallc, bigc)) as bigcontainsunion,
ST_Equals(bigc, ST_Union(smallc, bigc)) as bigisunion,
ST_Covers(bigc, ST_ExteriorRing(bigc)) As bigcoversexterior,
ST_Contains(bigc, ST_ExteriorRing(bigc)) As bigcontainsexterior
FROM (SELECT ST_Buffer(ST_GeomFromText('POINT(1 2)'), 10) As smallc,
ST_Buffer(ST_GeomFromText('POINT(1 2)'), 20) As bigc) As foo;
-- Result
smallcontainsbig | bigcontainssmall | bigcontainsunion | bigisunion | bigcoversexterior | bigcontainsexterior
------------------+------------------+------------------+------------+-------------------+---------------------
f | t | t | t | t | f
-- Example demonstrating difference between contains and contains properly
SELECT ST_GeometryType(geomA) As geomtype, ST_Contains(geomA,geomA) AS acontainsa, ST_ContainsProperly(geomA, geomA) AS acontainspropa,
ST_Contains(geomA, ST_Boundary(geomA)) As acontainsba, ST_ContainsProperly(geomA, ST_Boundary(geomA)) As acontainspropba
FROM (VALUES ( ST_Buffer(ST_Point(1,1), 5,1) ),
( ST_MakeLine(ST_Point(1,1), ST_Point(-1,-1) ) ),
( ST_Point(1,1) )
) As foo(geomA);
geomtype | acontainsa | acontainspropa | acontainsba | acontainspropba
--------------+------------+----------------+-------------+-----------------
ST_Polygon | t | f | f | f
ST_LineString | t | f | f | f
ST_Point | t | t | f | f
انظر أيضًا
ST_Boundary, ST_ContainsProperly, ST_Covers, ST_CoveredBy, ST_Equals, ST_Within