选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0
历史版本PostgreSQL 9.2 已于 2017 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本

9.11. 几何函数和操作符 #

几何类型pointboxlseglinepathpolygoncircle有大量内置支持函数和操作符,如表 9.31表 9.32表 9.33中所示。

小心

注意,相同操作符 ~= 表示 pointboxpolygoncircle 类型通常意义上的相等。其中一些类型也有 = 操作符,但 = 仅比较面积是否相等。这些类型的其他标量比较操作符(<= 等)同样比较面积。

表 9.31. 几何操作符

操作符 描述 示例
+ 平移 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)'
# 相交的点或矩形框 box '((1,-1),(-1,1))' # box '((1,1),(-2,-2))'
# 路径或多边形中的点数 # path '((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 '((0,0),(3,3))' <<| box '((3,4),(5,5))'
|>> 是否严格位于上方? box '((3,4),(5,5))' |>> box '((0,0),(3,3))'
&<| 是否未超出对方的上边界? 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 '((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))'

注意

PostgreSQL 8.2 之前,包含操作符 @><@ 分别称为 ~@。这些名称仍然可用,但已被弃用,最终将被移除。

表 9.32. 几何函数

函数 返回类型 描述 示例
area(object) double precision 面积 area(box '((0,0),(1,1))')
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(path) 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.33. 几何类型转换函数

函数 返回类型 描述 示例
box(circle) box 将圆转换为矩形框 box(circle '((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)
circle(polygon) circle 将多边形转换为圆 circle(polygon '((0,0),(1,1),(2,0))')
lseg(box) lseg 将矩形框的对角线转换为线段 lseg(box '((-1,0),(1,0))')
lseg(point, point) lseg 由点构造线段 lseg(point '(-1,0)', point '(1,0)')
path(polygon) path 将多边形转换为路径 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(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 函数适用于 boxcirclepath 类型。对于 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 并排画在方格纸上。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。