PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 12.22 » Langage SQL » Fonctions et opérateurs » Fonctions et opérateurs géométriques

9.11. Fonctions et opérateurs géométriques

Les types géométriques point, box, lseg, line, path, polygon et circle disposent d'un large ensemble de fonctions et opérateurs natifs. Ils sont listés dans le Tableau 9.34, le Tableau 9.35 et le Tableau 9.36.

Attention

L'opérateur « identique à », ~=, représente la notion habituelle d'égalité pour les types point, box, polygon et circle. Certains disposent également d'un opérateur =, mais = ne compare que les égalités d'aires. Les autres opérateurs scalaires de comparaison (<= et autres) comparent de la même façon des aires pour ces types.

Tableau 9.34. Opérateurs géométriques

OpérateurDescriptionExemple
+ Translationbox '((0,0),(1,1))' + point '(2.0,0)'
- Translationbox '((0,0),(1,1))' - point '(2.0,0)'
* Mise à l'échelle/rotationbox '((0,0),(1,1))' * point '(2.0,0)'
/ Mise à l'échelle/rotationbox '((0,0),(2,2))' / point '(2.0,0)'
# Point ou boîte d'intersectionbox '((1,-1),(-1,1))' # box '((1,1),(-2,-2))'
# Nombre de points dans le chemin ou le polygone# path '((1,0),(0,1),(-1,0))'
@-@ Longueur ou circonférence@-@ path '((0,0),(1,0))'
@@ Centre@@ circle '((0,0),10)'
## Point de second opérande le plus proche du premierpoint '(0,0)' ## lseg '((2,0),(0,2))'
<-> Distance entrecircle '((0,0),1)' <-> circle '((5,0),1)'
&& Recouvrement ? (Un point en commun renvoie la valeur true.)box '((0,0),(1,1))' && box '((0,0),(2,2))'
<< Est strictement à gauche de ?circle '((0,0),1)' << circle '((5,0),1)'
>> Est strictement à droite de ?circle '((5,0),1)' >> circle '((0,0),1)'
&< Ne s'étend pas à droite de ?box '((0,0),(1,1))' &< box '((0,0),(2,2))'
&> Ne s'étend pas à gauche de ?box '((0,0),(3,3))' &> box '((0,0),(2,2))'
<<| Est strictement en-dessous de ?box '((0,0),(3,3))' <<| box '((3,4),(5,5))'
|>> Est strictement au-dessus de ?box '((3,4),(5,5))' |>> box '((0,0),(3,3))'
&<| Ne s'étend pas au-dessus de ?box '((0,0),(1,1))' &<| box '((0,0),(2,2))'
|&> Ne s'étend pas en-dessous de ?box '((0,0),(3,3))' |&> box '((0,0),(2,2))'
<^ Est en-dessous de (peut toucher) ?circle '((0,0),1)' <^ circle '((0,5),1)'
>^ Est au-dessus de (peut toucher) ?circle '((0,5),1)' >^ circle '((0,0),1)'
?# Intersection ?lseg '((-1,0),(1,0))' ?# box '((-2,-2),(2,2))'
?- Horizontal ??- lseg '((-1,0),(1,0))'
?- Sont alignés horizontalement ?point '(1,0)' ?- point '(0,0)'
?| Vertical ??| lseg '((-1,0),(1,0))'
?| Sont verticalement alignés ?point '(0,1)' ?| point '(0,0)'
?-| Perpendiculaires ?lseg '((0,0),(0,1))' ?-| lseg '((0,0),(1,0))'
?|| Parallèles ?lseg '((-1,0),(1,0))' ?|| lseg '((-1,2),(1,2))'
@> Contient ?circle '((0,0),2)' @> point '(1,1)'
<@ Contenu ou dessus ?point '(1,1)' <@ circle '((0,0),2)'
~= Identique à ?polygon '((0,0),(1,1))' ~= polygon '((1,1),(0,0))'

Note

Avant PostgreSQL 8.2, les opérateurs @> et <@ s'appelaient respectivement ~ et @. Ces noms sont toujours disponibles, mais, obsolètes, ils seront éventuellement supprimés.

Tableau 9.35. Fonctions géométriques

FonctionType de retourDescriptionExemple
area (object)double precisionairearea(box '((0,0),(1,1))')
center (object)pointcentrecenter(box '((0,0),(1,2))')
diameter(circle)double precisiondiamètre du cerclediameter(circle '((0,0),2.0)')
box(point)boxpoint sur une boîte videbox(point '(0,0)')
height(box)double precisiontaille verticale (hauteur) de la boîteheight(box '((0,0),(1,1))')
isclosed(path)booleanchemin fermé ?isclosed(path '((0,0),(1,1),(2,0))')
isopen(path)booleanchemin ouvert ?isopen(path '[(0,0),(1,1),(2,0)]')
length(object)double precisionlongueurlength(path '((-1,0),(1,0))')
npoints(path)intnombre de pointsnpoints(path '[(0,0),(1,1),(2,0)]')
npoints(polygon)intnombre de pointsnpoints(polygon '((1,1),(0,0))')
pclose(path)pathconvertit un chemin en chemin fermépclose(path '[(0,0),(1,1),(2,0)]')
popen(path)pathconvertit un chemin en chemin ouvertpopen(path '((0,0),(1,1),(2,0))')
bound_box(box, box)boxboîtes vers une boîte enveloppantebound_box(box '((0,0),(1,1))', box '((3,3),(4,4))')
radius(circle)double precisionrayon du cercleradius(circle '((0,0),2.0)')
width(box)double precisiontaille horizontale (largeur) d'une boîtewidth(box '((0,0),(1,1))')

Tableau 9.36. Fonctions de conversion de types géométriques

FonctionType de retourDescriptionExemple
box(circle) boxcercle vers boîtebox(circle '((0,0),2.0)')
circle(box) boxpoints vers boîtebox(point '(0,0)', point '(1,1)')
box(polygon)boxpolygone vers boîtebox(polygon '((0,0),(1,1),(2,0))')
circle(box)circleboîte vers cerclecircle(box '((0,0),(1,1))')
circle(point, double precision)circlecentre et rayon vers cerclecircle(point '(0,0)', 2.0)
circle(polygon)circlepolygone vers cerclecircle(polygon '((0,0),(1,1),(2,0))')
line(point, point)linepoints vers ligneline(point '(-1,0)', point '(1,0)')
lseg(box) lsegdiagonale de boîte vers segment de lignelseg(box '((-1,0),(1,0))')
lseg(point, point)lsegpoints vers segment de lignelseg(point '(-1,0)', point '(1,0)')
path(polygon) pathpolygone vers cheminpath(polygon '((0,0),(1,1),(2,0))')
point(double precision, double precision) pointpoint de constructionpoint(23.4, -44.5)
point(box)pointcentre de la boîtepoint(box '((-1,0),(1,0))')
point(circle)pointcentre du cerclepoint(circle '((0,0),2.0)')
point(lseg)pointcentre de segment de lignepoint(lseg '((-1,0),(1,0))')
point(polygon)pointcentre de polygonepoint(polygon '((0,0),(1,1),(2,0))')
polygon(box) polygonboîte vers polygone à quatre pointspolygon(box '((0,0),(1,1))')
polygon(circle)polygoncercle vers polygone à 12 pointspolygon(circle '((0,0),2.0)')
polygon(npts, circle)polygoncercle vers polygone à npts pointspolygon(12, circle '((0,0),2.0)')
polygon(path)polygonchemin vers polygonepolygon(path '((0,0),(1,1),(2,0))')

Il est possible d'accéder aux deux composants d'un point comme si c'était un tableau avec des index 0 et 1. Par exemple, si t.p est une colonne de type point, alors SELECT p[0] FROM t récupère la coordonnée X et UPDATE t SET p[1] = ... modifie la coordonnée Y. De la même façon, une valeur de type box ou lseg peut être traitée comme un tableau de deux valeurs de type point.

La fonction area est utilisable avec les types box, circle et path. Elle ne fonctionne avec le type de données path que s'il n'y a pas d'intersection entre les points du path. Le path '((0,0),(0,1),(2,1),(2,2),(1,2),(1,0),(0,0))'::PATH, par exemple, ne fonctionne pas. Le path, visuellement identique, '((0,0),(0,1),(1,1),(1,2),(2,2),(2,1),(1,1),(1,0),(0,0))'::PATH, quant à lui, fonctionne. Si les concepts de path avec intersection et sans intersection sont source de confusion, dessiner les deux path ci-dessus côte à côte.