目录
PostgreSQL支持的几何类型如下表:
名字 | 存储空间 | 描述 | 表现形式 |
point | 16字节 | 平面上的点 | (x,y) |
line | 32字节 | 直线 | {A,B,C} |
lseg | 32字节 | 线段 | ((x1,y1),(x2,y2)) |
box | 32字节 | 矩形 | ((x1,y1),(x2,y2)) |
path | 16+16n字节 | 闭合路径(与多边形相似) | ((x1,y1),...) |
path | 16+16n字节 | 开放路径 | [(x1,y1),...] |
polygon | 40+16n字节 | 多边形(与闭合路径相似) | ((x1,y1),...) |
circle | 24字节 | 圆 | <(x,y),r> (中心点与半径) |
详细说明:
1、点(point)
点是几何类型的基本二维构建块。point使用以下任一语法指定类型的值:
(x,y)
x,y
其中x和y是相应的坐标,作为浮点数。
使用第一种语法输出点。
2、线(line)
线由线性方程A
x + B
y + C
= 0表示,其中A
和B
不都为零。类型的值 line
以下列形式输入和输出:
{ A,B,C}
或者,可以使用以下任何形式进行输入:
[ ( x1 , y1 ) , ( x2 , y2 ) ]
( ( x1 , y1 ) , ( x2 , y2 ) )
( x1 , y1 ) , ( x2 , y2 )
x1 , y1 , x2 , y2
其中(x1,y1)和(x2,y2)是线上的两个不同点。
3、线段(lseg)
线段由成对的点表示,这些点是段的端点。lseg
类型的值使用下列语法中的任何一种来指定:
[ ( x1 , y1 ) , ( x2 , y2 ) ]
( ( x1 , y1 ) , ( x2 , y2 ) )
( x1 , y1 ) , ( x2 , y2 )
x1 , y1 , x2 , y2
其中(x1,y1)和(x2,y2)是线段的端点。
使用第一种语法输出线段。
4、矩形(box)
矩形是由矩形的对角线的点对来表示的。box
使用下列语法中的任何一种来指定类型的值:
( ( x1 , y1 ) , ( x2 , y2 ) )
( x1 , y1 ) , ( x2 , y2 )
x1 , y1 , x2 , y2
其中(x1,y1)和(x2,y2)是矩形的任意两个相对的角。
使用第二种语法输出矩形。
可以在输入时提供任意两个相对的角,但是值将根据需要重新排序,以便按顺序存储右上角和左下角。
所以建议在输入时提供右上角和左下角。
5、路径(path)
路径由连接点列表表示。路径可以是开放的(其中列表中的第一和最后一个点被认为是未连接的),或者是闭合的(其中第一和最后一个点被认为是连接的)。
path
使用以下任何语法指定类型的值:
[ ( x1 , y1 ) , ... , ( xn , yn ) ]
( ( x1 , y1 ) , ... , ( xn , yn ) )
( x1 , y1 ) , ... , ( xn , yn )
( x1 , y1 , ... , xn , yn )
x1 , y1 , ... , xn , yn
其中点是包括路径的线段的端点。方括号([]
)表示开放路径,而圆括号(()
)表示闭合路径。当省略最外面的括号时,如在第三到第五语法中,假设闭合路径。
其中点是包括路径的线段的端点。方括号([])表示开放路径,而小括号(())表示闭合路径。当最外括号被省略时,如在第三到第五语法中,表示默认为一条闭合路径。
根据需要,建议使用第一或第二语法输出路径。
6、多边形(polygon)
多边形由点列表(多边形的顶点)表示。多边形与闭合路径非常相似,但存储方式不同,并且具有自己的一组支持程序。
polygon
使用以下任何一种语法指定类型的值:
( ( x1 , y1 ) , ... , ( xn , yn ) )
( x1 , y1 ) , ... , ( xn , yn )
( x1 , y1 , ... , xn , yn )
x1 , y1 , ... , xn , yn
其中点是包括多边形边界的线段的端点。
建议使用第一种语法输出多边形。
7、圆(circle)
圆由中心点和半径表示。circle
使用以下任何一种语法指定类型的值:
< ( x , y ) , r >
( ( x , y ) , r )
( x , y ) , r
x , y , r
其中(x,y)是中心点,r是圆的半径。
建议使用第一种语法输出圆。
示例:
test=# select point'(1,1)';
point
-------
(1,1)
(1 row)
test=# select line'{1,1,1}';
line
---------
{1,1,1}
(1 row)
test=# select lseg'(1,1),(2,2)';
lseg
---------------
[(1,1),(2,2)]
(1 row)
test=# select box'(1,1),(2,2)';
box
-------------
(2,2),(1,1)
(1 row)
test=# select path'(1,1),(2,2),(2,1)';
path
---------------------
((1,1),(2,2),(2,1))
(1 row)
test=# select path'[(1,1),(2,2),(2,1)]';
path
---------------------
[(1,1),(2,2),(2,1)]
(1 row)
test=# select polygon'((1,1),(2,2),(2,1))';
polygon
---------------------
((1,1),(2,2),(2,1))
(1 row)
test=# select circle'<(0,0),1>';
circle
-----------
<(0,0),1>
(1 row)
二、几何操作符
操作符 | 描述 | 示例 | 结果 |
+ | 平移 | select box '((0,0),(1,1))' + point '(2.0,0)'; | (3,1),(2,0) |
- | 平移 | select box '((0,0),(1,1))' - point '(2.0,0)'; | (-1,1),(-2,0) |
* | 伸缩/旋转 | select box '((0,0),(1,1))' * point '(2.0,0)'; | (2,2),(0,0) |
/ | 伸缩/旋转 | select box '((0,0),(2,2))' / point '(2.0,0)'; | (1,1),(0,0) |
# | 交点或者交面 | select box'((1,-1),(-1,1))' # box'((1,1),(-1,-1))'; | (1,1),(-1,-1) |
# | path或polygon的顶点数 | select #path'((1,1),(2,2),(2,1))'; | 3 |
@-@ | 长度或周长 | select @-@ path'((1,1),(2,2),(2,1))'; | 3.41421356237309 |
@@ | 中心 | select @@ circle'<(0,0),1>'; | (0,0) |
## | 第一个操作数和第二个操作数的最近点 | select point '(0,0)' ## lseg '((2,0),(0,2))'; | (1,1) |
<-> | 间距 | select circle '<(0,0),1>' <-> circle '<(5,0),1>'; | 3 |
&& | 是否有重叠 | select box '((0,0),(1,1))' && box '((0,0),(2,2))'; | t |
<< | 是否严格在左 | select circle '((0,0),1)' << circle '((5,0),1)'; | t |
>> | 是否严格在右 | select circle '((0,0),1)' >> circle '((5,0),1)'; | f |
&< | 是否没有延伸到右边 | select box '((0,0),(1,1))' &< box '((0,0),(2,2))'; | t |
&> | 是否没有延伸到左边 | select box '((0,0),(3,3))' &> box '((0,0),(2,2))'; | t |
<<| | 是否严格在下 | select box '((0,0),(3,3))' <<| box '((3,4),(5,5))'; | t |
|>> | 是否严格在上 | select box '((3,4),(5,5))' |>> box '((0,0),(3,3))'; | t |
&<| | 是否没有延伸到上面 | select box '((0,0),(1,1))' &<| box '((0,0),(2,2))'; | t |
|&> | 是否没有延伸到下面 | select box '((0,0),(3,3))' |&> box '((0,0),(2,2))'; | t |
<^ | 是否低于(允许接触) | select box '((0,0),(3,3))' <^ box '((3,3),(4,4))'; | t |
>^ | 是否高于(允许接触) | select box '((0,0),(3,3))' >^ box '((3,3),(4,4))'; | f |
?# | 是否相交 | select lseg '((-1,0),(1,0))' ?# box '((-2,-2),(2,2))'; | t |
?- | 是否水平对齐 | select ?- lseg '((-1,1),(1,1))'; | t |
?- | 两边图形是否水平对齐 | select point '(1,0)' ?- point '(0,0)'; | t |
?| | 是否竖直对齐 | select ?| lseg '((-1,0),(1,0))'; | f |
?| | 两边图形是否竖直对齐 | select point '(0,1)' ?| point '(0,0)'; | t |
?-| | 是否垂直 | select lseg '((0,0),(0,1))' ?-| lseg '((0,0),(1,0))'; | t |
?|| | 是否平行 | select lseg '((-1,0),(1,0))' ?|| lseg '((-1,2),(1,2))'; | t |
@> | 是否包含 | select circle '((0,0),2)' @> point '(1,1)'; | t |
<@ | 是否包含于或在图形上 | select point '(1,1)' <@ circle '((0,0),2)'; | t |
~= | 是否相同 | select polygon '((0,0),(1,1))' ~= polygon '((1,1),(0,0))'; | t |
三、几何函数
函数 | 返回值类型 | 描述 | 示例 | 结果 |
area(object) | double precision | 面积 | select area(circle'((0,0),1)'); | 3.14159265358979 |
center(object) | point | 中心 | select center(box'(0,0),(1,1)'); | (0.5,0.5) |
diameter(circle) | double precision | 圆直径 | select diameter(circle '((0,0),2.0)'); | 4 |
height(box) | double precision | 矩形竖直高度 | select height(box '((0,0),(1,1))'); | 1 |
isclosed(path) | boolean | 是否为闭合路径 | select isclosed(path '((0,0),(1,1),(2,0))'); | t |
isopen(path) | boolean | 是否为开放路径 | select isopen(path '[(0,0),(1,1),(2,0)]'); | t |
length(object) | double precision | 长度 | select length(path '((-1,0),(1,0))'); | 4 |
npoints(path) | int | path中的顶点数 | select npoints(path '[(0,0),(1,1),(2,0)]'); | 3 |
npoints(polygon) | int | 多边形的顶点数 | select npoints(polygon '((1,1),(0,0))'); | 2 |
pclose(path) | path | 将开放path转换为闭合path | select pclose(path '[(0,0),(1,1),(2,0)]'); | ((0,0),(1,1),(2,0)) |
popen(path) | path | 将闭合path转换为开放path | select popen(path '((0,0),(1,1),(2,0))'); | [(0,0),(1,1),(2,0)] |
radius(circle) | double precision | 圆半径 | select radius(circle '((0,0),2.0)'); | 2 |
width(box) | double precision | 矩形的水平长度 | select width(box '((0,0),(1,1))'); | 1 |
四、几何类型转换函数
函数 | 返回 类型 | 描述 | 示例 | 结果 |
box(circle) | box | 圆形转矩形 | select box(circle '((0,0),2.0)'); | (1.41421356237309,1.41421356237309),(-1.41421356237309,-1.41421356237309) |
box(point) | box | 点转空矩形 | select box(point '(0,0)'); | (0,0),(0,0) |
box(point, point) | box | 点转矩形 | select box(point '(0,0)', point '(1,1)'); | (1,1),(0,0) |
box(polygon) | box | 多边形转矩形 | select box(polygon '((0,0),(1,1),(2,0))'); | (2,1),(0,0) |
bound_box(box, box) | box | 将两个矩形转换成一个边界矩形 | select bound_box(box '((0,0),(1,1))', box '((3,3),(4,4))'); | (4,4),(0,0) |
circle(box) | circle | 矩形转圆形 | select circle(box '((0,0),(1,1))'); | <(0.5,0.5),0.707106781186548> |
circle(point, double precision) | circle | 圆心与半径转圆形 | select circle(point '(0,0)', 2.0); | <(0,0),2> |
circle(polygon) | circle | 多边形转圆形 | select circle(polygon '((0,0),(1,1),(2,0))'); | <(1,0.333333333333333),0.924950591148529> |
line(point, point) | line | 点转直线 | select line(point '(-1,0)', point '(1,0)'); | {0,-1,0} |
lseg(box) | lseg | 矩形转线段 | select lseg(box '((-1,0),(1,0))'); | [(1,0),(-1,0)] |
lseg(point, point) | lseg | 点转线段 | select lseg(point '(-1,0)', point '(1,0)'); | [(-1,0),(1,0)] |
path(polygon) | path | 多边形转path | select path(polygon '((0,0),(1,1),(2,0))'); | ((0,0),(1,1),(2,0)) |
point(double precision, double precision) | point | 创建点 | select point(23.4, -44.5); | (23.4,-44.5) |
point(box) | point | 矩形中心点 | select point(box '((-1,0),(1,0))'); | (0,0) |
point(circle) | point | 圆中心点 | select point(circle '((0,0),2.0)'); | (0,0) |
point(lseg) | point | 线段中心点 | select point(lseg '((-1,0),(1,0))'); | (0,0) |
point(polygon) | point | 多边形的中心 | select point(polygon '((0,0),(1,1),(2,0))'); | (1,0.333333333333333) |
polygon(box) | polygon | 矩形转4点多边形 | select polygon(box '((0,0),(1,1))'); | ((0,0),(0,1),(1,1),(1,0)) |
polygon(circle) | polygon | 圆形转12点多边形 | select polygon(circle '((0,0),2.0)'); |
|
polygon(npts, circle) | polygon | 圆形转npts点多边形 | select polygon(12, circle '((0,0),2.0)'); |
|
polygon(path) | polygon | 将path转多边形 | select polygon(path '((0,0),(1,1),(2,0))'); | ((0,0),(1,1),(2,0)) |