↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1
历史版本。 PostgreSQL 8.1 已结束支持。 请参阅 当前版本手册.

9.10. 几何函数和操作符 #

几何类型point、box、lseg、line、path、polygon和circle有大量内置支持函数和操作符,如表 9.28、表 9.29和表 9.30中所示。

小心

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

表 9.28. 几何操作符

Operator描述示例
+ Translationbox '((0,0),(1,1))' + point '(2.0,0)'
- Translationbox '((0,0),(1,1))' - point '(2.0,0)'
* Scaling/rotationbox '((0,0),(1,1))' * point '(2.0,0)'
/ Scaling/rotationbox '((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))'
<< 是否严格位于左侧?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))'

表 9.29. 几何函数

FunctionReturn Type描述示例
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.30. 几何类型转换函数

FunctionReturn Type描述示例
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)pathpolygon to pathpath(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将圆转换为 12 个顶点的多边形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将圆转换为 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 并排画在方格纸上。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.