LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 912|回复: 1

大家看看PostgreSQL这些数据类型是否有助于GIS项目呢?

[复制链接]
发表于 2003-7-24 17:58:10 | 显示全部楼层 |阅读模式
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 的数组看待。
发表于 2003-8-14 14:13:24 | 显示全部楼层
上面遗漏了一点, PostgreSQL还提供了R-Tree检索,这是特别针对空间数据的。

GIS除了点、线、面之外,更重要的是空间数据的拓扑关系的存储和检索,PostgreSQL提供的这些功能算是很基础的了,离真正的空间数据库还有些距离。如Oracle提供专门的空间数据模块进行存储和检索计算。现在的GIS的发展,不仅包含一般的矢量数据,还含有大量的遥感、航空摄影影像数据,这些都是海量级的数据,这种趋势越来越明显。PostgreSQL做一些小规模的、辅助性的项目比较适合。

当然,有比没有好。PostgreSQL毕竟是最早支持空间数据的Open Source数据库系统。MySQL现在也提供类似的数据类型以支持空间数据。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表