简单空间类型
📄字数 1.5K
👁️阅读量 加载中...
简单空间数据类型表示二维的空间物体。下表展示了支持的简单空间类型:
类型名称 | 宽度(字节) | 定义 | 数据格式 |
---|---|---|---|
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
-- 创建表
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)) |
+------+-------+----------+---------------+-------------+-----------+---------------------+---------------------------+