ST_ContainsProperly — Tests if every point of B lies in the interior of A
boolean ST_ContainsProperly(geometry
geomA, geometry
geomB);
Returns true if every point of B lies in the interior of A
(or equivalently, no point of B lies in the the boundary or exterior of A).
In mathematical terms: ST_ContainsProperly(A, B) ⇔ Int(A) ⋂ B = B
A contains B properly if the DE-9IM Intersection Matrix for the two geometries matches [T**FF*FF*]
A does not properly contain itself, but does contain itself.
A use for this predicate is computing the intersections of a set of geometries with a large polygonal geometry. Since intersection is a fairly slow operation, it can be more efficient to use containsProperly to filter out test geometries which lie fully inside the area. In these cases the intersection is known a priori to be exactly the original test geometry.
|
|
|
This function automatically includes a bounding box comparison
that makes use of any spatial indexes that are available on the geometries.
To avoid index use, use the function |
|
|
|
The advantage of this predicate over ST_Contains and ST_Intersects is that it can be computed more efficiently, with no need to compute topology at individual points. |
Performed by the GEOS module.
Availability: 1.4.0
Enhanced: 3.0.0 enabled support for GEOMETRYCOLLECTION
|
|
|
Do not use this function with invalid geometries. You will get unexpected results. |
This example tests a circle within another circle.
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
This example demonstrates the difference between contains and contains-properly predicates.
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
ST_GeometryType, ST_Boundary, ST_Contains, ST_Covers, ST_CoveredBy, ST_Equals, ST_Relate, ST_Within