几何函数和操作符

From PostgreSQL 中文维基, PostgreSQL 中文站, PostgreSQL 中国社区, PostgreSQL Chinese community

Jump to: navigation, search

[编辑] 几何函数和操作符

有许多内置函数和操作符支持 几何类型point,box,lseg, line,path,polygon 和 circle 等, 在Table 9-28, Table 9-29,和 Table 9-30。

注意:请注意"相同"操作符,~=, 表示 point,box,polygon,和 circle 类型的一般意义的相同。这些类型有些还有一个 = 操作符, 不过它只是比较相同的面积。其它的标量比较操作符 (<= 等等)也是为这些类型比较面积。

表 9-28. 几何函数和操作符
操作符 描述 例子
+ 平移 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)'
# 交点或者交面 '((1,-1),(-1,1))' # '((1,1),(-1,-1))'
# 路径或多边形顶点数 # '((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 '((3,4),(5,5))'
|>> 严格在上? >> box '((0,0),(3,3))'
没有延伸到上面? box '((0,0),(2,2))'
|&> 没有延伸到下面? &> 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,0)'
垂直? 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))'
表 9-29. 几何函数
函数 返回类型 描述 例子
area(object) double precision 目标的面积 area(box '((0,0),(1,1))')
box_intersect(box, box) box 方的交 box_intersect(box '((0,0),(1,1))',box '((0.5,0.5),(2,2))')
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(polygon) 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-30. 几何类型转换函数
函数 返回类型 描述 例子
box(circle) box 将圆转换成长方形 box(cricle '((0,0),2.0)')
box(point, point) box 将点转换成长方形 box(point '(0,0)', point '(1,1)')
box(polygon) box 将多边形转换成长方形 box(polygon '((0,0),(1,1),(2,0))')
circle(box) circle 方转换成圆 circle(box '((0,0),(1,1))')
circle(point, double precision) circle 圆心和半径 circle(point '(0,0)',2.0)
lseg(box) lseg 长方形对角线转化成线段 lseg(box '((-1,0),(1,0))')
lseg(point, point) lseg 点转换成线段 lseg(point '(-1,0)',point '(1,0)')
path(polygon) point 多边形转换成路径 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(lseg, lseg) point 转换成点(相交) point(lseg '((-1,0),(1,0))', lseg '((-2,-2),(2,2))')
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 可以用于类型 box,circle,和 path。 area 函数操作 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 都画在一张纸上,你就明白了。

Personal tools