名稱

ST_Contains — 測試 B 的每個點是否都位於 A 中,且它們的內部有共同的點

概要

boolean ST_Contains(geometry geomA, geometry geomB);

描述

如果幾何 A 包含幾何 B,則返回 TRUE。當且僅當 B 的所有點都位於 A 的內部(即,內部或邊界)時(或等效地,B 沒有任何點位於 A 的外部),且 A 和 B 的內部至少有一個共同點時,A 包含 B。

用數學術語表示:ST_Contains(A, B) ⇔ (A ⋂ B = B) ∧ (Int(A) ⋂ Int(B) ≠ ∅)

包含關係是自反的:每個幾何都包含它自己。(相反地,在 ST_ContainsProperly 謂詞中,一個幾何 會適當地包含它自己。)該關係是反對稱的:如果 ST_Contains(A,B) = trueST_Contains(B,A) = true,則這兩個幾何必須在拓撲上相等(ST_Equals(A,B) = true)。

ST_Contains 是 ST_Within 的逆關係。因此,ST_Contains(A,B) = ST_Within(B,A)

[Note]

由於內部必須有一個共同點,因此定義上的微妙之處在於,多邊形和線條 包含完全位於其邊界上的線條和點。有關更多詳細資訊,請參閱 OGC Covers、Contains、Within 的微妙之處ST_Covers 謂詞提供了更具包容性的關係。

[Note]

此函式自動包含一個邊界框比較,該比較利用幾何體上可用的任何空間索引。若要避免使用索引,請使用函式 _ST_Contains

由 GEOS 模組執行

增強功能:2.3.0 PIP 短路增強功能擴展為支援具有少量點的 MultiPoint。先前的版本僅支援多邊形中的點。

[Important]

增強功能:3.0.0 啟用對 GEOMETRYCOLLECTION 的支援

[Important]

請勿將此函式與無效的幾何體一起使用。您會得到意想不到的結果。

注意:這是返回布林值的「允許」版本,而不是整數。

此方法實作了 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

LINESTRING / MULTIPOINT

POLYGON / POINT

POLYGON / LINESTRING

POLYGON / POLYGON

ST_Contains 在以下情況下返回 FALSE

POLYGON / MULTIPOINT

POLYGON / LINESTRING

由於內部相交條件,ST_Contains 在以下情況下返回 FALSE(而 ST_Covers 返回 TRUE

LINESTRING / POINT

POLYGON / LINESTRING

-- 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