名称

ST_ContainsProperly — 测试 B 的所有点是否都在 A 的内部

概要

boolean ST_ContainsProperly(geometry geomA, geometry geomB);

描述

如果 B 的所有点都在 A 的内部(或等效地,B 的任何点都不在 A 的边界或外部),则返回 true

用数学术语来说:ST_ContainsProperly(A, B) ⇔ Int(A) ⋂ B = B

如果两个几何图形的 DE-9IM 交集矩阵匹配 [T**FF*FF*],则 A 正确包含 B。

A 不正确包含自身,但包含自身。

此谓词的一种用途是计算一组几何图形与大型多边形几何图形的交集。由于交集是一个相当慢的操作,因此使用 containsProperly 来过滤掉完全位于该区域内的测试几何图形可能更有效。在这些情况下,交集先验地已知恰好是原始测试几何图形。

[Note]

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

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

[Note]

ST_ContainsST_Intersects 相比,此谓词的优势在于它可以更有效地计算,无需计算单个点的拓扑结构。

由 GEOS 模块执行。

可用性:1.4.0

[Important]

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

[Important]

不要将此函数与无效几何图形一起使用。您将获得意外的结果。

示例

  --a circle within a circle
  SELECT ST_ContainsProperly(smallc, bigc) As smallcontainspropbig,
  ST_ContainsProperly(bigc,smallc) As bigcontainspropsmall,
  ST_ContainsProperly(bigc, ST_Union(smallc, bigc)) as bigcontainspropunion,
  ST_Equals(bigc, ST_Union(smallc, bigc)) as bigisunion,
  ST_Covers(bigc, ST_ExteriorRing(bigc)) As bigcoversexterior,
  ST_ContainsProperly(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
  smallcontainspropbig | bigcontainspropsmall | bigcontainspropunion | bigisunion | bigcoversexterior | bigcontainsexterior
------------------+------------------+------------------+------------+-------------------+---------------------
 f                     | t                    | f                    | 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_GeometryType, ST_Boundary, ST_Contains, ST_Covers, ST_CoveredBy, ST_Equals, ST_Relate, ST_Within