选择 打开 改范围 完整检索页
受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10
当前 PostgreSQL 版本不在支持生命周期内。
您可以参阅当前版本的对应页面,或其他在上面列出的活跃大版本。

9.11. 几何函数和操作符 #

几何类型pointboxlseglinepathpolygoncircle有一大堆本地支持函数和操作符,如Table 9.34Table 9.35Table 9.36中所示。

Caution

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

Table 9.34. 几何操作符

操作符 描述 示例
+ 平移 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))'

Note

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

Table 9.35. 几何函数

函数 返回类型 描述 示例
area(object) double precision area area(box '((0,0),(1,1))')
center(object) point center 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 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))')

Table 9.36. 几何类型转换函数

函数 返回类型 描述 示例
box(circle) box 将圆转换为盒子 box(circle '((0,0),2.0)')
box(point) box 将点转换为空盒子 box(point '(0,0)')
box(point, point) box 将点转换为盒子 box(point '(0,0)', point '(1,1)')
box(polygon) box 将多边形转换为盒子 box(polygon '((0,0),(1,1),(2,0))')
bound_box(box, box) box 将多个盒子转换为包围盒 bound_box(box '((0,0),(1,1))', box '((3,3),(4,4))')
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))')
line(point, point) line 由点构造直线 line(point '(-1,0)', point '(1,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 并排画在方格纸上。