跳转至

几何函数和操作符

几何函数和操作符

几何类型pointboxlseglinepathpolygoncircle有一些本地支持函数和操作符,如下文中所示。

注意

  • 请注意“same as”操作符(~=),表示pointboxpolygoncircle类型的一般相等概念。这些类型中的某些还有一个=操作符,但是=只比较相同的面积。其它的标量比较操作符(<=等等)也是为这些类型比较面积。

几何操作符

+
操作符
+
描述
平移
示例
``` 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可以用于类型boxcirclepatharea函数操作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) ```