Skip to content

9.11. 几何函数和运算符# ​

几何类型point、box、lseg、line、path、polygon和circle有一组大量的原生支持函数和运算符,如表 9.36、表 9.37和表 9.38所示。

表 9.36. 几何运算符

运算符

说明

示例

geometric_type + point → geometric_type

将第二个 point 的坐标添加到第一个参数的每个点的坐标,从而执行平移。适用于 point、box、path、circle。

box '(1,1),(0,0)' + point '(2,0)' → (3,1),(2,0)

path + path → path

连接两个开放路径(如果任一路径闭合,则返回 NULL)。

path '[(0,0),(1,1)]' + path '[(2,2),(3,3),(4,4)]' → [(0,0),(1,1),(2,2),(3,3),(4,4)]

geometric_type - point → geometric_type

从第一个参数的每个点的坐标中减去第二个 point 的坐标,从而执行平移。适用于 point、box、path、circle。

box '(1,1),(0,0)' - point '(2,0)' → (-1,1),(-2,0)

geometric_type * point → geometric_type

将第一个参数的每个点乘以第二个 point(将点视为由实部和虚部表示的复数,并执行标准复数乘法)。如果将第二个 point 解释为向量,则这相当于按向量的长度缩放对象的大小和与原点的距离,并按向量与 x 轴的角度逆时针旋转对象。适用于 point、box、[a] path、circle。

path '((0,0),(1,0),(1,1))' * point '(3.0,0)' → ((0,0),(3,0),(3,3))

path '((0,0),(1,0),(1,1))' * point(cosd(45), sind(45)) → ((0,0),​(0.7071067811865475,0.7071067811865475),​(0,1.414213562373095))

geometric_type / point → geometric_type

将第一个参数的每个点除以第二个点(将点视为由实部和虚部表示的复数,并执行标准复数除法)。如果将第二个点解释为一个向量,则这相当于按向量的长度将对象的尺寸和与原点的距离缩小,并按向量与x 轴的夹角顺时针旋转该对象。适用于 点、框、[a] 路径、圆。

路径 '((0,0),(1,0),(1,1))' / 点 '(2.0,0)' → ((0,0),(0.5,0),(0.5,0.5))

路径 '((0,0),(1,0),(1,1))' / 点(cosd(45), sind(45)) → ((0,0),​(0.7071067811865476,-0.7071067811865476),​(1.4142135623730951,0))

@-@ 几何类型 → 双精度

计算总长度。适用于 线段、路径。

@-@ 路径 '[(0,0),(1,0),(1,1)]' → 2

@@ 几何类型 → 点

计算中心点。适用于 框、线段、多边形、圆。

@@ 框 '(2,2),(0,0)' → (1,1)

# 几何类型 → 整数

返回点的数量。适用于 路径、多边形。

# 路径 '((1,0),(0,1),(-1,0))' → 3

几何类型 # 几何类型 → 点

计算交点,如果没有交点,则返回 NULL。适用于 线段、线。

线段 '[(0,0),(1,1)]' # 线段 '[(1,0),(0,1)]' → (0.5,0.5)

框 # 框 → 框

计算两个框的交集,如果没有交集,则返回 NULL。

框 '(2,2),(-1,-1)' # 框 '(1,1),(-2,-2)' → (1,1),(-1,-1)

几何类型 ## 几何类型 → 点

计算第一个对象在第二个对象上最近的点。适用于以下类型对:(点、框)、(点、线段)、(点、线)、(线段、框)、(线段、线段)、(线、线段)。

点 '(0,0)' ## 线段 '[(2,0),(0,2)]' → (1,1)

几何类型 <-> 几何类型 → 双精度

计算对象之间的距离。适用于所有七种几何类型,所有 点 与其他几何类型的组合,以及以下类型的对:(框, 线段), (线段, 直线), (多边形, 圆)(以及换位情况)。

圆 '<(0,0),1>' <-> 圆 '<(5,0),1>' → 3

几何类型 @> 几何类型 → 布尔值

第一个对象是否包含第二个对象?适用于以下类型的对:(框, 点), (框, 框), (路径, 点), (多边形, 点), (多边形, 多边形), (圆, 点), (圆, 圆)。

圆 '<(0,0),2>' @> 点 '(1,1)' → 真

几何类型 <@ 几何类型 → 布尔值

第一个对象是否包含在或位于第二个对象中?适用于以下类型的对:(点, 框), (点, 线段), (点, 直线), (点, 路径), (点, 多边形), (点, 圆), (框, 框), (线段, 框), (线段, 直线), (多边形, 多边形), (圆, 圆)。

点 '(1,1)' <@ 圆 '<(0,0),2>' → 真

几何类型 && 几何类型 → 布尔值

这些对象是否重叠?(有一个公共点即为真。)适用于 框, 多边形, 圆。

box '(1,1),(0,0)' && box '(2,2),(0,0)' → t

geometric_type << geometric_type → boolean

第一个对象是否严格位于第二个对象的左侧?适用于 point、box、polygon、circle。

circle '<(0,0),1>' << circle '<(5,0),1>' → t

geometric_type >> geometric_type → boolean

第一个对象是否严格位于第二个对象的右侧?适用于 point、box、polygon、circle。

circle '<(5,0),1>' >> circle '<(0,0),1>' → t

geometric_type &< geometric_type → boolean

第一个对象是否不延伸到第二个对象的右侧?适用于 box、polygon、circle。

box '(1,1),(0,0)' &< box '(2,2),(0,0)' → t

geometric_type &> geometric_type → boolean

第一个对象是否不延伸到第二个对象的左侧?适用于 box、polygon、circle。

box '(3,3),(0,0)' &> box '(2,2),(0,0)' → t

geometric_type <<| geometric_type → boolean

第一个对象是否严格位于第二个对象的下方?适用于 point、box、polygon、circle。

box '(3,3),(0,0)' <<| box '(5,5),(3,4)' → t

geometric_type |>> geometric_type → boolean

第一个对象是否严格位于第二个对象的上方?适用于 point、box、polygon、circle。

box '(5,5),(3,4)' |>> box '(3,3),(0,0)' → t

geometric_type &<| geometric_type → boolean

第一个对象是否不延伸到第二个对象的下方?适用于 box、polygon、circle。

box '(1,1),(0,0)' &<| box '(2,2),(0,0)' → t

几何类型 |&> 几何类型 → 布尔值

第一个对象是否不延伸到第二个对象下方?适用于 框、多边形、圆。

框 '(3,3),(0,0)' |&> 框 '(2,2),(0,0)' → t

框 <^ 框 → 布尔值

第一个对象是否在第二个对象下方(允许边缘相切)?

框 '((1,1),(0,0))' <^ 框 '((2,2),(1,1))' → t

框 >^ 框 → 布尔值

第一个对象是否在第二个对象上方(允许边缘相切)?

框 '((2,2),(1,1))' >^ 框 '((1,1),(0,0))' → t

几何类型 ?# 几何类型 → 布尔值

这些对象是否相交?适用于以下类型的对:(框、框)、(线段、框)、(线段、线段)、(线段、直线)、(直线、框)、(直线、直线)、(路径、路径)。

线段 '[(-1,0),(1,0)]' ?# 框 '(2,2),(-2,-2)' → t

?- 直线 → 布尔值

?- 线段 → 布尔值

直线是否水平?

?- 线段 '[(-1,0),(1,0)]' → t

点 ?- 点 → 布尔值

点是否水平对齐(即,y 坐标相同)?

点 '(1,0)' ?- 点 '(0,0)' → t

?| 直线 → 布尔值

?| 线段 → 布尔值

直线是否垂直?

?| 线段 '[(-1,0),(1,0)]' → f

点 ?| 点 → 布尔值

点是否垂直对齐(即,x 坐标相同)?

点 '(0,1)' ?| 点 '(0,0)' → t

线 ?-| 线 → 布尔值

线段 ?-| 线段 → 布尔值

线段是否垂直?

线段 '[(0,0),(0,1)]' ?-| 线段 '[(0,0),(1,0)]' → t

线 ?|| 线 → 布尔值

线段 ?|| 线段 → 布尔值

线段是否平行?

线段 '[(-1,0),(1,0)]' ?|| 线段 '[(-1,2),(1,2)]' → t

几何类型 ~= 几何类型 → 布尔值

这些对象是否相同?适用于 点、框、多边形、圆。

多边形 '((0,0),(1,1))' ~= 多边形 '((1,1),(0,0))' → t

[a] “旋转” 框时,这些运算符只会移动其角点:框仍被视为具有与轴平行的边。因此,框的大小不会保留,而真正的旋转会保留。

注意 ​

请注意,“相同于”运算符~=表示点、框、多边形和圆类型的通常相等概念。某些几何类型还具有=运算符,但=仅比较相等的面积。对于这些类型可用的其他标量比较运算符(<=等),同样比较面积。

注意

在PostgreSQL14 之前,点严格低于/高于比较运算符点``<<|``点和点``|>>``点分别称为<^和>^。这些名称仍然可用,但已弃用,最终将被移除。

表 9.37 几何函数

函数

说明

示例

面积 ( 几何类型 ) → 双精度

计算面积。适用于 box、path、circle。 path 输入必须闭合,否则返回 NULL。此外,如果 path 自相交,结果可能没有意义。

area(box '(2,2),(0,0)') → 4

center ( geometric_type ) → point

计算中心点。适用于 box、circle。

center(box '(1,2),(0,0)') → (0.5,1)

diagonal ( box ) → lseg

将框的对角线提取为线段(与 lseg(box) 相同)。

diagonal(box '(1,2),(0,0)') → [(1,2),(0,0)]

diameter ( circle ) → double precision

计算圆的直径。

diameter(circle '<(0,0),2>') → 4

height ( box ) → double precision

计算框的垂直大小。

height(box '(1,2),(0,0)') → 2

isclosed ( path ) → boolean

路径是否闭合?

isclosed(path '((0,0),(1,1),(2,0))') → t

isopen ( path ) → boolean

路径是否开放?

isopen(path '[(0,0),(1,1),(2,0)]') → t

length ( geometric_type ) → double precision

计算总长度。适用于 线段、路径。

length(path '((-1,0),(1,0))') → 4

npoints ( geometric_type ) → integer

返回点的数量。适用于 路径、多边形。

npoints(path '[(0,0),(1,1),(2,0)]') → 3

pclose ( path ) → path

将路径转换为闭合形式。

pclose(path '[(0,0),(1,1),(2,0)]') → ((0,0),(1,1),(2,0))

popen ( path ) → path

将路径转换为开放形式。

popen(path '((0,0),(1,1),(2,0))') → [(0,0),(1,1),(2,0)]

radius ( circle ) → double precision

计算圆的半径。

radius(circle '<(0,0),2>') → 2

slope ( point, point ) → double precision

计算通过两个点的直线的斜率。

slope(point '(0,0)', point '(2,1)') → 0.5

width ( box ) → double precision

计算盒子的水平大小。

width(box '(1,2),(0,0)') → 1

表 9.38 几何类型转换函数

函数

说明

示例

box ( circle ) → box

计算内切于圆的盒子。

box(circle '<(0,0),2>') → (1.414213562373095,1.414213562373095),​(-1.414213562373095,-1.414213562373095)

box ( point ) → box

将点转换为空盒子。

box(point '(1,0)') → (1,0),(1,0)

box ( 点, 点 ) → 框

将任意两个角点转换为框。

box(point '(0,1)', point '(1,0)') → (1,1),(0,0)

box ( 多边形 ) → 框

计算多边形的包围框。

box(polygon '((0,0),(1,1),(2,0))') → (2,1),(0,0)

bound_box ( 框, 框 ) → 框

计算两个框的包围框。

bound_box(box '(1,1),(0,0)', box '(4,4),(3,3)') → (4,4),(0,0)

circle ( 框 ) → 圆

计算包围框的最小圆。

circle(box '(1,1),(0,0)') → <(0.5,0.5),0.7071067811865476>

circle ( 点, 双精度 ) → 圆

根据圆心和半径构造圆。

circle(point '(0,0)', 2.0) → <(0,0),2>

circle ( 多边形 ) → 圆

将多边形转换为圆。圆的圆心是多边形各点的平均位置,半径是多边形各点到圆心的平均距离。

circle(polygon '((0,0),(1,3),(2,0))') → <(1,1),1.6094757082487299>

line ( 点, 点 ) → 线

将两个点转换为通过这两个点的线。

line(point '(-1,0)', point '(1,0)') → {0,-1,0}

lseg ( 框 ) → 线段

将框的对角线作为线段提取出来。

lseg(box '(1,0),(-1,0)') → [(1,0),(-1,0)]

lseg ( 点, 点 ) → 线段

根据两个端点构造线段。

lseg(point '(-1,0)', point '(1,0)') → [(-1,0),(1,0)]

path ( polygon ) → path

将多边形转换为具有相同点列表的闭合路径。

path(polygon '((0,0),(1,1),(2,0))') → ((0,0),(1,1),(2,0))

point ( double precision, double precision ) → point

根据其坐标构建点。

point(23.4, -44.5) → (23.4,-44.5)

point ( box ) → point

计算盒子的中心。

point(box '(1,0),(-1,0)') → (0,0)

point ( circle ) → point

计算圆的中心。

point(circle '<(0,0),2>') → (0,0)

point ( lseg ) → point

计算线段的中心。

point(lseg '[(-1,0),(1,0)]') → (0,0)

point ( polygon ) → point

计算多边形的中心(多边形点的中心位置)。

point(polygon '((0,0),(1,1),(2,0))') → (1,0.3333333333333333)

polygon ( box ) → polygon

将盒子转换为 4 点多边形。

polygon(box '(1,1),(0,0)') → ((0,0),(0,1),(1,1),(1,0))

polygon ( circle ) → polygon

将圆转换为 12 点多边形。

polygon(circle '<(0,0),2>') → ((-2,0),​(-1.7320508075688774,0.9999999999999999),​(-1.0000000000000002,1.7320508075688772),​(-1.2246063538223773e-16,2),​(0.9999999999999996,1.7320508075688774),​(1.732050807568877,1.0000000000000007),​(2,2.4492127076447545e-16),​(1.7320508075688776,-0.9999999999999994),​(1.0000000000000009,-1.7320508075688767),​(3.673819061467132e-16,-2),​(-0.9999999999999987,-1.732050807568878),​(-1.7320508075688767,-1.0000000000000009))

polygon ( integer, circle ) → polygon

将圆转换为一个 n 点多边形。

polygon(4, circle '<(3,0),1>') → ((2,0),​(3,1),​(4,1.2246063538223773e-16),​(3,-1))

polygon ( path ) → polygon

将闭合路径转换为具有相同点列表的多边形。

polygon(path '((0,0),(1,1),(2,0))') → ((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值的数组。