几何类型

神通数据库提供的几何类型如下表所示:

类型名 表示 描述 存储空间
point 平面上的点 (x,y) 16字节
line 无限长的线 {A,B,C} 32字节
lseg 有限线段 ((x1,y1),(x2,y2)) 32字节
box 矩形框 ((x1,y1),(x2,y2)) 32字节
path 封闭路径(类似于多边形) ((x1,y1),...) 16+16n字节
path 开放路径 [(x1,y1),...] 16+16n字节
polygon 多边形(类似于封闭路径) ((x1,y1),...) 40+16n字节
circle <(x,y),r> (center point and radius) 24字节

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

 

( x , y )

x , y

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

点使用第一种语法输出。

线

线由线性方程Ax + By + 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) 是线上不同的两点。

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

方框

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

 

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

( x1 , y1 ) , ( x2 , y2 )

x1 , y1 , x2 , y2

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

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

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

路径

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

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

 

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

( ( x1 , y1 ) , ... , ( x2 , y2 ) )

( x1 , y1 ) , ... , ( x2 , y2 )

( x1 , y1 , ... , x2 , y2 )

x1 , y1 , ... , x2 , y2

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

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

多边形

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

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

 

( ( x1 , y1 ) , ... , ( x2 , y2 ) )

( x1 , y1 ) , ... , ( x2 , y2 )

( x1 , y1 , ... , x2 , y2 )

x1 , y1 , ... , x2 , y2

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

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

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

 

< ( x1 , y1 ) , r >

( ( x1 , y1 ) , r )

( x1 , y1 ) , r

x1 , y1 , r

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

圆的输出用第一种语法。

示例1: 使用几何类型

--  清理环境
DROP TABLE tabGeometry CASCADE;

create table tabGeometry(point point, line line, lseg lseg, box box, path path, polygon polygon, circle circle);

-- insert语句插入几何类型数据
insert into tabGeometry values(point(1,1), line '((1,1),(2,2))', lseg '((1,1),(2,2))', box '((1,1),(2,2))', path'[(1,1),(1,2),(2,3)]', polygon'((1,1),(2,2))', circle '<(1,1),2>');

insert into tabGeometry values(point '1,1', line '[(1,1),(2,2)]', lseg '1,1,2,2', box '(1,1),(2,2)', path'(1,1,1,2,2,3)', polygon'(1,1),(2,2)', circle '((1,1),2)');

-- PL中使用几何类型
create or replace type typeGeometry as object(point point, line line, lseg lseg, box box, path path, polygon polygon, circle circle);

create or replace procedure procGeometry as
	obj1 typeGeometry;
	obj2 typeGeometry;
begin
	obj1.point   := '(1,1)';
	obj1.line    := '[(1,1),(2,2)]';
	obj1.lseg    := '[(1,1),(2,2)]';
	obj1.box     := '((1,1),(2,2))';
	obj1.path    := '[(1,1),(1,2),(2,3)]';
	obj1.polygon := '((1,1),(2,2))';
	obj1.circle  := '<(1,1),2>';
	
	obj2.point   := point(1,1);
	obj2.line    := line (point(1,1), point(2,2));
	obj2.lseg    := lseg (point(1,1), point(2,2));
	obj2.box     := box  (point (1,1), point(2,2));
	obj2.path    := path ('(1,1), (1,2), (2,3)');
	obj2.polygon := '(1,1),  (2,2)';
	obj2.circle  := '(1,1), 2';
	insert into tabGeometry values(obj1.point, obj1.line, obj1.lseg, obj1.box, obj1.path, obj1.polygon, obj1.circle);
	insert into tabGeometry values(obj2.point, obj2.line, obj2.lseg, obj2.box, obj2.path, obj2.polygon, obj2.circle);
end;

/
exec procGeometry;


select * from tabGeometry;
POINT(point)      |LINE(line)      |LSEG(lseg)      |BOX(box)      |PATH(path)      |POLYGON(polygon)      |CIRCLE(circle)      |
--------------------------------------------------------------------------------------------------------------------------
(1,1)             |{1,-1,0}        |[(1,1),(2,2)]   |(2,2),(1,1)   |[(1,1),(1,2),(2,|((1,1),(2,2))         |<(1,1),2>           |
                  |                |                |              |3)]             |                      |                    |
--------------------------------------------------------------------------------------------------------------------------
(1,1)             |{1,-1,0}        |[(1,1),(2,2)]   |(2,2),(1,1)   |((1,1),(1,2),(2,|((1,1),(2,2))         |<(1,1),2>           |
                  |                |                |              |3))             |                      |                    |
--------------------------------------------------------------------------------------------------------------------------
(1,1)             |{1,-1,0}        |[(1,1),(2,2)]   |(2,2),(1,1)   |[(1,1),(1,2),(2,|((1,1),(2,2))         |<(1,1),2>           |
                  |                |                |              |3)]             |                      |                    |
--------------------------------------------------------------------------------------------------------------------------
(1,1)             |{1,-1,0}        |[(1,1),(2,2)]   |(2,2),(1,1)   |((1,1),(1,2),(2,|((1,1),(2,2))         |<(1,1),2>           |
                  |                |                |              |3))             |                      |                    |
总数目:4
 
drop table tabGeometry;