历史版本。 PostgreSQL 8.0 已结束支持。 请参阅 当前版本手册.
9.10. 几何函数和操作符 #
几何类型point、box、lseg、line、path、polygon和circle有大量内置支持函数和操作符,如表 9.28、表 9.29和表 9.30中所示。
表 9.28. 几何操作符
| Operator | 描述 | 示例 |
|---|---|---|
+ | Translation | box '((0,0),(1,1))' + point '(2.0,0)' |
- | Translation | box '((0,0),(1,1))' - point '(2.0,0)' |
* | Scaling/rotation | box '((0,0),(1,1))' * point '(2.0,0)' |
/ | Scaling/rotation | 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))' |
&< | 是否未超出对方的右边界? | 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 '((5,0),1)' |
>> | 是否位于右侧? | circle '((5,0),1)' >> circle '((0,0),1)' |
<^ | 是否位于下方? | 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))' |
表 9.29. 几何函数
| Function | Return Type | 描述 | 示例 |
|---|---|---|---|
| double precision | 面积 | area(box '((0,0),(1,1))') |
| box | 交集矩形框 | box_intersect(box '((0,0),(1,1))',box '((0.5,0.5),(2,2))') |
| point | 中心 | center(box '((0,0),(1,2))') |
| double precision | 圆的直径 | diameter(circle '((0,0),2.0)') |
| double precision | 矩形框的竖直尺寸 | height(box '((0,0),(1,1))') |
| boolean | 是否为闭合路径? | isclosed(path '((0,0),(1,1),(2,0))') |
| boolean | 是否为开放路径? | isopen(path '[(0,0),(1,1),(2,0)]') |
| double precision | 长度 | length(path '((-1,0),(1,0))') |
| integer | 点数 | npoints(path '[(0,0),(1,1),(2,0)]') |
| integer | 点数 | npoints(polygon '((1,1),(0,0))') |
| path | 将路径转换为闭合路径 | pclose(path '[(0,0),(1,1),(2,0)]') |
| path | 将路径转换为开放路径 | popen(path '((0,0),(1,1),(2,0))') |
| double precision | 圆的半径 | radius(circle '((0,0),2.0)') |
| double precision | 矩形框的水平尺寸 | width(box '((0,0),(1,1))') |
表 9.30. 几何类型转换函数
| Function | Return Type | 描述 | 示例 |
|---|---|---|---|
| box | 将点转换为矩形框 | box(circle '((0,0),2.0)') |
| box | 将点转换为矩形框 | box(point '(0,0)', point '(1,1)') |
| box | 将点转换为矩形框 | box(polygon '((0,0),(1,1),(2,0))') |
| circle | 由圆心和半径构造圆 | circle(box '((0,0),(1,1))') |
| circle | 由圆心和半径构造圆 | circle(point '(0,0)', 2.0) |
| lseg | 由点构造线段 | lseg(box '((-1,0),(1,0))') |
| lseg | 由点构造线段 | lseg(point '(-1,0)', point '(1,0)') |
| path | polygon to path | path(polygon '((0,0),(1,1),(2,0))') |
| point | 交集 | point(23.4, -44.5) |
| point | 交集 | point(box '((-1,0),(1,0))') |
| point | 交集 | point(circle '((0,0),2.0)') |
| point | 交集 | point(lseg '((-1,0),(1,0))') |
| point | 交集 | point(lseg '((-1,0),(1,0))', lseg '((-2,-2),(2,2))') |
| point | 交集 | point(polygon '((0,0),(1,1),(2,0))') |
| polygon | 将圆转换为 12 个顶点的多边形 | polygon(box '((0,0),(1,1))') |
| polygon | 将圆转换为 12 个顶点的多边形 | polygon(circle '((0,0),2.0)') |
| polygon | 圆转换为npts个点的多边形 | polygon(12, circle '((0,0),2.0)') |
| polygon | 将圆转换为 12 个顶点的多边形 | 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 类型。对于 path 数据类型,只有当 path 中的点构成的路径不自相交时,area 函数才能工作。例如,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 并排画在方格纸上。