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