基础几何类型
几何数据类型表示二维的空间物体。虚谷空间数据库支持的几何类型如下:
类型名称 | 宽度(字节) | 定义 | 数据格式 |
---|---|---|---|
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>(中心点和半径) |
点 (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|
----+----+----+----+----+----+----+----+