الاسم
ST_Covers — تختبر ما إذا كانت كل نقطة من B تقع في A
المختصر
boolean ST_Covers(geometry geomA, geometry geomB);
boolean ST_Covers(geography geogpolyA, geography geogpointB);
الوصف
تُعيد true إذا وقعت كل نقطة في Geometry/Geography B داخل Geometry/Geography A (أي تتقاطع مع داخله أو حدوده). وبصورة مكافئة، تختبر أنه لا توجد نقطة من B تقع خارج A (في خارجه).
بالصيغة الرياضية: ST_Covers(A, B) ⇔ A ⋂ B = B
ST_Covers هي عكس ST_CoveredBy. لذا فإن ST_Covers(A,B) = ST_CoveredBy(B,A).
يُفضَّل عمومًا استخدام هذه الدالة بدلًا من ST_Contains، لأن تعريفها أبسط ولا يتضمن الخاصية الغريبة «الأشكال الهندسية لا تحتوي حدودها».
|
|
|
تتضمن هذه الدالة تلقائيًا مقارنةً للمستطيل المحيط تستفيد من أي فهارس مكانية متاحة على الأشكال الهندسية. لتجنب استخدام الفهرس، استخدم الدالة |
|
|
|
حُسّنت في: 3.0.0 فُعّل دعم |
|
|
|
لا تستخدم هذه الدالة مع أشكال هندسية غير صالحة. ستحصل على نتائج غير متوقعة. |
تُنفَّذ بواسطة وحدة GEOS
حُسّنت في: 2.4.0 أُضيف دعم مضلع داخل مضلع وخط داخل مضلع لنوع geography
حُسّنت في: 2.3.0 وُسّع تحسين الاختصار في اختبار نقطة داخل مضلع (PIP) لنوع geometry ليدعم MultiPoints ذات النقاط القليلة. كانت الإصدارات السابقة تدعم فقط نقطة داخل مضلع.
متاحة منذ: 1.5 - أُضيف دعم geography.
متاحة منذ: 1.2.2
ملاحظة: هذا هو الإصدار «المسموح به» الذي يُعيد قيمة منطقية (boolean)، وليس عددًا صحيحًا.
ليست معيارًا من OGC، لكنها موجودة في Oracle أيضًا.
أمثلة
مثال geometry
--a circle covering a circle
SELECT ST_Covers(smallc,smallc) As smallinsmall,
ST_Covers(smallc, bigc) As smallcoversbig,
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
smallinsmall | smallcoversbig | bigcoversexterior | bigcontainsexterior
--------------+----------------+-------------------+---------------------
t | f | t | f
(1 row)
مثال geography
-- a point with a 300 meter buffer compared to a point, a point and its 10 meter buffer
SELECT ST_Covers(geog_poly, geog_pt) As poly_covers_pt,
ST_Covers(ST_Buffer(geog_pt,10), geog_pt) As buff_10m_covers_cent
FROM (SELECT ST_Buffer(ST_GeogFromText('SRID=4326;POINT(-99.327 31.4821)'), 300) As geog_poly,
ST_GeogFromText('SRID=4326;POINT(-99.33 31.483)') As geog_pt ) As foo;
poly_covers_pt | buff_10m_covers_cent
----------------+------------------
f | t