Skip to content

适用虚谷数据库版本

v12.9



适用虚谷数据库版本

v12.9


简单空间类型

📄字数 1.5K
👁️阅读量 加载中...

简单空间数据类型表示二维的空间物体。下表展示了支持的简单空间类型:

类型名称宽度(字节)定义数据格式
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
-- 创建表
SQL> CREATE TABLE tab_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);

-- 插入数据,点、线、线段、方框、圆、路径和多边形
SQL> INSERT INTO tab_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)');

-- 查询数据
SQL> SELECT * FROM tab_geom;

+------+-------+----------+---------------+-------------+-----------+---------------------+---------------------------+
| C_ID | C_PT  |   C_LE   |     C_LG      |    C_BX     |   C_CE    |        C_PH         |           C_PN            |
+------+-------+----------+---------------+-------------+-----------+---------------------+---------------------------+
| 1    | (1,1) | {1,-1,0} | [(1,1),(3,3)] | (4,4),(1,1) | <(1,2),3> | ((1,1),(2,3),(3,1)) | ((1,1),(2,3),(3,1),(1,1)) |
+------+-------+----------+---------------+-------------+-----------+---------------------+---------------------------+

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

-- 查询更新后的数据
SQL> SELECT * FROM tab_geom;

+------+-------+----------+---------------+-------------+-----------+---------------------+---------------------------+
| C_ID | C_PT  |   C_LE   |     C_LG      |    C_BX     |   C_CE    |        C_PH         |           C_PN            |
+------+-------+----------+---------------+-------------+-----------+---------------------+---------------------------+
| 1    | (0,1) | {1,-1,0} | [(1,1),(3,3)] | (4,4),(1,1) | <(1,2),3> | ((1,1),(2,3),(3,1)) | ((1,1),(2,3),(3,1),(1,1)) |
+------+-------+----------+---------------+-------------+-----------+---------------------+---------------------------+