名稱

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