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.
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é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.35. 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.36. 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.