Skip to content

基础几何类型

几何数据类型表示二维的空间物体。虚谷空间数据库支持的几何类型如下:

类型名称宽度(字节)定义数据格式
POINT16平面上的点( x, y )
LINE32无限长的线{ A, B, C }
LSEG32有限线段(( x1, y1 ), ( x2, y2 ))
BOX32矩形框(( x1, y1), ( x2, y2 ))
PATH16 + 16n封闭路径(类似于多边形)(( x1, y1 ), ...)
PATH16 + 16n开放路径[( x1, y1 ), ...]
POLYGON40 + 16n多边形(类似于封闭路径)(( x1, y1 ), ...)
CIRCLE24<( x, y), r>(中心点和半径)

点 (POINT)

点是几何类型的基本二维构造块。用下面的语法描述 POINT 类型的值:

sql
( x , y )
  x , y

其中x和y分别是坐标,都是浮点数。

点使用第一种语法输出。

线 (LINE)

线由线性方程Ax + By + C = 0 表示,其中A和B都不为零。类型 LINE 的值采用以下形式输入和输出:

sql
{ A, B, C }

另外,还可以用下列任一形式输入:

sql
[ ( x1 , y1 ) , ( x2 , y2 ) ]
( ( x1 , y1 ) , ( x2 , y2 ) )
  ( x1 , y1 ) , ( x2 , y2 )
    x1 , y1   ,   x2 , y2

其中 (x1,y1) 和 (x2,y2) 是线上不同的两点。

线段 (LSEG)

线段用一对线段的端点来表示。LSEG 类型的值用下面的语法声明:

sql
[ ( x1 , y1 ) , ( x2 , y2 ) ]
( ( x1 , y1 ) , ( x2 , y2 ) )
  ( x1 , y1 ) , ( x2 , y2 )
    x1 , y1   ,   x2 , y2

其中(x1,y1) 和 (x2,y2) 是线段的端点。

线段使用第一种语法输出。

方框 (BOX)

方框用其对角的点对表示。BOX类型的值使用下面的语法指定:

sql
( ( x1 , y1 ) , ( x2 , y2 ) )
  ( x1 , y1 ) , ( x2 , y2 )
    x1 , y1   ,   x2 , y2

其中(x1,y1) 和 (x2,y2) 是方框的对角点。

方框使用第二种语法输出。

在输入时可以提供任意两个对角,但是值将根据需要被按顺序记录为右上角和左下角。

路径 (PATH)

路径由一系列连接的点组成。路径可能是开放的,也就是认为列表中第一个点和最后一个点没有被连接起来;也可能是封闭的,这时认为第一个和最后一个点被连接起来。

PATH类型的值用下面的语法声明:

sql
[ ( x1 , y1 ) , ... , ( xn , yn ) ]
( ( x1 , y1 ) , ... , ( xn , yn ) )
  ( x1 , y1 ) , ... , ( xn , yn )
  ( x1 , y1   , ... ,   xn , yn )
    x1 , y1   , ... ,   xn , yn

其中的点是组成路径的线段的端点。方括弧([])表示一个开放的路径,圆括弧(())表示一个封闭的路径。如第三种到第五种语法所示,当最外面的圆括号被忽略时,路径将被假定为封闭。

路径的输出使用第一种或第二种语法。

多边形 (POLYGON)

多边形由一系列点代表(多边形的顶点)。多边形和封闭路径很像,但是存储方式不一样而且有自己的一套支持例程。

POLYGON类型的值用下列语法声明:

sql
( ( x1 , y1 ) , ... , ( xn , yn ) )
  ( x1 , y1 ) , ... , ( xn , yn )
  ( x1 , y1   , ... ,   xn , yn )
    x1 , y1   , ... ,   xn , yn

其中的点是组成多边形边界的线段的端点。

多边形的输出使用第一种语法。

圆 (CIRCLE)

圆由一个圆心和一个半径代表。CIRCLE类型的值用下面的语法指定:

sql
< ( x , y ) , r >
( ( x , y ) , r )
  ( x , y ) , r
    x , y   , r

其中 (x,y) 是圆心,而 r 是圆的半径。

圆的输出用第一种语法。

示例

sql
-- 创建表
CREATE TABLE t_geom(c_id INT PRIMARY KEY, c_pt POINT, c_le LINE, c_lg LSEG, c_bx BOX, c_ce CIRCLE, c_ph PATH, c_pn POLYGON);

-- 插入数据,点、线、线段、方框、圆、路径和多边形
INSERT INTO t_geom VALUES(1, '(1,1)','(1,1),(2,2)','(1,1),(3,3)','(1,1),(4,4)','<(1,2),3>','(1,1),(2,3),(3,1)','(1,1),(2,3),(3,1),(1,1)');

-- 查询数据
SELECT * FROM t_geom;
C_ID|C_PT     |C_LE          |C_LG                 |C_BX               |C_CE           |C_PH                           |C_PN                                     |
----+---------+--------------+---------------------+-------------------+---------------+-------------------------------+-----------------------------------------+
   1|(1.0,1.0)|{1.0,-1.0,0.0}|[(1.0,1.0),(3.0,3.0)]|(4.0,4.0),(1.0,1.0)|<(1.0,2.0),3.0>|((1.0,1.0),(2.0,3.0),(3.0,1.0))|((1.0,1.0),(2.0,3.0),(3.0,1.0),(1.0,1.0))|

-- 更新点的数据为(0,1)
UPDATE t_geom SET c_pt='(0,1)' WHERE c_id = 1;

-- 查询更新后的数据
SELECT * FROM t_geom;
C_ID|C_PT     |C_LE          |C_LG                 |C_BX               |C_CE           |C_PH                           |C_PN                                     |
----+---------+--------------+---------------------+-------------------+---------------+-------------------------------+-----------------------------------------+
   1|(0.0,1.0)|{1.0,-1.0,0.0}|[(1.0,1.0),(3.0,3.0)]|(4.0,4.0),(1.0,1.0)|<(1.0,2.0),3.0>|((1.0,1.0),(2.0,3.0),(3.0,1.0))|((1.0,1.0),(2.0,3.0),(3.0,1.0),(1.0,1.0))|

-- 删除c_id = 1的数据
DELETE FROM t_geom WHERE c_id = 1;

-- 查询删除后的数据
SELECT * FROM t_geom;
C_ID|C_PT|C_LE|C_LG|C_BX|C_CE|C_PH|C_PN|
----+----+----+----+----+----+----+----+