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, le Tableau 9.34 et le Tableau 9.35.
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.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 second opérande le plus proche du premier | 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 |
|---|---|---|---|
| double precision | aire | area(box '((0,0),(1,1))') |
| point | centre | center(box '((0,0),(1,2))') |
| double precision | diamètre du cercle | diameter(circle '((0,0),2.0)') |
| box | point sur une boîte vide | box(point '(0,0)') |
| double precision | taille verticale (hauteur) de la boîte | height(box '((0,0),(1,1))') |
| boolean | chemin fermé ? | isclosed(path '((0,0),(1,1),(2,0))') |
| boolean | chemin ouvert ? | isopen(path '[(0,0),(1,1),(2,0)]') |
| double precision | longueur | length(path '((-1,0),(1,0))') |
| int | nombre de points | npoints(path '[(0,0),(1,1),(2,0)]') |
| int | nombre de points | npoints(polygon '((1,1),(0,0))') |
| path | convertit un chemin en chemin fermé | pclose(path '[(0,0),(1,1),(2,0)]') |
| path | convertit un chemin en chemin ouvert | popen(path '((0,0),(1,1),(2,0))') |
| box | boîtes vers une boîte enveloppante | bound_box(box '((0,0),(1,1))', box '((3,3),(4,4))') |
| double precision | rayon du cercle | radius(circle '((0,0),2.0)') |
| 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
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.