Documentation PostgreSQL 8.1.23 > Langage SQL > Fonctions et opérateurs > Fonctions et opérateurs géométriques | |
Fonctions et opérateurs pour date/heure | Fonctions et opérateurs pour le type des adresses réseau |
Les types géométriques point, box, lseg, line, path, polygon et circle ont un large ensemble de fonctions et opérateurs natifs, affichés dans le Tableau 9.28, « Opérateurs géométriques », le Tableau 9.29, « Fonctions géométriques » et le Tableau 9.30, « Fonctions de conversion d'un type géométrique ».
Notez que l'opérateur « identique à », ~=, représente la notion habituelle d'égalité pour les types point, box, polygon et circle. Quelques-uns de ces types ont aussi un opérateur = mais = compare seulement des aires égales. Les autres opérateurs de comparaison scalaires (<= et ainsi de suite) comparent de la même façon des aires pour ces types.
Tableau 9.28. 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)' |
* | Échelle/rotation | box '((0,0),(1,1))' * point '(2.0,0)' |
/ | É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 le plus proche entre le premier et le second opérande | point '(0,0)' ## lseg '((2,0),(0,2))' |
<-> | Distance entre | circle '((0,0),1)' <-> circle '((5,0),1)' |
<< | Est strictement à gauche de ? | circle '((0,0),1)' << circle '((5,0),1)' |
>> | Est strictement à droite de ? | circle '((5,0),1)' >> circle '((0,0),1)' |
&& | Surcharge ? | box '((0,0),(1,1))' && box '((0,0),(2,2))' |
&< | 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 ? | 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-ils alignés horizontalement ? | point '(1,0)' ?- point '(0,0)' |
?| | Vertical ? | ?| lseg '((-1,0),(1,0))' |
?| | Sont-ils verticalement alignés ? | point '(0,1)' ?| point '(0,0)' |
?-| | Perpendiculaire ? | lseg '((0,0),(0,1))' ?-| lseg '((0,0),(1,0))' |
?|| | Parallèle ? | lseg '((-1,0),(1,0))' ?|| lseg '((-1,2),(1,2))' |
~ | Contient ? | circle '((0,0),2)' ~ point '(1,1)' |
@ | Contenu ou contenant ? | point '(1,1)' @ circle '((0,0),2)' |
~= | Identique à ? | polygon '((0,0),(1,1))' ~= polygon '((1,1),(0,0))' |
Tableau 9.29. 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 d'un cercle | diameter(circle '((0,0),2.0)') |
height(box) | double precision | taille verticale d'une boîte | height(box '((0,0),(1,1))') |
isclosed(path) | boolean | un chemin fermé ? | isclosed(path '((0,0),(1,1),(2,0))') |
isopen(path) | boolean | un 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 | radius d'un cercle | radius(circle '((0,0),2.0)') |
width(box) | double precision | taille horizontale d'une boîte | width(box '((0,0),(1,1))') |
Tableau 9.30. Fonctions de conversion d'un type géométrique
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 radius 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 d'une boîte vers un segment de ligne | lseg(box '((-1,0),(1,0))') |
lseg(point, point) | lseg | points vers un segment de ligne | lseg(point '(-1,0)', point '(1,0)') |
path(polygon) | point | 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 d'un cercle | point(circle '((0,0),2.0)') |
point(lseg) | point | centre d'un segment de ligne | point(lseg '((-1,0),(1,0))') |
point(polygon) | point | centre d'un 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-point | 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 numéros composant d'un point comme si c'était un tableau avec les index 0 et 1. Par exemple, si t.p est une colonne de type point, alors SELECT p[0] FROM t récupère les coordonnées X et UPDATE t SET p[1] = ... modifie les coordonnées Y. De la même façon, une valeur de type box ou lseg pourrait être traitée comme un tableau de deux valeurs de type point.
La fonction area fonctionne pour les types box, circle et path. La fonction area fonctionne seulement pour le type de données path si les points dans le path ne se coupent pas. Par exemple, le path '((0,0),(0,1),(2,1),(2,2),(1,2),(1,0),(0,0))'::PATH ne fonctionne pas. Néanmoins, le path suivant, et visuellement identique, '((0,0),(0,1),(1,1),(1,2),(2,2),(2,1),(1,1),(1,0),(0,0))'::PATH fonctionnera. Si le concept d'intersection contre sans intersection du path est confus pour vous, dessinez les deux path ci-dessus côte-à-côte sur une partie d'un papier graphe.