Postgresql 中文操作指南
9.11. Geometric Functions and Operators #
几何类型_point_、box、lseg、line、path、_polygon_和_circle_有一组原生支持函数和运算符,显示在 Table 9.36、 Table 9.37和 Table 9.38中。
Table 9.36. Geometric Operators
[id="a",role="bare"]#FUNCTIONS-GEOMETRY-ROTATION-FN [id="a"] 对于这些运算符来说,“旋转”盒子只会移动它的角点,盒子仍被认为具有平行于轴的边的属性。因此,盒子的尺寸不会被保存,而真正的旋转操作会做到这一点。
Caution
请注意,“与相同”算子 ~= 表示 point、box、polygon 和 circle 类型的通常相等概念。一些几何类型也具有 = 算子,但 = 仅用于比较相等的 areas。其他标量比较算子(⇐ 等),对于这些类型可用时,同样比较区域。
Note
在 PostgreSQL 14 之前,点严格低于/高于比较运算符 point <<| point,而 point |>> point 分别称为 <^ 和 >^。这些名称仍然可用,但已弃用,并且最终将被删除。
Table 9.37. Geometric Functions
Function Description Example(s) |
area ( geometric_type ) → double precision 计算区域。适用于 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 计算总长度。适用于 lseg 、 path 。 length(path '-1,0),(1,0') → 4 |
npoints ( geometric_type ) → integer 返回点数。适用于 path 、 polygon 。 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 |
Table 9.38. Geometric Type Conversion Functions
Function Description Example(s) |
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 ( point , point ) → box 将任意两个角点转换为盒子。 box(point '(0,1)', point '(1,0)') → (1,1),(0,0) |
box ( polygon )→ box 计算多边形的包围框。 box(polygon '0,0),(1,1),(2,0') → (2,1),(0,0) |
bound_box ( box , box )→ box 计算两个矩形的包围框。 bound_box(box '(1,1),(0,0)', box '(4,4),(3,3)') → (4,4),(0,0) |
circle ( box )→ circle 计算包围矩形的最小圆。 circle(box '(1,1),(0,0)') → <(0.5,0.5),0.7071067811865476> |
circle ( point , double precision )→ circle 根据圆心和半径创建圆。 circle(point '(0,0)', 2.0) → <(0,0),2> |
circle ( polygon )→ circle 将多边形转换为圆。圆的圆心是多边形各点的平均位置,半径是多边形各点至此圆心的平均距离。 circle(polygon '0,0),(1,3),(2,0') → <(1,1),1.6094757082487299> |
line ( point , point )→ line 将两点转换为通过这两点的直线。 line(point '(-1,0)', point '(1,0)') → {0,-1,0} |
lseg ( box )→ lseg 提取矩形的对角线作为线段。 lseg(box '(1,0),(-1,0)') → [(1,0),(-1,0)] |
lseg ( point , point )→ 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_值构成的数组来处理。