> PostgreSQL9.6 中文手册 > 几何函数和操作符

9.11. 几何函数和操作符

几何类型pointboxlseglinepathpolygoncircle有一大堆本地支持函数和操作符,如表 9-33、表 9-34和表 9-35中所示。

小心

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

表 9-33. 几何操作符

操作符 描述 例子
+ 平移 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))'
# 路径或多边形中的点数 # path '((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-34. 几何函数

函数 返回类型 描述 例子
area(object) double precision 面积 area(box '((0,0),(1,1))')
center(object) point 中心 center(box '((0,0),(1,2))')
diameter(circle) double precision 圆的直径 diameter(circle '((0,0),2.0)')
height(box) double precision 方框的垂直尺寸 height(box '((0,0),(1,1))')
isclosed(path) boolean 一个封闭路径? isclosed(path '((0,0),(1,1),(2,0))')
isopen(path) boolean 一个开放路径? isopen(path '[(0,0),(1,1),(2,0)]')
length(object) double precision 长度 length(path '((-1,0),(1,0))')
npoints(path) int 点数 npoints(path '[(0,0),(1,1),(2,0)]')
npoints(polygon) int 点数 npoints(polygon '((1,1),(0,0))')
pclose(path) path 将路径转换成封闭的 pclose(path '[(0,0),(1,1),(2,0)]')
popen(path) path 将路径转换成开放 popen(path '((0,0),(1,1),(2,0))')
radius(circle) double precision 圆的半径 radius(circle '((0,0),2.0)')
width(box) double precision 方框的水平尺寸 width(box '((0,0),(1,1))')

表 9-35. 几何类型转换函数

函数 返回类型 描述 例子
box(circle) box 圆到方框 box(circle '((0,0),2.0)')
box(point) box 点到空方框 box(point '(0,0)')
box(point, point) box 点到方框 box(point '(0,0)', point '(1,1)')
box(polygon) box 多边形到方框 box(polygon '((0,0),(1,1),(2,0))')
bound_box(box, box) box 盒到边界框 bound_box(box '((0,0),(1,1))', box '((3,3),(4,4))')
circle(box) circle 方框到圆 circle(box '((0,0),(1,1))')
circle(point, double precision) circle 中心和半径到圆 circle(point '(0,0)', 2.0)
circle(polygon) circle 多边形到圆 circle(polygon '((0,0),(1,1),(2,0))')
line(point, point) line 点到线 line(point '(-1,0)', point '(1,0)')
lseg(box) lseg 方框对角线到线段 lseg(box '((-1,0),(1,0))')
lseg(point, point) lseg 点到线段 lseg(point '(-1,0)', point '(1,0)')
path(polygon) path 多边形到路径 path(polygon '((0,0),(1,1),(2,0))')
point(double precision, double 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))')
point(polygon) point 多边形的中心 point(polygon '((0,0),(1,1),(2,0))')
polygon(box) polygon 方框到4点多边形 polygon(box '((0,0),(1,1))')
polygon(circle) polygon 圆到12点多边形 polygon(circle '((0,0),2.0)')
polygon(npts, circle) polygon 点到npts点多边形 polygon(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都画在一张图纸上,你就明白了。