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.33, « Opérateurs géométriques », le Tableau 9.34, « Fonctions géométriques » et le Tableau 9.35, « Fonctions de conversion de types géométriques ».
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.33. 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 | box '((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 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))' |
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.34. 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)') |
box(point) | box | point sur une boîte vide | box(point '(0,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))') |
bound_box(box, box) | box | boîtes vers une boîte enveloppante | bound_box(box '((0,0),(1,1))', box '((3,3),(4,4))') |
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.35. 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)') |
circle(box) | 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))') |
line(point, point) | line | points to line | line(point '(-1,0)', point '(1,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.