几何函数和操作符
几何函数和操作符¶
几何类型point
、box
、 lseg
、line
、path
、polygon
和circle
有一些本地支持函数和操作符,如下文中所示。
注意
- 请注意“same as”操作符(
~=
),表示point
、box
、polygon
和circle
类型的一般相等概念。这些类型中的某些还有一个=
操作符,但是=
只比较相同的面积。其它的标量比较操作符(<=
等等)也是为这些类型比较面积。
几何操作符¶
+
¶
- 操作符
+
- 描述
- 平移
- 示例
- ``` sql
seaboxsql=# select box '((0,0),(1,1))' + point '(2.0,0)';
?column?
(3,1),(2,0) (1 row) ```
-
¶
- 操作符
-
- 描述
- 平移
- 示例
- ```
seaboxsql=# select box '((0,0),(1,1))' - point '(2.0,0)';
?column?
(-1,1),(-2,0) (1 row) ```
*
¶
- 操作符
*
- 描述
- 缩放/旋转
- 示例
- ```
seaboxsql=# select box '((0,0),(1,1))' * point '(2.0,0)';
?column?
(2,2),(0,0) (1 row) ```
/
¶
- 操作符
/
- 描述
- 缩放/旋转
- 示例
- ```
seaboxsql=# select box '((0,0),(1,1))' / point '(2.0,0)';
?column?
(0.5,0.5),(0,0) (1 row) ```
#
¶
- 操作符
#
- 描述
- 相交的点或方框,或返回路径或多边形的点数
- 示例
-
``` seaboxsql=# select box '((1,-1),(-1,1))' # box '((1,1),(-2,-2))'; ?column?
(1,1),(-1,-1) (1 row)seaboxsql=# select # path '((1,0),(0,1),(-1,0))'; ?column?
3
(1 row) ```
@-@
¶
- 操作符
@-@
- 描述
- 路径长度或多边形周长
- 示例
- ```
seaboxsql=# select @-@ path '((0,0),(1,0))';
?column?
2
(1 row) ```
@@
¶
- 操作符
@@
- 描述
- 获取图形的中心
- 示例
- ```
seaboxsql=# select @@ circle '((0,0),10)';
?column?
(0,0) (1 row) ```
##
¶
- 操作符
##
- 描述
- 第二个操作数上最接近第一个操作数的点
- 示例
- ```
seaboxsql=# select point '(0,0)' ## lseg '((2,0),(0,2))';
?column?
(1,1) (1 row) ```
<->
¶
- 操作符
<->
- 描述
- 距离
- 示例
- ```
seaboxsql=# select circle '((0,0),1)' <-> circle '((5,0),1)';
?column?
3 (1 row) ```
&&
¶
- 操作符
&&
- 描述
- 是否重叠?(只要有一个公共点就为真)
- 示例
- ```
seaboxsql=# select box '((0,0),(1,1))' && box '((0,0),(2,2))';
?column?
t (1 row) ```
<<
¶
- 操作符
<<
- 描述
- 是否严格地在左侧
- 示例
- ```
seaboxsql=# select circle '((0,0),1)' << circle '((5,0),1)';
?column?
t (1 row) ```
>>
¶
- 操作符
>>
- 描述
- 是否严格地在右侧
- 示例
- ```
seaboxsql=# select circle '((5,0),1)' >> circle '((0,0),1)';
?column?
t (1 row) ```
&<
¶
- 操作符
&<
- 描述
- 没有延展到右边?
- 示例
- ```
seaboxsql=# select box '((0,0),(1,1))' &< box '((0,0),(2,2))';
?column?
t (1 row) ```
&>
¶
- 操作符
&>
- 描述
- 没有延展到左边?
- 示例
- ```
seaboxsql=# select box '((0,0),(3,3))' &> box '((0,0),(2,2))';
?column?
t (1 row) ```
<<|
¶
- 操作符
<<|
- 描述
- 严格在下?
- 示例
- ```
seaboxsql=# select box '((0,0),(3,3))' <<| box '((3,4),(5,5))';
?column?
t (1 row) ```
|>>
¶
- 操作符
|>>
- 描述
- 严格在上?
- 示例
- ```
seaboxsql=# select box '((3,4),(5,5))' |>> box '((0,0),(3,3))';
?column?
t (1 row) ```
&<|
¶
- 操作符
&<|
- 描述
- 没有延展到上面?
- 示例
- ```
seaboxsql=# select box '((0,0),(1,1))' &<| box '((0,0),(2,2))';
?column?
t (1 row) ```
|&>
¶
- 操作符
|&>
- 描述
- 没有延展到下面?
- 示例
- ```
seaboxsql=# select box '((0,0),(3,3))' |&> box '((0,0),(2,2))';
?column?
t (1 row) ```
?#
¶
- 操作符
?#
- 描述
- 相交?
- 示例
- ```
seaboxsql=# select lseg '((-1,0),(1,0))' ?# box '((-2,-2),(2,2))';
?column?
t (1 row) ```
?-
¶
- 操作符
?-
- 描述
- 是否水平或者水平对齐
- 示例
-
``` seaboxsql=# select ?- lseg '((-1,0),(1,0))'; ?column?
t (1 row)seaboxsql=# select point '(1,0)' ?- point '(0,0)'; ?column?
t (1 row) ```
?|
¶
- 操作符
?|
- 描述
- 是否垂直或者垂直对齐
- 示例
-
``` seaboxsql=# select ?| lseg '((-1,0),(1,0))'; ?column?
f (1 row)seaboxsql=# select point '(0,1)' ?| point '(0,0)'; ?column?
t (1 row) ```
?-|
¶
- 操作符
?-|
- 描述
- 相互垂直?
- 示例
- ```
seaboxsql=# select lseg '((0,0),(0,1))' ?-| lseg '((0,0),(1,0))';
?column?
t (1 row) ```
?||
¶
- 操作符
?||
- 描述
- 平行?
- 示例
- ```
seaboxsql=# select lseg '((-1,0),(1,0))' ?|| lseg '((-1,2),(1,2))';
?column?
t (1 row) ```
@>
¶
- 操作符
@>
- 描述
- 包含?
- 示例
- ```
seaboxsql=# select circle '((0,0),2)' @> point '(1,1)';
?column?
t (1 row) ```
<@
¶
- 操作符
<@
- 描述
- 包含在内或在上?
- 示例
- ```
seaboxsql=# select circle '((0,0),2)' <@ circle '((0,0),3)';
?column?
t (1 row) ```
~=
¶
- 操作符
~=
- 描述
- 相同?
- 示例
- ```
seaboxsql=# select polygon '((0,0),(1,1))' ~= polygon '((1,1),(0,0))';
?column?
t (1 row) ```
几何函数¶
area()
¶
- 语法
area(object)
- 返回类型
- double precision
- 描述
- 返回指定对象的面积
- 示例
- ```
seaboxsql=# select area(box '((0,0),(1,1))');
?column?
1 (1 row) ```
center()
¶
- 语法
center(object)
- 返回类型
- point
- 描述
- 中心
- 示例
- ```
seaboxsql=# select center(box '((0,0),(1,2))');
center
(0.5,1) (1 row) ```
diameter()
¶
- 语法
diameter(circle)
- 返回类型
- double precision
- 描述
- 圆的直径
- 示例
- ```
seaboxsql=# select diameter(circle '((0,0),2.0)');
diameter
4
(1 row) ```
height()
¶
- 语法
height(box)
- 返回类型
- double precision
- 描述
- 方框的垂直尺寸,即矩形的高
- 示例
- ```
seaboxsql=# select height(box '((0,0),(1,1))');
height
1 (1 row) ```
isclosed()
¶
- 语法
isclosed(path)
- 返回类型
- boolean
- 描述
- 是否一个封闭路径
- 示例
- ```
seaboxsql=# select isclosed(path '((0,0),(1,1),(2,0))');
isclosed
t (1 row) ```
isopen()
¶
- 语法
isopen(path)
- 返回类型
- boolean
- 描述
- 是否一个开放路径
- 示例
- ```
seaboxsql=# select isopen(path '[(0,0),(1,1),(2,0)]');
isopen
t (1 row) ```
length()
¶
- 语法
length(object)
- 返回类型
- double precision
- 描述
- 长度
- 示例
- ```
seaboxsql=# select length(path '((-1,0),(1,0))');
length
4 (1 row) ```
npoints()
¶
- 语法
npoints(path|polygon)
- 返回类型
- int
- 描述
- 点数
- 示例
-
``` seaboxsql=# select npoints(path '[(0,0),(1,1),(2,0)]'); npoints
3 (1 row)
seaboxsql=# select npoints(polygon '((1,1),(0,0))'); npoints
2
(1 row) ```
pclose()
¶
- 语法
pclose(path)
- 返回类型
- path
- 描述
- 将路径转换成封闭的
- 示例
- ```
seaboxsql=# select pclose(path '[(0,0),(1,1),(2,0)]');
pclose
((0,0),(1,1),(2,0)) (1 row) ```
popen()
¶
- 语法
popen(path)
- 返回类型
- path
- 描述
- 将路径转换成开放
- 示例
- ```
seaboxsql=# select popen(path '((0,0),(1,1),(2,0))');
popen
[(0,0),(1,1),(2,0)] (1 row) ```
radius()
¶
- 语法
radius(circle)
- 返回类型
- double precision
- 描述
- 圆的半径
- 示例
- ```
seaboxsql=# select radius(circle '((0,0),2.0)');
radius
2 (1 row) ```
width()
¶
- 语法
width(box)
- 返回类型
- double precision
- 描述
- 方框的水平尺寸,即矩形的宽
- 示例
- ```
seaboxsql=# select width(box '((0,0),(1,1))');
width
1 (1 row) ```
几何类型转换函数¶
可以把一个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
。area
函数操作path
数据类型的时候,只有在path
的点没有交叉的情况下才可用。例如,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
就可以。
box()
¶
- 语法
box(circle|point[,point]|polygon)
- 返回类型
- box
- 描述
- 圆/点或其他类型转换到方框
- 示例
-
``` seaboxsql=# select box(circle '((0,0),2.0)'); box
(1.414213562373095,1.414213562373095),(-1.414213562373095,-1.414213562373095) (1 row)seaboxsql=# select box(point '(0,0)'); box
(0,0),(0,0) (1 row)
seaboxsql=# select box(point '(0,0)', point '(1,1)'); box
(1,1),(0,0) (1 row)
seaboxsql=# select box(polygon '((0,0),(1,1),(2,0))'); box
(2,1),(0,0) (1 row) ```
bound_box()
¶
- 语法
bound_box(box,box)
- 返回类型
- box
- 描述
- 方框到外包框
- 示例
- ``` seaboxsql=# select bound_box(box '((0,0),(1,1))', box '((3,3),(4,4))'); bound_box
(4,4),(0,0)
(1 row) ```
circle()
¶
- 语法
circle([point,double precision|box|polygon])
- 返回类型
- circle
- 描述
- 中心和半径到圆或多边形到圆
- 示例
-
``` seaboxsql=# select circle(point '(0,0)', 2.0); circle
<(0,0),2> (1 row)seaboxsql=# select circle(polygon '((0,0),(1,1),(2,0))'); circle
<(1,0.3333333333333333),0.9249505911485288> (1 row)
seaboxsql=# select circle(box '((0,0),(1,1))'); circle
<(0.5,0.5),0.7071067811865476> (1 row) ```
line()
¶
- 语法
line(point,point)
- 返回类型
- line
- 描述
- 点到线
- 示例
- ```
seaboxsql=# select line(point '(-1,0)', point '(1,0)');
line
{0,-1,0} (1 row) ```
lseg()
¶
- 语法
lseg([box|point,point])
- 返回类型
- lseg
- 描述
- 参数为方框时返回方框对角线的线段,参数为2个点时返回2点间构造的线段
- 示例
-
``` seaboxsql=# select lseg(box '((-1,0),(1,0))'); lseg
[(1,0),(-1,0)] (1 row)seaboxsql=# select lseg(point '(-1,0)', point '(1,0)'); lseg
[(-1,0),(1,0)] (1 row) ```
path()
¶
- 语法
path(polygon)
- 返回类型
- path
- 描述
- 多边形到路径
- 示例
- ```
seaboxsql=# select path(polygon '((0,0),(1,1),(2,0))');
path
((0,0),(1,1),(2,0)) (1 row) ```
point()
¶
- 语法
point([double precision,double precision|box|circle|lseg|polygon])
- 返回类型
- point
- 描述
- 参赛为2个double类型数值时为构造点函数;参赛为线段/方框/圆/多边形时,返回参赛图形的中心
- 示例
-
``` seaboxsql=# select point(23.4, -44.5); point
(23.4,-44.5) (1 row)seaboxsql=# select point(box '((-1,0),(1,0))'); point
(0,0) (1 row)
seaboxsql=# select point(circle '((0,0),2.0)'); point
(0,0) (1 row)
seaboxsql=# select point(lseg '((-1,0),(1,0))'); point
(0,0) (1 row)
seaboxsql=# select point(polygon '((0,0),(1,1),(2,0))'); point
(1,0.3333333333333333) (1 row) ```
polygon()
¶
- 语法
polygon([box|circle|npts,circle|path])
- 返回类型
- polygon
- 描述
- 参数为方框时,返回4点多边形;参数为圆时,返回12点多边形;参数为整数和圆时,返回指定整数多边形;参赛为路径时,将路径转换为多边形
- 示例
-
``` seaboxsql=# select polygon(box '((0,0),(1,1))'); polygon
((0,0),(0,1),(1,1),(1,0)) (1 row)seaboxsql=# select polygon(circle '((0,0),2.0)');
polygon
((-2,0),(-1.7320508075688774,0.9999999999999999),(-1.0000000000000002,1.7320508075688772),(-1.2246467991473532e-16,2),(0.9999999999999996,1.7320508075688774),(1.732050807568877,1.0000000000000007),(2,2.4492935982947064e-16),(1.7320508075688776,-0.9999999999999994),(1.0000000000000009,-1.7320508075688767),(3.6739403974420594e-16,-2),(-0.9999999999999987,-1.732050807568878),(-1.7320508075688767,-1.0000000000000009)) (1 row)
seaboxsql=# select polygon(6, circle '((0,0),2.0)'); polygon
-----------------------------------------------------------------------------------------------------------------------------------------------------¶
((-2,0),(-1.0000000000000002,1.7320508075688772),(0.9999999999999996,1.7320508075688774),(2,2.4492935982947064e-16),(1.0000000000000009,-1.7320508075688767),(-0.9999999999999987,-1.732050807568878)) (1 row)
seaboxsql=# select polygon(path '((0,0),(1,1),(2,0))'); polygon
((0,0),(1,1),(2,0)) (1 row) ```