Oracle Spatial GIS相关研究
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
Oracle Spatial GIS相关研究的更多相关文章
- Oracle Spatial 中的弧段及弧相关拓扑错误
1.报告说明 此报告用于验证下列问题: ORACLE SPATIAL 0.05m的最小拓扑容差值是否可以被修改 原始数据通过ARCGIS入库数据精度是否有损失 修改ORACLE SPATIAL图层的最 ...
- Oracle spatial与arcsde 的关系
有一些同事问过我下面这些问题: 我们用了oracle spatial sdo_geometry,是不是没用arcsde? 我们到底是使用oracle spatial还是arcsde,有点懵! 执行了c ...
- Oracle Spatial中SDO_Geometry详细说明[转]
在ArcGIS中通过SDE存储空间数据到Oracle中有多种存储方式,分别有:二进制Long Raw .ESRI的ST_Geometry以及基于Oracle Spatial的SDO_Geometry等 ...
- Oracle Spatial中SDO_Geometry说明
Oracle Spatial中SDO_Geometry说明 在ArcGIS中通过SDE存储空间数据到Oracle中有多种存储方式,分别有:二进制Long Raw .ESRI的ST_Geometry以及 ...
- Oracle spatial抽稀函数(SDO_UTIL.SIMPLIFY)
在使用Oracle spatial做空间查询和展示时,经常会遇到展示或者查询过慢,这时候我可以通过空间数据抽稀来优化查询展示效率. 在Oracle spatial中的抽稀函数为:SDO_UTIL.SI ...
- C#读取Oracle Spatial的sdo_geometry
oracle的sdo_geometry中内置get_wkt和get_wkb两个方法. 以数据库表geoms为例,此表中有id和geometry两列 try { OracleConnection con ...
- Oracle Spatial中的空间索引
转自cryolite原文 Oracle Spatial中的空间索引 Oracle Spatial可对空间数据进行R-tree索引,每个空间图层(Spatial Layer)的空间索引元信息都可以在US ...
- Oracle Spatial图层元数据坐标范围影响R-TREE索引的ROOT MBR吗?
Oracle Spatial的空间索引R-TREE,其实现原理为一级级的MBR(最小定界矩形).我突然想到一个问题,它的ROOT MBR是怎么确定的?是根据元数据表user_sdo_geom_meta ...
- Oracle 12C In-Memory特性研究
Oracle 12C In-Memory特性研究一.Oracle In-Memory1.1 In-Memory 开启方法1.2 开启与关闭IM column store1.3 inmemory优先级调 ...
随机推荐
- blog断更通知
在HE无人进队的阴影下,考完APIO和CTS就真走了..不想写blog了,去冲刺2020高考了(滚回去学文化课了)
- 扩大VirtualBox虚拟机磁盘的方法
之前在VirtualBox里安装了一个XP系统,当时只分配了10G磁盘空间,随着使用,空间不足了. 在虚拟机管理器里不能直接调整磁盘的大小,这里要用到VirtualBox安装目录下的VBoxManag ...
- 洛谷 P3227 [HNOI2013]切糕(最小割)
题解 Dinic求最小割 题目其实就是求最小的代价使得每个纵轴被分成两部分 最小割!!! 我们把每个点抽象成一条边,一个纵轴就是一条\(S-T\)的路径 但是题目要求\(|f(x,y)-f(x',y' ...
- SqlServer数据库《基本》
数据库简单说就是行.列组成的二维表 把列称为字段.每一行数据成为记录,能标识每一行的唯一字段称为主键 查询数据表时,索引可以提高查询速度,但是索引同时会降低新增和更新数据时的速度,应为还要更新索引. ...
- 转 oracle ASM中ASM_POWER_LIMIT参数
https://daizj.iteye.com/blog/1753434 ASM_POWER_LIMIT 该初始化参数用于指定ASM例程平衡磁盘所用的最大权值,其数值范围为0~11,默认值为1.该初始 ...
- dgango 报错: Timeout when reading response headers from daemon process
问题: image = np.asarray(bytearray(f.read()), dtype="uint8")cv2_img = cv2.imdecode(image, cv ...
- 剑指offer等算法总结归类
从数据结构分 一.链表: 3.题目描述:输入一个链表,从尾到头打印链表每个节点的值(递归) 思路:递归调用,调一次,加一次到list中 14.题目描述:输入一个链表,输出该链表中倒数第k个结点 两个指 ...
- 浅谈C#.NET防止SQL注入式攻击
1#region 防止sql注入式攻击(可用于UI层控制) 2 3/// 4/// 判断字符串中是否有SQL攻击代码 5/// 6/// 传入用户提交数据 7/// true-安全:f ...
- (转)linux内存源码分析 - 内存回收(lru链表)
原文:http://www.cnblogs.com/tolimit/p/5447448.html 概述 对于整个内存回收来说,lru链表是关键中的关键,实际上整个内存回收,做的事情就是处理lru链表的 ...
- (转)tune2fs命令详解
tune2fs命令详解(原创) 原文:http://czmmiao.iteye.com/blog/1749232 tune2fs简介 tune2fs是调整和查看ext2/ext3文件系统的文件系统参数 ...