名前

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を使って、対象ジオメトリのうち全体が領域内にあるものを抜き出すことができ、効率的になります。これらの場面では、インタセクションは確実に元の対象ジオメトリであることが直感的に分かります。

[注記]

この関数を実行すると、対象ジオメトリにおいて使用できるインデックスを使用したバウンディングボックスによる比較が自動的に行われます。 インデックスの使用を避けるには_ST_ContainsProperly関数を使います。

[注記]

この関数は、個々のポイントでトポロジを計算する必要が無く、より効率的に計算できる点で、ST_ContainsST_Intersectsより優れています。

GEOSモジュールで実現しています。

Availability: 1.4.0

Enhanced: 3.0.0 GEOMETRYCOLLECTIONへの対応が可能となりました

[重要]

この関数を不正なジオメトリで呼ばないでください。予期しない結果が返されます。

この例ではある円がもう一つの円の中にあるかどうかをテストします。

Code
WITH circles AS (
  SELECT ST_Buffer(center, 10) AS smallc,
         ST_Buffer(center, 20) AS bigc
  FROM (SELECT 'POINT(1 2)'::geometry AS center) AS p
)
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 circles;
出力:
-[ RECORD 1 ]-----
smallcontainspropbig   | f
bigcontainspropsmall   | t
bigcontainspropunion   | f
bigisunion             | t
bigcoversexterior      | t
bigcontainsexterior    | f
Figure
Geometry figure for visual-st-containsproperly-01

この例ではST_ContainsとST_ContainsProperlyとの差異を示します。

Code
WITH input(geom) AS (VALUES
  (ST_Buffer(ST_Point(1, 1), 5, 1)),
  (ST_MakeLine(ST_Point(1, 1), ST_Point(-1, -1))),
  (ST_Point(1, 1))
)
SELECT ST_GeometryType(geom) AS geomtype,
       ST_Contains(geom, geom) AS acontainsa,
       ST_ContainsProperly(geom, geom) AS acontainspropa,
       ST_Contains(geom, ST_Boundary(geom)) AS acontainsba,
       ST_ContainsProperly(geom, ST_Boundary(geom)) AS acontainspropba
FROM input;
出力:
geomtype    | acontainsa | acontainspropa | acontainsba | acontainspropba
--------------+------------+----------------+-------------+-----------------
ST_Polygon    | t          | f              | f           | f
ST_LineString | t          | f              | f           | f
ST_Point      | t          | t              | f           | f
 
Figure
Geometry figure for visual-st-containsproperly-02