|
5.7. 几何类型
几何数据类型表示二维的平面物体. Table 5-17 显示了PostgreSQL 里面可以用的几何类型。 最基本的类型:点,是其他类型的基础.
Table 5-17. 几何类型
几何类型 存储空间 表现形式 描述
point 16 字节 (x,y) 空间中一点
line 32 字节 ((x1,y1),(x2,y2)) (无穷)直线(未完全实现)
lseg 32 字节 ((x1,y1),(x2,y2)) (有限)线段
box 32 字节 ((x1,y1),(x2,y2)) 长方形
path 16+16n 字节 ((x1,y1),...) 闭合路径(与多边形类似)
path 16+16n 字节 [(x1,y1),...] 开放路径
polygon 40+32n 字节 ((x1,y1),...) 多边形(与闭合路径相似)
circle 24 字节 <(x,y),r> 圆(圆心和半径)
我们有一系列丰富的函数和操作符可用来进行各种几何计算, 如度量,转换,旋转和计算相交等。 它们在 Section 6.9 里有解释。
5.7.1. Point(点)
点是几何类型的基本二维构造单位。 用下面语法描述 point:
( x , y )
x , y
这里的参数是
x
是用浮点数表示的点的 x 坐标。
y
是用浮点数表示的点的 y 坐标。
5.7.2. 线段
线段 (lseg)是用一对点来代表的. lseg 用下面语法声明:
( ( x1 , y1 ) , ( x2 , y2 ) )
( x1 , y1 ) , ( x2 , y2 )
x1 , y1 , x2 , y2
这里的参数是
(x1,y1)
(x2,y2)
是线段的端点。
5.7.3. Box(方)
方是用一对对角点来表示的。 box 用下面语法声明:
( ( x1 , y1 ) , ( x2 , y2 ) )
( x1 , y1 ) , ( x2 , y2 )
x1 , y1 , x2 , y2
这里的参数是
(x1,y1)
(x2,y2)
是方形的一对对角点。
方的输出使用第一种语法.在输入时将按先右上角后左下角的顺序重新排列. 你也可以输入其他的一对对角点. 但输入时将先从输入中和存储的角中计算出左下角和右上角然后再存储.
5.7.4. Path(路径)
路径由一系列连接的点组成.路径可能是"开放"的, 也就是第一个点和最后一个点没有连接,也可能是"闭合" 的,这时第一个和最后一个点连接起来.我们提供了函数 popen(p) 和 pclose(p) 来强制路径是开放的还 是闭合的,可以用函数 isopen(p) 和 isclosed(p) 来在查询中选择是那种.
path 用下面语法声明:
( ( x1 , y1 ) , ... , ( xn , yn ) )
[ ( x1 , y1 ) , ... , ( xn , yn ) ]
( x1 , y1 ) , ... , ( xn , yn )
( x1 , y1 , ... , xn , yn )
x1 , y1 , ... , xn , yn
这里的参数是
(x,y)
组成路径的线段的端点。 前面的([)表明一个开放的路径,而前面的(()表明一个闭合的路径。
路径的输出使用第一种语法输出.
5.7.5. Polygon(多边形)
多边形由一系列点代表.多边形可以认为与闭合路径一样, 但是存储方式不一样而且有自己的一套支持过程/函数.
polygon 用下列语法声明:
( ( x1 , y1 ) , ... , ( xn , yn ) )
( x1 , y1 ) , ... , ( xn , yn )
( x1 , y1 , ... , xn , yn )
x1 , y1 , ... , xn , yn
这里的参数是
(x,y)
组成多边形边界的线段的端点。
多边形输出使用第一种语法.
5.7.6. Circle(圆)
圆由一个圆心和一个半径代表. circle 用下面语法表示:
< ( x , y ) , r >
( ( x , y ) , r )
( x , y ) , r
x , y , r
这里的参数是
(x,y)
圆心
r
圆的半径
圆的输出用第一种格式.
6.9. 几何函数和操作符
有许多内置函数和操作符支持 几何类型point,box,lseg, line,path,polygon 和 circle 等, 在Table 6-20, Table 6-21,和 Table 6-22。
Table 6-20. 几何函数和操作符
操作符 描述 用法
+ 平移 box '((0,0),(1,1))' + point '(2.0,0)'
- 平移 box '((0,0),(1,1))' - point '(2.0,0)'
* 伸缩/旋转 box '((0,0),(1,1))' * point '(2.0,0)'
/ 伸缩/旋转 box '((0,0),(2,2))' / point '(2.0,0)'
# 交 '((1,-1),(-1,1))' # '((1,1),(-1,-1))'
# 多边形顶点数 # '((1,0),(0,1),(-1,0))'
## 最近点 point '(0,0)' ## lseg '((2,0),(0,2))'
&& 重叠? box '((0,0),(1,1))' && box '((0,0),(2,2))'
&< 左重叠? box '((0,0),(1,1))' &< box '((0,0),(2,2))'
&> 右重叠? box '((0,0),(3,3))' &> box '((0,0),(2,2))'
<-> 两者间距离 circle '((0,0),1)' <-> circle '((5,0),1)'
<< 在左边? circle '((0,0),1)' << circle '((5,0),1)'
<^ 低于? circle '((0,0),1)' <^ circle '((0,5),1)'
>> 在右边? circle '((5,0),1)' >> circle '((0,0),1)'
>^ 高于? circle '((0,5),1)' >^ circle '((0,0),1)'
?# 相交或重叠? lseg '((-1,0),(1,0))' ?# box '((-2,-2),(2,2))';
?- 水平? point '(1,0)' ?- point '(0,0)'
?-| 垂直? lseg '((0,0),(0,1))' ?-| lseg '((0,0),(1,0))'
@-@ 长度或周长 @-@ path '((0,0),(1,0))'
?| 竖直? point '(0,1)' ?| point '(0,0)'
?|| 平行? lseg '((-1,0),(1,0))' ?|| lseg '((-1,2),(1,2))'
@ 包含或在...上 point '(1,1)' @ circle '((0,0),2)'
@@ ...的中心 @@ circle '((0,0),10)'
~= 与...相同 polygon '((0,0),(1,1))' ~= polygon '((1,1),(0,0))'
Table 6-21. 几何函数
函数 返回 描述 例子
area(object) double precision 目标的面积 area(box '((0,0),(1,1))')
box(box,box) box 方的交 box(box '((0,0),(1,1))',box '((0.5,0.5),(2,2))')
center(object) point 对象中心 center(box '((0,0),(1,2))')
diameter(circle) double precision 圆直径 diameter(circle '((0,0),2.0)')
height(box) double precision 方的竖直高度 height(box '((0,0),(1,1))')
isclosed(path) boolean 是闭合路径吗? isclosed(path '((0,0),(1,1),(2,0))')
isopen(path) boolean 是开环路径吗? isopen(path '[(0,0),(1,1),(2,0)]')
length(object) double precision 对象长度 length(path '((-1,0),(1,0))')
npoints(path) integer 点数 npoints(path '[(0,0),(1,1),(2,0)]')
npoints(polygon) integer 点数 npoints(polygon '((1,1),(0,0))')
pclose(path) path 把路径转换为闭合 popen(path '[(0,0),(1,1),(2,0)]')
popen(path) path 把路径转换为开环的 popen(path '((0,0),(1,1),(2,0))')
radius(circle) double precision 圆半径 radius(circle '((0,0),2.0)')
width(box) double precision 水平尺寸(宽) width(box '((0,0),(1,1))')
Table 6-22. 几何类型转换函数
函数 返回 描述 例子
box(circle) box 将圆转换成长方形 box(cricle '((0,0),2.0)')
box(point,point) box 将点转换成长方形 box(point '(0,0)', point '(1,1)')
box(polygon) box 将多边形转换成长方形 box(polygon '((0,0),(1,1),(2,0))')
circle(box) circle 方转换成圆 circle(box '((0,0),(1,1))')
circle(point,double precision) circle 点转换成圆 circle(point '(0,0)',2.0)
lseg(box) lseg 将长方形判为lseg lseg(box '((-1,0),(1,0))')
lseg(point,point) lseg 点转换成lseg lseg(point '(-1,0)',point '(1,0)')
path(polygon) point 多边形转换成路径 path(polygon '((0,0),(1,1),(2,0))')
point(circle) point 转换成点(中心) point(circle '((0,0),2.0)')
point(lseg,lseg) point 转换成点(相交) point(lseg '((-1,0),(1,0))', lseg '((-2,-2),(2,2))')
point(polygon) point 多边形中心 point(polygon '((0,0),(1,1),(2,0))')
polygon(box) polygon 转换成4点的多边形 polygon(box '((0,0),(1,1))')
polygon(circle) polygon 转换成12点的多边形 polygon(circle '((0,0),2.0)')
polygon(npts,circle) polygon 转换成npts 点多边形 polygon(12, circle '((0,0),2.0)')
polygon(path) polygon 路径转换成多边形 polygon(path '((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 的数组看待。 |
|