Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Funzioni e Operatori > Funzioni e operatori geometrici
PrecedenteFunzioni di supporto per enumFunzioni e operatori per indirizzi di reteSuccessivo

9.11. Funzioni e operatori geometrici

I tipi geometrici point, box, lseg, line, path, polygon e circle hanno un notevole insieme di funzioni e operatori nativi di supporto, mostrati nella tabella Tabella 9.30, «Operatori geometrici», nella Tabella 9.31, «Funzioni geometriche» e nella Tabella 9.32, «Funzioni di conversione per tipi geometrici».

[Attenzione]

Attenzione

Notare che l' operatore «uguale a», ~=, rappresenta la normale nozione di uguaglianza per i tipi point, box, polygon, e circle. Alcuni di questi tipi hanno anche un operatore =, ma = confronta solo per aree uguali. Similmente, gli altri operatori di confronto scalari (<= e così via) confrontano aree per questi tipi.

Tabella 9.30. Operatori geometrici

OperatoreDescrizioneEsempio
+ Traslazionebox '((0,0),(1,1))' + point '(2.0,0)'
- Traslazionebox '((0,0),(1,1))' - point '(2.0,0)'
* Scalatura/rotazionebox '((0,0),(1,1))' * point '(2.0,0)'
/ Scaling/rotationbox '((0,0),(2,2))' / point '(2.0,0)'
# Punto o box di intersezione'((1,-1),(-1,1))' # '((1,1),(-1,-1))'
# Numero di punti in un tracciato o poligono# '((1,0),(0,1),(-1,0))'
@-@ Lunghezza o circonferenza@-@ path '((0,0),(1,0))'
@@ Centro@@ circle '((0,0),10)'
## Punto più vicino al primo operando sul secondo operandopoint '(0,0)' ## lseg '((2,0),(0,2))'
<-> Distanza tracircle '((0,0),1)' <-> circle '((5,0),1)'
&& Si sovrappongono? (Un punto in comune lo rende true)box '((0,0),(1,1))' && box '((0,0),(2,2))'
<< È strettamente a sinistra di?circle '((0,0),1)' << circle '((5,0),1)'
>> È strettamente a destra di?circle '((5,0),1)' >> circle '((0,0),1)'
&< Non si estende alla destra di?box '((0,0),(1,1))' &< box '((0,0),(2,2))'
&> Non si estende alla sinistra di?box '((0,0),(3,3))' &> box '((0,0),(2,2))'
<<| È strettamente sotto?box '((0,0),(3,3))' <<| box '((3,4),(5,5))'
|>> È strettamente sopra?box '((3,4),(5,5))' |>> box '((0,0),(3,3))'
&<| Non si estende al di sopra?box '((0,0),(1,1))' &<| box '((0,0),(2,2))'
|&> Non si estende al di sotto?box '((0,0),(3,3))' |&> box '((0,0),(2,2))'
<^ È sotto (consente di toccare)?circle '((0,0),1)' <^ circle '((0,5),1)'
>^ È sopra (consente di toccare)?circle '((0,5),1)' >^ circle '((0,0),1)'
?# Interseca?lseg '((-1,0),(1,0))' ?# box '((-2,-2),(2,2))'
?- È orizzontale??- lseg '((-1,0),(1,0))'
?- Sono allineati orizzontalmente?point '(1,0)' ?- point '(0,0)'
?| È verticale??| lseg '((-1,0),(1,0))'
?| Sono allineati verticalmente?point '(0,1)' ?| point '(0,0)'
?-| È perpendicolare?lseg '((0,0),(0,1))' ?-| lseg '((0,0),(1,0))'
?|| Sono paralleli?lseg '((-1,0),(1,0))' ?|| lseg '((-1,2),(1,2))'
@> Contiene?circle '((0,0),2)' @> point '(1,1)'
<@ Contenuto dentro o su?point '(1,1)' <@ circle '((0,0),2)'
~= Stesso di?polygon '((0,0),(1,1))' ~= polygon '((1,1),(0,0))'

[Nota]

Nota

Prima di PostgreSQL™ 8.2, gli operatori di contenimento @> e <@ erano rispettivamente chiamati ~ e @. Questi nomi sono ancora disponibili, ma sono deprecati e saranno sicuramente rimossi.

Tabella 9.31. Funzioni geometriche

FunzioneTipo restituitoDescrizioneEsempio
area(object)double precisionareaarea(box '((0,0),(1,1))')
center(object)pointcentrocenter(box '((0,0),(1,2))')
diameter(circle)double precisiondiametro del cerchiodiameter(circle '((0,0),2.0)')
height(box)double precisiondimensione verticale del boxheight(box '((0,0),(1,1))')
isclosed(path)booleanun tracciato chiuso?isclosed(path '((0,0),(1,1),(2,0))')
isopen(path)booleanun tracciato aperto?isopen(path '[(0,0),(1,1),(2,0)]')
length(object)double precisionlunghezzalength(path '((-1,0),(1,0))')
npoints(path)intnumero di puntinpoints(path '[(0,0),(1,1),(2,0)]')
npoints(polygon)intnumero di puntinpoints(polygon '((1,1),(0,0))')
pclose(path)pathconverte il tracciato in chiusopclose(path '[(0,0),(1,1),(2,0)]')
popen(path)pathconverte il tracciato in apertopopen(path '((0,0),(1,1),(2,0))')
radius(circle)double precisionraggio del cerchioradius(circle '((0,0),2.0)')
width(box)double precisiondimensione orizzontale del boxwidth(box '((0,0),(1,1))')

Tabella 9.32. Funzioni di conversione per tipi geometrici

FunzioneTipo di ritornoDescrizioneEsempio
box(circle)boxda cerchio a boxbox(circle '((0,0),2.0)')
box(point, point)boxda punti a boxbox(point '(0,0)', point '(1,1)')
box(polygon)boxda poligono a boxbox(polygon '((0,0),(1,1),(2,0))')
circle(box)circleda box a cerchiocircle(box '((0,0),(1,1))')
circle(point, double precision)circleda centro e raggio a cerchiocircle(point '(0,0)', 2.0)
circle(polygon)circleda poligono a cerchiocircle(polygon '((0,0),(1,1),(2,0))')
lseg(box)lsegda diagonale di box a segmento di linealseg(box '((-1,0),(1,0))')
lseg(point, point)lsegda punti a segmento di linealseg(point '(-1,0)', point '(1,0)')
path(polygon)pointda poligono a tracciatopath(polygon '((0,0),(1,1),(2,0))')
point(double precision, double precision)pointcostruisce un puntopoint(23.4, -44.5)
point(box)pointcentro del boxpoint(box '((-1,0),(1,0))')
point(circle)pointcentro del cerchiopoint(circle '((0,0),2.0)')
point(lseg)pointcentro del segmento di lineapoint(lseg '((-1,0),(1,0))')
point(polygon)pointcentro del poligonopoint(polygon '((0,0),(1,1),(2,0))')
polygon(box)polygonda box a poligono di 4 puntipolygon(box '((0,0),(1,1))')
polygon(circle)polygonda cerchio a poligono da 12 puntipolygon(circle '((0,0),2.0)')
polygon(npts, , circle)polygonda cerchio a poligono di npts puntipolygon(12, circle '((0,0),2.0)')
polygon(path)polygonda tracciato a poligonopolygon(path '((0,0),(1,1),(2,0))')

È possibile accedere alle due componenti numeriche di un point come se fosse un array con indici 0 e 1. Per esempio, se t.p è una colonna point allora SELECT p[0] FROM t recupera la coordinata X e UPDATE t SET p[1] = ... cambia la coordinata Y. Nello stesso modo, un valore di tipo box o lseg può essere trattato come un array di due valori punto.

La funzione area funziona per i tipi box, circle, e path. La funzione area nei tipi di dato path funziona solo se i punti nel path sono non-intersecanti. Per esempio, path '((0,0),(0,1),(2,1),(2,2),(1,2),(1,0),(0,0))'::PATH non funzionerà; Tuttavia, il seguente path visivamente identico '((0,0),(0,1),(1,1),(1,2),(2,2),(2,1),(1,1),(1,0),(0,0))'::PATH funziona. Se il concetto di tracciato intersecante o non-intersecante è confuso, disegnare ambedue i percorsi visti sopra lato per lato su un pezzo di carta millimetrata.

Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Funzioni e Operatori > Funzioni e operatori geometrici
PrecedenteFunzioni di supporto per enumFunzioni e operatori per indirizzi di reteSuccessivo