名称

ST_Contains — 测试 B 的每个点是否位于 A 中,并且它们的内部有一个公共点

语法

boolean ST_Contains(geometry geomA, geometry geomB);

描述

如果几何 A 包含几何 B,则返回 TRUE。当且仅当 B 的所有点都位于 A 的内部(即 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 覆盖、包含、内部的细微差别ST_Covers 谓词提供了一个更具包容性的关系。

[Note]

此函数自动包含一个边界框比较,该比较利用几何上可用的任何空间索引。

要避免使用索引,请使用函数 _ST_Contains

由 GEOS 模块执行

增强:2.3.0 增强 PIP 短路以支持具有少量点的多点。以前的版本仅支持多边形中的点。

[Important]

增强:3.0.0 启用对 GEOMETRYCOLLECTION 的支持

[Important]

请勿对无效几何使用此函数。您将获得意外结果。

注意:这是返回布尔值(而非整数)的“允许”版本。

此方法实现了 OGC 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

 

另请参见

ST_BoundaryST_ContainsProperlyST_CoversST_CoveredByST_EqualsST_Within