几何函数和操作符#

9.11. 几何函数和操作符

几何类型pointboxlseglinepathpolygoncircle有一大堆本地支持函数和操作符,如表 9.34表 9.35表 9.36中所示。

小心

小心

请注意“same as”操作符(~=),表示pointboxpolygoncircle类型的一般相等概念。这些类型中的某些还有一个=操作符,但是=只比较相同的面积。其它的标量比较操作符 (<=等等)也是为这些类型比较面积。

表 9.34. 几何操作符

操作符

描述

例子

+

平移

box '((0,0),( 1,1))' + point '(2.0,0)'

-

平移

box '((0,0),( 1,1))' - point '(2.0,0)'

*

缩放/旋转

box '((0,0),( 1,1))' * point '(2.0,0)'

/

缩放/旋转

box '((0,0),( 2,2))' / point '(2.0,0)'

#

相交的点或方框

``box ‘((1,-1),(-1,1))’

# box ‘((1,1),(-2,-2))’``

#

路径或多边形中的点数

# pat h '((1,0),(0,1),(-1,0))'

@-@

长度或周长

`` @-@ path ‘((0,0),(1,0))’``

@@

中心

@@ circle '((0,0),10)'

##

第二个操作 数上最接近第一个操作数的点

``point ‘(0,0)’

## lseg ‘((2,0),(0,2))’``

<->

距离

circle '((0,0),1) ' <-> circle '((5,0),1)'

&&

是否重叠?( 只要有一个公共点这就为真)

box '((0,0),(1,1)) ' && box '((0,0),(2,2))'

<<

是否严格地在左侧?

circle '((0,0),1 )' << circle '((5,0),1)'

>>

是否严格地在右侧?

circle '((5,0),1 )' >> circle '((0,0),1)'

&<

没有延展到右边?

box '((0,0),(1,1)) ' &< box '((0,0),(2,2))'

&>

没有延展到左边?

box '((0,0),(3,3)) ' &> box '((0,0),(2,2))'

<<|

严格在下?

``box ‘((0,0),(3,3))’

<<| box ‘((3,4),(5,5))’``

|>>

严格在上?

``box ‘((3,4),(5,5))’

|>> box ‘((0,0),(3,3))’``

&<|

没有延展到上面?

``box ‘((0,0),(1,1))’

&<| box ‘((0,0),(2,2))’``

|&>

没有延展到下面?

``box ‘((0,0),(3,3))’

|&> box ‘((0,0),(2,2))’``

<^

在下面(允许相切)?

circle '((0,0),1 )' <^ circle '((0,5),1)'

>^

在上面(允许相切)?

circle '((0,5),1 )' >^ circle '((0,0),1)'

?#

相交?

lseg '((-1,0),(1,0))' ?# box '((-2,-2),(2,2))'

?-

水平?

`` ?- lseg ‘((-1,0),(1,0))’``

?-

水平对齐?

point '(1,0)' ?- point '(0,0)'

?|

垂直?

`` ?| lseg ‘((-1,0),(1,0))’``

?|

垂直对齐?

point '(0,1)' ?| point '(0,0)'

?-|

相互垂直?

lseg '((0,0),(0,1))' ?-| lseg '((0,0),(1,0))'

?||

平行?

lseg '((-1,0),(1,0))' ? || lseg '((-1,2),(1,2))'

@>

包含?

circle '((0 ,0),2)' @> point '(1,1)'

<@

包含在内或在上?

point '(1,1 )' <@ circle '((0,0),2)'

~=

相同?

`` polygon ‘((0,0),(1,1))’ ~=

polygon ‘((1,1),(0,0))’``

备注

注意

在PostgreSQL之前,包含操作符@><@被分别称为~@。 这些名字仍然可以使用,但是已被废除并且最终将被移除。

表 9.35. 几何函数

函数

返回类型

描述

例子

`` area(object``)

doub le precision

面积

` area(box ‘((0 ,0),(1,1))’)`

ce nter(object)

point

中心

c enter(box '((0 ,0),(1,2))')

diam eter(circle)

doub le precision

圆的直径

diam eter(circle '( (0,0),2.0)')

` height(box`)

doub le precision

方框的垂直尺寸

h eight(box '((0 ,0),(1,1))')

is closed(path)

boolean

一个封闭路径?

isclosed(p ath '((0,0),(1 ,1),(2,0))')

`` isopen(path``)

boolean

一个开放路径?

isopen(p ath '[(0,0),(1 ,1),(2,0)]')

le ngth(object)

doub le precision

长度

len gth(path '((-1 ,0),(1,0))')

n points(path)

int

点数

npoints(p ath '[(0,0),(1 ,1),(2,0)]')

npoi nts(polygon)

int

点数

npoint s(polygon '((1 ,1),(0,0))')

`` pclose(path``)

path

将路 径转换成封闭的

pclose(p ath '[(0,0),(1 ,1),(2,0)]')

` popen(path`)

path

将 路径转换成开放

popen(p ath '((0,0),(1 ,1),(2,0))')

ra dius(circle)

doub le precision

圆的半径

ra dius(circle '( (0,0),2.0)')

width(box)

doub le precision

方框的水平尺寸

`` width(box ‘((0 ,0),(1,1))’)``

表 9.36. 几何类型转换函数

函数

返回类型

描述

例子

box(circle)

box

圆到方框

box(circle ' ((0,0),2.0)')

box(point)

box

点到空方框

box(p oint '(0,0)')

box(point, point)

box

点到方框

box(p oint '(0,0)', p oint '(1,1)')

` box(polygon`)

box

多边形到方框

box(po lygon '((0,0),( 1,1),(2,0))')

b ound_box(box, box)

box

方框到外包框

bound_bo x(box '((0,0),( 1,1))', box '(( 3,3),(4,4))')

circle(box)

circle

方框到圆

` circle(box ‘(( 0,0),(1,1))’)`

`` circle(point``, doub le precision)

circle

中心和半径到圆

circle(point '(0,0)', 2.0)

ci rcle(polygon)

circle

多边形到圆

circle(po lygon '((0,0),( 1,1),(2,0))')

line(point, point)

line

点到线

line(po int '(-1,0)', p oint '(1,0)')

lseg(box)

lseg

方 框对角线到线段

lseg(box '((- 1,0),(1,0))')

lseg(point, point)

lseg

点到线段

lseg(po int '(-1,0)', p oint '(1,0)')

`` path(polygon``)

path

多边形到路径

path(po lygon '((0,0),( 1,1),(2,0))')

point( ``double

precision``,

doub le precision)

point

构造点

point (23.4, -44.5)

point(box)

point

方框的中心

` point(box ‘((- 1,0),(1,0))’)`

`` point(circle``)

point

圆的中心

` point(circle ‘ ((0,0),2.0)’)`

point(lseg)

point

线段的中心

`` point(lseg ‘((- 1,0),(1,0))’)``

p oint(polygon)

point

多边形的中心

point(po lygon '((0,0),( 1,1),(2,0))')

` polygon(box`)

polygon

方框到4点多边形

`` polygon(box ‘(( 0,0),(1,1))’)``

po lygon(circle)

polygon

圆到12点多边形

p olygon(circle ' ((0,0),2.0)')

`` polygon(npts``, circle)

polygon

点到``np ts``点多边形

polyg on(12, circle ' ((0,0),2.0)')

`` polygon(path``)

polygon

路径到多边形

polygon (path '((0,0),( 1,1),(2,0))')

我们可以把一个point的两个组成数字当作具有索引 0 和 1 的数组访问。例如,如果t.p是一个point列,那么SELECT p[0] FROM t检索 X 座标而 UPDATE t SET p[1] = ...改变 Y 座标。同样,box或者lseg类型的值可以当作两个point值的数组值看待。

函数area可以用于类型boxcirclepatharea函数操作path数据类型的时候, 只有在path的点没有交叉的情况下才可用。例如,path '((0,0),(0,1),(2,1),(2,2),(1,2),(1,0),(0,0))'::PATH是不行的, 而下面的视觉上相同的 path '((0,0),(0,1),(1,1),(1,2),(2,2),(2,1),(1,1),(1,0),(0,0))'::PATH就可以。 如果交叉和不交叉的path概念让你疑惑,那么把上面两个path都画在一张图纸上,你就明白了。