几何函数和操作符
几何函数和操作符#
9.11. 几何函数和操作符
几何类型point、box、
lseg、line、path、
polygon和circle有一大堆本地支持函数和操作符,如表 9.34、表 9.35和表 9.36中所示。
小心
小心
请注意“same
as”操作符(~=),表示point、box、polygon和circle类型的一般相等概念。这些类型中的某些还有一个=操作符,但是=只比较相同的面积。其它的标量比较操作符
(<=等等)也是为这些类型比较面积。
表 9.34. 几何操作符
| 操作符 | 描述 | 例子 | 
|---|---|---|
| 
 | 平移 | 
 | 
| 
 | 平移 | 
 | 
| 
 | 缩放/旋转 | 
 | 
| 
 | 缩放/旋转 | 
 | 
| 
 | 相交的点或方框 | 
 | 
| 
 | 路径或多边形中的点数 | 
 | 
| 
 | 长度或周长 | `` @-@ path ‘((0,0),(1,0))’`` | 
| 
 | 中心 | 
 | 
| 
 | 第二个操作 数上最接近第一个操作数的点 | 
 | 
| 
 | 距离 | 
 | 
| 
 | 是否重叠?( 只要有一个公共点这就为真) | 
 | 
| 
 | 是否严格地在左侧? | 
 | 
| 
 | 是否严格地在右侧? | 
 | 
| 
 | 没有延展到右边? | 
 | 
| 
 | 没有延展到左边? | 
 | 
| 
 | 严格在下? | 
 | 
| 
 | 严格在上? | |
| 
 | 没有延展到上面? | 
 | 
| 
 | 没有延展到下面? | |
| 
 | 在下面(允许相切)? | 
 | 
| 
 | 在上面(允许相切)? | 
 | 
| 
 | 相交? | 
 | 
| 
 | 水平? | `` ?- lseg ‘((-1,0),(1,0))’`` | 
| 
 | 水平对齐? | 
 | 
| 
 | 垂直? | `` ?| lseg ‘((-1,0),(1,0))’`` | 
| 
 | 垂直对齐? | 
 | 
| 
 | 相互垂直? | 
 | 
| 
 | 平行? | 
 | 
| 
 | 包含? | 
 | 
| 
 | 包含在内或在上? | 
 | 
| 
 | 相同? | `` polygon ‘((0,0),(1,1))’ ~= 
 | 
备注
注意
在PostgreSQL之前,包含操作符@>和<@被分别称为~和@。
这些名字仍然可以使用,但是已被废除并且最终将被移除。
表 9.35. 几何函数
| 函数 | 返回类型 | 描述 | 例子 | 
|---|---|---|---|
| `` area(object``) | 
 | 面积 | ` area(box ‘((0 ,0),(1,1))’)` | 
| 
 | 
 | 中心 | 
 | 
| 
 | 
 | 圆的直径 | 
 | 
| ` height(box`) | 
 | 方框的垂直尺寸 | 
 | 
| 
 | 
 | 一个封闭路径? | 
 | 
| `` isopen(path``) | 
 | 一个开放路径? | 
 | 
| 
 | 
 | 长度 | 
 | 
| 
 | 
 | 点数 | 
 | 
| 
 | 
 | 点数 | 
 | 
| `` pclose(path``) | 
 | 将路 径转换成封闭的 | 
 | 
| ` popen(path`) | 
 | 将 路径转换成开放 | 
 | 
| 
 | 
 | 圆的半径 | 
 | 
| 
 | 
 | 方框的水平尺寸 | `` width(box ‘((0 ,0),(1,1))’)`` | 
表 9.36. 几何类型转换函数
| 函数 | 返回类型 | 描述 | 例子 | 
|---|---|---|---|
| 
 | 
 | 圆到方框 | 
 | 
| 
 | 
 | 点到空方框 | 
 | 
| 
 | 
 | 点到方框 | 
 | 
| ` box(polygon`) | 
 | 多边形到方框 | 
 | 
| 
 | 
 | 方框到外包框 | 
 | 
| 
 | 
 | 方框到圆 | ` circle(box ‘(( 0,0),(1,1))’)` | 
| ``
circle(point``,
 | 
 | 中心和半径到圆 | 
 | 
| 
 | 
 | 多边形到圆 | 
 | 
| 
 | 
 | 点到线 | 
 | 
| 
 | 
 | 方 框对角线到线段 | 
 | 
| 
 | 
 | 点到线段 | 
 | 
| `` path(polygon``) | 
 | 多边形到路径 | 
 | 
| 
 
 
 | 
 | 构造点 | 
 | 
| 
 | 
 | 方框的中心 | ` point(box ‘((- 1,0),(1,0))’)` | 
| `` point(circle``) | 
 | 圆的中心 | ` point(circle ‘ ((0,0),2.0)’)` | 
| 
 | 
 | 线段的中心 | `` point(lseg ‘((- 1,0),(1,0))’)`` | 
| 
 | 
 | 多边形的中心 | 
 | 
| ` polygon(box`) | 
 | 方框到4点多边形 | `` polygon(box ‘(( 0,0),(1,1))’)`` | 
| 
 | 
 | 圆到12点多边形 | 
 | 
| ``
polygon(npts``,
 | 
 | 点到``np ts``点多边形 | 
 | 
| `` polygon(path``) | 
 | 路径到多边形 | 
 | 
我们可以把一个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都画在一张图纸上,你就明白了。