ST_COVERS
The ST_COVERS
function determines if one GEOGRAPHY
object fully encompasses another. Specifically, it checks whether every point in the second GEOGRAPHY
object (geo2
) lies within or on the boundary of the first GEOGRAPHY
object (geo1
). If geo1
covers geo2
, the function returns TRUE
; otherwise, it returns FALSE
. This function is commonly used to assess spatial relationships, such as whether a larger geographic area completely includes a smaller one.
If either geo1
or geo2
is empty, ST_COVERS
will return FALSE
.
Before performing the coverage check, geo1
and geo2
are aligned through a snapping process, ensuring precise calculation. For more details on snapping, refer to the snapping documentation.
Comparison with ST_CONTAINS
ST_COVERS
is similar to ST_CONTAINS
, but there is a key distinction: ST_CONTAINS
returns FALSE
if all points in geo2
lie exactly on the boundary of geo1
, while ST_COVERS
will return TRUE
in this case. If this distinction is not important, use ST_COVERS
, which is more efficient to compute in Firebolt.
Syntax
ST_COVERS(<geo1>, <geo2>)
Parameters
Parameter | Description | Supported input types |
---|---|---|
<geo1> | The object being checked to see if it fully covers the second object. | GEOGRAPHY |
<geo2> | The object being checked to see if it fully covers the first object. | GEOGRAPHY |
Return Type
ST_COVERS
returns a value of type BOOLEAN
.
Example
The following codes example creates a Polygon and a Point around Times Square in New York City from their WKT representations and checks if the Polygon covers the Point:
SELECT ST_COVERS(
ST_GEOGFROMTEXT('POLYGON((-73.98519512134791 40.75939223091697, -73.98566488210841 40.75807135585606, -73.9856079414103 40.75804080469413, -73.98470163529633 40.75918017383259, -73.98519512134791 40.75939223091697))'),
ST_GEOGFROMTEXT('POINT(-73.98504378555772 40.75894662495352)')
) AS result
Returns
result (BOOLEAN) |
---|
t |
Example
The following example illustrates the difference between ST_CONTAINS
and ST_COVERS
. The Polygon POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))
covers, but does not contain the LineString LINESTRING(0 0, 0 0.5)
because it only lies on the Polygon’s boundary and does not intersect the interior of the Polygon. The LineString LINESTRING(0 0, 0 0.5, 0.5 0.5)
only partially lies on the Polygon’s boundary but also intersects its interior, so it is covered and contained.
SELECT
polygon,
linestring,
ST_CONTAINS(
ST_GEOGFROMTEXT(polygon),
ST_GEOGFROMTEXT(linestring)
) AS contains,
ST_COVERS(
ST_GEOGFROMTEXT(polygon),
ST_GEOGFROMTEXT(linestring)
) AS covers
FROM UNNEST (
['POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))','POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))'],
['LINESTRING(0 0, 0 0.5)','LINESTRING(0 0, 0 0.5, 0.5 0.5)']
) AS shapes(polygon, linestring)
Returns
polygon (TEXT) | linestring (TEXT) | contains (BOOLEAN) | covers (BOOLEAN) |
---|---|---|---|
‘POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))’ | ‘LINESTRING(0 0, 0 0.5)’ | f | t |
‘POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))’ | ‘LINESTRING(0 0, 0 0.5, 0.5 0.5)’ | t | t |