PostgreSQLLa base de données la plus sophistiquée au monde.

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.31, « Opérateurs géométriques », le Tableau 9.32, « Fonctions géométriques » et le Tableau 9.33, « Fonctions de conversion de types géométriques ».

[Attention]

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 de comparaison scalaires (<= et autres) comparent de la même façon des aires pour ces types.

Tableau 9.31. Opérateurs géométriques

Opérateur Description Exemple
+ Translation box '((0,0),(1,1))' + point '(2.0,0)'
- Translation box '((0,0),(1,1))' - point '(2.0,0)'
* Mise à l'échelle/rotation box '((0,0),(1,1))' * point '(2.0,0)'
/ Mise à l'échelle/rotation box '((0,0),(2,2))' / point '(2.0,0)'
# Point ou boîte d'intersection '((1,-1),(-1,1))' # '((1,1),(-1,-1))'
# Nombre de points dans le chemin ou le polygone # '((1,0),(0,1),(-1,0))'
@-@ Longueur ou circonférence @-@ path '((0,0),(1,0))'
@@ Centre @@ circle '((0,0),10)'
## Point de la seconde opérande le plus proche de la première point '(0,0)' ## lseg '((2,0),(0,2))'
<-> Distance entre circle '((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]

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.32. Fonctions géométriques

Fonction Type de retour Description Exemple
area (object) double precision aire area(box '((0,0),(1,1))')
center (object) point centre center(box '((0,0),(1,2))')
diameter(circle) double precision diamètre du cercle diameter(circle '((0,0),2.0)')
height(box) double precision taille verticale (hauteur) de la boîte height(box '((0,0),(1,1))')
isclosed(path) boolean chemin fermé ? isclosed(path '((0,0),(1,1),(2,0))')
isopen(path) boolean chemin ouvert ? isopen(path '[(0,0),(1,1),(2,0)]')
length(object) double precision longueur length(path '((-1,0),(1,0))')
npoints(path) int nombre de points npoints(path '[(0,0),(1,1),(2,0)]')
npoints(polygon) int nombre de points npoints(polygon '((1,1),(0,0))')
pclose(path) path convertit un chemin en chemin fermé pclose(path '[(0,0),(1,1),(2,0)]')
popen(path) path convertit un chemin en chemin ouvert popen(path '((0,0),(1,1),(2,0))')
radius(circle) double precision rayon du cercle radius(circle '((0,0),2.0)')
width(box) double precision taille horizontale (largeur) d'une boîte width(box '((0,0),(1,1))')

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

Fonction Type de retour Description Exemple
box(circle) box cercle vers boîte box(circle '((0,0),2.0)')
box(point, point) box points vers boîte box(point '(0,0)', point '(1,1)')
box(polygon) box polygone vers boîte box(polygon '((0,0),(1,1),(2,0))')
circle(box) circle boîte vers cercle circle(box '((0,0),(1,1))')
circle(point, double precision) circle centre et rayon vers cercle circle(point '(0,0)', 2.0)
circle(polygon) circle polygone vers cercle circle(polygon '((0,0),(1,1),(2,0))')
lseg(box) lseg diagonale de boîte vers segment de ligne lseg(box '((-1,0),(1,0))')
lseg(point, point) lseg points vers segment de ligne lseg(point '(-1,0)', point '(1,0)')
path(polygon) path polygone vers chemin path(polygon '((0,0),(1,1),(2,0))')
point(double precision, double precision) point point de construction point(23.4, -44.5)
point(box) point centre de la boîte point(box '((-1,0),(1,0))')
point(circle) point centre du cercle point(circle '((0,0),2.0)')
point(lseg) point centre de segment de ligne point(lseg '((-1,0),(1,0))')
point(polygon) point centre de polygone point(polygon '((0,0),(1,1),(2,0))')
polygon(box) polygon boîte vers polygone à quatre points polygon(box '((0,0),(1,1))')
polygon(circle) polygon cercle vers polygone à 12 points polygon(circle '((0,0),2.0)')
polygon(npts, circle) polygon cercle vers polygone à npts points polygon(12, circle '((0,0),2.0)')
polygon(path) polygon chemin vers polygone polygon(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 sources de confusion, dessiner les deux path ci-dessus côte-à-côte.