名称

ST_Covers — 测试 B 的每个点是否位于 A 中

语法

boolean ST_Covers(geometry geomA, geometry geomB);

boolean ST_Covers(geography geogpolyA, geography geogpointB);

描述

如果几何/地理 B 中的每个点都位于几何/地理 A 的内部(即与几何/地理 A 的内部或边界相交),则返回 true。等效地,测试 B 的任何点都不位于 A 的外部(外部)。

用数学术语表示:ST_Covers(A, B) ⇔ A ⋂ B = B

ST_Covers 是 ST_CoveredBy 的逆运算。因此,ST_Covers(A,B) = ST_CoveredBy(B,A)

通常应使用此函数,而不是 ST_Contains,因为它具有更简单的定义,没有“几何不包含其边界”的怪癖。

[Note]

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

若要避免使用索引,请使用函数 _ST_Covers

[Important]

增强:3.0.0 启用了对 GEOMETRYCOLLECTION 的支持

[Important]

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

由 GEOS 模块执行

增强:2.4.0 为地理类型添加了对多边形中多边形和线中多边形的支持

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

可用性:1.5 - 引入了对地理的支持。

可用性:1.2.2

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

并非 OGC 标准,但 Oracle 也有此标准。

示例

几何示例

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

地理示例

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

另请参阅

ST_ContainsST_CoveredByST_Within