几何函数和操作符
几何函数和操作符#
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都画在一张图纸上,你就明白了。