1、Oracle Spatial 概念相关
Oracle Spatial 是Oracle 数据库强大的核心特性,包含了用于存储矢量数据类型、栅格数据类型和持续拓扑数据类型的原生数据类型。Oracle Spatial 使得我们能够在一个多用户环境中部署地理信息系统(GIS),并且与其他企业数据有机结合起来,统一部署电子商务,政务。有了Oracle Spatial 之后,即可用标准的sql查询管理我们的空间数据。
Oracle Spatial 用来存储、管理、查询空间数据。oracle 提供了一套SQL方案和函数,用来存储、检索、更新和查询数据库中的空间要素集合。主要由几何数据类型,空间索引机制,一套操作函数,管理工具构成。Oracle支持自定义数据类型,我们能用数组,结构体,功能函数的类来定义自己的对象类型。Oracle Spatial 正是基于此种特性所研发的一套空间数据处理系统。
Oracle Spatial 的自定义数据类型有非常多,都在mdsys方案下,经常使用的是 sdo_geometry类型,sdo_geometry类型表示一个几何对象,可能是点,线,面,多点,多线,多面或者混合对象。
Oracle Spatial 在此数据类型的基础上,实现了R树空间索引和四叉树空间索引,还以sql函数的形式实现了多种空间分析功能。
2、空间字段 SDO_GEOMETRY
Oracle Spatial 主要通过 元数据表 空间数据字段(即SDO_GEOMETRY字段)和空间索引来管理空间数据,并在此基础上提供了一系列空间查询和空间分析的函数,让用户进行更深层次的GIS应用开发。
2.1 元数据表
Oracle Spatial 的元数据表存储了有空间数据的数据表的名称,空间字段名称,空间数据的坐标范围,坐标参考信息及坐标维数等信息。用户必须通过元数据表才能知道Oracle 数据库中是否有Oracle Spatial 中的空间数据信息。一般通过元数据视图(USER_SDO_GEOM_METADATA)访问元数据表;元数据视图的基本定义如下:
table_name varchar2(32), column_name varchar2(32), diminfo MDSYS.SDO_DIM_ARRAY, srid number
其中,table_name 表示含有空间数据字段的表名;
column_name 表示空间数据表中的空间字段名称;
DIMINFO 是一个按照空间维顺序排列的SDO_DIM_ELEMENT 对象的动态数组;
SRID 则用于标识与几何对象相关的空间坐标参考系
SDO_DIM_ELEMENT 对象的定义如下:
create type SDO_DIM_ELEMENT as Object( SDO_DIMNAME varchar2(64), SDO_LB number, SDO_RB number, SDO_TOLENRANCE number);
其中
- SDO_DIMNAME 是空间维名称,
- SDO_LB 为该空间维的左下角坐标,
- SDO_RB 为该空间维的右上角坐标,
- SDO_TOLERANCE 为几何对象的表示精度
2.2 空间存储字段 SDO_GEOMETRY
Oracle Spatial 的空间数据都存储在空间字段 SDO_GEOMETRY 中,理解SDO_GEOMENTRY 是编写Oracle Spatial 接口程序的关键。
SDO_GEOMETRY是按照OpenGIS规范定义的一个对象,其原始创建方式如下:
create type sdo_geometry as object( SDO_GTYPE number, SDO_SRID number, SDO_POINT SDO_POINT_TYPE, SDO_ELEM_INFO MDSYS.SDO_ELEM_INFO_ARRAY, SDO_ORDINATES MDSYS.SDO_ORDINATE_ARRAY);
该对象由五个部分构成。
2.2.1 SDO_GTYPE
SDO_GTYPE 是一个number类型的数值,用来定义存储对象的类型;SDO_GTYPE 是一个4个数字的整数,其格式为dltt。
- d 表示几何对象的维数;
- l 表示三维线性参考系统中的线性参考值,当d为3或者4维时,需要设置该值,一般情况下为空;
- tt为几何对象的乐行,Oracle Spatial 定义了7种类型的几何对象,目前使用了00-07,另外的08~99是oracle 保留的数字。
下表就是t=2 的二维几何对象类型,SDO_GTYPE参数值。
对于一个给定的层,所有的地理对象必须都是相同的维度,不能将二维和三维的数据放到一个层中。
2.2.2 SDO_SRID
SDO_SRID 是一个number类型的数值,用于标识与几何对象相关的空间坐标参考系。如果SDO_SRID为空(NULL),标识没有坐标系与该几何对象相关。如果该值不为空,则该值必须为MDSYS.CS_SRS表中SRID字段的一个值,在创建含有几何对象的表时,这个值必须加入到描述空间数据表元数据的USER_GEOM_METADATA视图的SRID字段中,Oracle Spatial 规定,一个几何字段中的所有几何对象都必须为相同的SDO_SRID值。
2.2.3 SDO_POINT
SDO_POINT 是一个包含X,Y,Z数值信息的对象,用于表示几何类型为点的几何对象,如果SDO_ELEM_INFO和SDO_ORDINATES数组都为空,则SDO_POINT中的X,Y,Z为点对象的坐标值。否则,SDO_POINT可以忽略(用NULL表示)。其中,SDO_POINT_TYPE 定义如下
create or replace TYPE SDO_POINT_TYPE( X number, Y number, Z number);
2.2.4 SDO_ELEM_INFO
SDO_ELEM_INFO 是一个可变长的数组,每3个数作为一个元素单位,用来解释坐标是如何存储在SDO_ORDINATES数组中的。
SDO_ELEM_INFO 是理解和掌握SDO_GEOMETRY 的重点和难点,本文中把组成一个元素的3个数叫做三元组,一个三元组包含以下三部分内容:
- SDO_STARTING_OFFSET 表明每个几何元素的第一个坐标在SDO_ORDINATES数组中的存储位置(坐标序号),值从1开始,逐渐递增。
- SDO_ETYPE 用来表示几何对象中每个组成元素的几何类型,当他的值为1,2,1003,2003时,表明这个几何元素为简单元素,如果值为1003 则表明多边形为外环(第一个数1表示外环)坐标值以逆时针存储,如果是2003 表明该多边形为内环(第一个2表示内环)坐标值以顺时针存储,当值为4,1005,2005时,表示这个几何元素为复杂元素,他至少包含一个三元组用以说明该复杂元素具体有多少个几何简单元素。第一个三元组是为了说明组合元素的信息。
- SDO_INTERPRETATION 具有两层含义,具体作用由SDO_ETYPE是否为复杂元素决定:
如果SDO_ETYPE是复杂元素,则其表示他后边有几个子三元组属于这个复杂元素。
如果SDO_ETYPE是简单元素,则其表示该元素的坐标值在SDO_ORDINATES中是如何排列的。
需要注意的是,对于复杂元素来说,组成他的子元素是连续的,一个子元素的最后一个点是下一个子元素的第一个点,最后一个子元素的最后一个坐标要么与下一个元素的SDO_STARING_OFFSET值减1所对应的坐标相同,要么是整个SDO_ORDINATES数组的最后一个坐标。
2.2.5 SDO_ORDINATES
SDO_ORDINATES 是一个可变长的数组,用于存储几何对象的真是坐标,该数组的类型为number类型,他的最大长度为1048576。SDO_ORDINATES必须和SDO_ELEM_INFO配合使用,才具有实际意义。
SDO_ORDINATES的坐标存储方式由几何对象的维数决定,如果几何对象是三维,则SDO_ORDINATES的坐标以{x1,y1,z1,x2,y2,z2,...}方式存储,如果几何对象为二维,则坐标以{x1,y1,x2,y2,....}的顺序排列。
3 参考实例
3.1 矩形
用SDO_GEOMETRY 定义该矩形为 MDSYS.SDO_GEOMENTRY(
2003, //表示二维多边形
NULL,
NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,3), //1表示第一个位置,1003 和 3 表示矩形 逆时针方向
MDSYS.SDO_ORDINATE_ARRAY(1,1,5,7)) // 两个点 左下角坐标 右上角坐标
3.2 有岛多边形
SDO_GTYPE = 2003 // 2003 中的2表示二维数据 3表示多边形
SDO_SRID = NULL
SDO_POINT = NULL
SDO_ELEM_INFO = (1,1003,1,19,2003,1) //有两个三元组 其中 1003 表明对应的坐标序列组成的几何A为外多边形(顺时针),而2003表明对应的坐标序列组成的几何B为内多边形(逆时针) ,19 表示几何B的坐标序列开始位置。
SDO_ORDINATES = {2,4, 4,3, 10,3, 13,5, 13,9, 11,13, 5,13, 2,11, 2,4,7,5, 7,10, 10,10, 10,5, 7,5} //坐标序列
MDSYS.SDO_GEOMENTRY( 2003, NULL, NULL, MDSYS.SDO_ELEM_INFO_ARRAY(1, 1003, 1, 19, 2003, 1), MDSYS.SDO_ORDINATE_ARRAY(2,4, 4,3, 10,3, 13,5, 13,9, 11,13, 5,13, 2,11, 2,4,7,5, 7,10, 10,10, 10,5, 7,5 )
3.3 复杂多义线
下图描述的是一个由一条直线和一条曲线构成的复杂多义线,图中出现了4个点(10,10) 和 (10,14)点表示的是直线, (10,14) (6,10)和(14,10)描述的是圆弧曲线。
SDO_GTYPE = 2002 //2002 中第一个2表示二维数据,第二个2表示一条或者多条线段
SDO_SRID = NULL
SDO_POINT = NULL
SDO_ELEM_INFO = {1,4,2, 1,2,1, 3,2,2} // 有3个三元组,其中后两个是SDO_ELEM_INFO属性的三元组,前边一个为表述组合。
第一个三元组 【1,4,2】 根据4 可以得到描述的是三元组,2 表示有两个几何元组组成,即后边两个三元组格子描述的几何A和几何B。
第二个三元组 【1,2,1】 描述几何A 根据上图可得是一条直线,且该直线段的最后一个节点是下一个几何对象的开始点,即几何A和几何B有几何重合。
第三个三元组 【3,2,2】 描述几何B 该几何B的起点和几何A的终点几点重合。
SDO_ORDINATES = (10,10, 10,14, 6,10, 14,10)
4 索引
Oracle Spatial 提供了R树空间索引和四叉树空间索引两种索引机制来提高空间查询和空间分析的速度。用户需要根据空间数据的不同类型创建不同的索引,当空间数据比较复杂时,如果选择索引类型不当,将使Oracle Spatial 创建索引的过程变得非常慢。
参考资料:http://blog.sina.com.cn/s/blog_46f3d4d401000872.html
http://www.cnblogs.com/upDOoGIS/archive/2009/05/20/1469871.html