ST_Covers — Tests si chaque point de B est situé dans A
boolean ST_Covers(
geometry geomA, geometry geomB)
;
boolean ST_Covers(
geography geogpolyA, geography geogpointB)
;
Renvoie true
si chaque point de la geometry/geography B se trouve à l'intérieur (c'est-à-dire qu'il coupe l'intérieur ou la limite) de la geometry/geography A. De façon équivalente, teste qu'aucun point de B ne se trouve à l'extérieur (dans l'extérieur) de A.
En termes mathématiques : ST_Covers(A, B) ⇔ A ⋂ B = B
ST_Covers est le contraire de ST_CoveredBy. Ainsi, ST_Covers(A,B) = ST_CoveredBy(B,A)
.
En général, cette fonction devrait être utilisée à la place de ST_Contains, car elle a une définition plus simple qui n'a pas la particularité que "les géométries ne contiennent pas leur frontière".
Cette fonction inclut une comparaison de la boîte englobante qui utilise tous les index disponibles sur les géométries. Pour éviter l'utilisation d'un index, utilisez la fonction |
Amélioration : 3.0.0 a permis la prise en charge de |
N'utilisez pas cette fonction avec des géométries non valides. Vous obtiendrez des résultats inattendus. |
Effectué par le module GEOS
Amélioration : 2.4.0 Ajout de la prise en charge des polygones dans les polygones et des lignes dans les polygones pour le type geography
Amélioration : 2.3.0 Amélioration du court-circuit PIP pour la géométrie étendue à la prise en charge des multipoints avec peu de points. Les versions précédentes ne prenaient en charge que les points dans les polygones.
Disponibilité : 1.5 - le support de la geography a été introduit.
Disponibilité : 1.2.2
NOTE : il s'agit de la version "autorisée" qui renvoie un booléen et non un entier.
Il ne s'agit pas d'une norme de l'OGC, mais Oracle l'a également.
Exemple géométrique
--a circle covering a circle SELECT ST_Covers(smallc,smallc) As smallinsmall, ST_Covers(smallc, bigc) As smallcoversbig, ST_Covers(bigc, ST_ExteriorRing(bigc)) As bigcoversexterior, ST_Contains(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 smallinsmall | smallcoversbig | bigcoversexterior | bigcontainsexterior --------------+----------------+-------------------+--------------------- t | f | t | f (1 row)
Exemple géographique
-- a point with a 300 meter buffer compared to a point, a point and its 10 meter buffer SELECT ST_Covers(geog_poly, geog_pt) As poly_covers_pt, ST_Covers(ST_Buffer(geog_pt,10), geog_pt) As buff_10m_covers_cent FROM (SELECT ST_Buffer(ST_GeogFromText('SRID=4326;POINT(-99.327 31.4821)'), 300) As geog_poly, ST_GeogFromText('SRID=4326;POINT(-99.33 31.483)') As geog_pt ) As foo; poly_covers_pt | buff_10m_covers_cent ----------------+------------------ f | t