在ArcGIS中通过SDE存储空间数据到Oracle中有多种存储方式,分别有:二进制Long Raw 、ESRI的ST_Geometry以及基于Oracle Spatial的SDO_Geometry等等。

关于这几种方式的各自的优缺点不是主要的探讨的方向,这些我们可以通过ArcGIS中的ArcGIS Server Help得到相关的帮助。这里主要是学习关于基于Oracle Spatial的存储方式,通过这种存储方式几何列Shape的字段类型为mdsys.sde_geometry类型。

Oracle Spatial定义的SDO_GEOMETRY类型为:

CREATE TYPE sdo_geometry AS OBJECT (

SDO_GTYPE   NUMBER,  //前面字符串为字段名;后面字符串为字段类型

SDO_SRID    NUMBER,

SDO_POINT    SDO_POINT_TYPE,

SDO_ELEM_INFO    SDO_ELEM_INFO_ARRAY,

SDO_ORDINATES    SDO_ORDINATE_ARRAY);

其中sdo_geometry AS OBJECT ,标识该类型为对象类型。开始我们可以想想它为ArcObjects中的Geometry对象(本来要素的shape字段中的对象就是 Geometry),而不要理解他是怎么样组织的。至于该类型中的SDO_POINT_TYPE、SDO_ELEM_INFO_ARRAY、 SDO_ORDINATE_ARRAY也是Oracle Spatial自定义的类型和 sdo_geometry 是一样的。

现在对sdo_geometry 类型中的各个参数简单的介绍:

1、SDO_GTYPE :表示要存储的几何类型,如点线面。它是通过 NUMBER类型来表达的;

2、SDO_SRID :几何的空间参考坐标系,类型也为 NUMBER;

3、SDO_POINT :如果几何类型点类型的话,就是存储点坐标,否则为空。oracle自定义的SDO_POINT_TYPE类型;

4、SDO_ELEM_INFO :定义要如何理解SDO_ORDINATES中的坐标串的;

5、SDO_ORDINATES :存储实际坐标的,以X、Y以及不同点之间都是逗号隔开;

下面将详细介绍这些字段参数的含义

一、SDO_GTYPE

SDO_GTYPE值是有四位数字组成的,它们的格式为:dltt 。

其中,d 表示几何的维数。如二维、三维对应的d=2和d=3;

l 定义了LRS。一般l=0;

tt 定义了地理对象的类型。现在使用从00到07,如tt=01代表为单点;

下面就是t=2的二维几何类型,SDO_GTYPE参数值具体,如 图1:

对于一个给定的层,所有的地理对象必须都是相同的维度,不能将二维与三维的数据放在一个层里。

二、SDO_SRID

SDO_SRID定义了空间坐标参考系统。如果SDO_SRID为null,则没有指定坐标系统,如果SDO_SRID不为null,那么它的值必须在在 MDSYS.CS_SRS 表中的 SRID 列有对应的值,而且它的值必须插入USER_SDO_GEOM_METADATA视图中。MDSYS.CS_SRS 表参考图3

三、 SDO_POINT

SDO_POINT类型的构造方法为:sdo_point_type(x,y,z),其中x,y,z类型为Double和Int都可

SDO_POINT字段定义为含有X、Y、Z属性的SDO_POINT_TYPE类型。如果几何类型为点类型的话,SDO_ELEM_INFO 和SDO_ORDINATES对应的值都为Null,SDO_POINT 不为空。其它情况下,SDO_POINT会被Spatial所忽略即设为 Null。如果这个层只有点对象,那么推荐你将其保存在SDO_POINT属性中。 SDO_POINT_TYPE类型的定义如下:

CREATE TYPE sdo_point_type AS OBJECT (

X    NUMBER,  //X坐标值

Y    NUMBER,  //y坐标值

Z    NUMBER); //z坐标值

四、SDO_ELEM_INFO

SDO_ELEM_INFO类型的构造方法为:sdo_elem_info_array(a,b.c),其中a,b.c为Number类型。

SDO_ELEM_INFO是理解和掌握SDO_Geometry的重点和难点,SDO_ELEM_INFO 定义了如何理解SDO_ORDINATES中的坐标字符串属性。

SDO_ELEM_INFO每三个数字组合为一个SDO_ELEM_INFO属性单元(具体可以结合下面的例子理解)。

每个SDO_ELEM_INFO属性单元由:SDO_STARTING_OFFSET、SDO_ETYPE 和SDO_INTERPRETATION 组成。下面介绍一下这三个数字的具体含义:

4.1、SDO_STARTING_OFFSET:声明了组成当前几何片段的第一个坐标在SDO_ORDINATES数组中的坐标序号。坐标序号是从1开 始起算的而非从0开始。这里的SDO_ORDINATES就是sdo_geometry 中的坐标序列,坐标序列是已逗号隔开的数字,具体的计算如:sdo_ordinate_array(1,4,6,7,8,9)中如果以'6'开始几何片段 的话,坐标序号SDO_STARTING_OFFSET=3。(具体参考下面的例子理解)

4.2、SDO_ETYPE :声明元素的类型。可结合 SDO_STARTING_OFFSET和SDO_ETYPE 表来理解.

SDO_ETYPE 值 = 1, 2, 1003,或2003,说明几何为简单的几何类型。可以全部按SDO_ELEM_INFO 属性单元【即三个以逗号隔开的数】来理解sdo_ordinate_array中的坐标序列。

特别说明:SDO_ETYPE 值 = 1003 ,假如几何类型为面,则表示为外多边形环(以逆时针顺序)

SDO_ETYPE 值 = 2003 ,假如几何类型为面,则表示为内多边形环(以顺时针顺序)

SDO_ETYPE 值 = 4,1005或2005,说明几何为组合元素,往往第一个三数字组不是SDO_ELEM_INFO 属性单元,而是为了说明组合元素的信息。具体可以参见下面 复杂多义线 和 复杂多边形 的例子。

4.3、SDO_INTERPRETATION:有两种可能的意思,依赖地SDO_ETYPE是否是组合元素。如果SDO_ETYPE 值 = 4,1005或2005,标识的是有多少组合部分,具体参考 复杂多义线 和 复杂多边形 的例子。如果SDO_ETYPE 值 = 1, 2, 1003,或2003,标识决定了元素坐标队列的翻译顺序。

五、SDO_ORDINATES

SDO_ORDINATES类型的构造方法为:sdo_ordinate_array(x1,y1,x2,y2,……),其中x1,y1类型等为Double和Int都可。

SDO_ORDINATES存储的是空间对象的几何节点坐标序列,用逗号将X、Y、Z以及不同点之间隔开,该字段性质:长 度=1048576的数字Number类型。如果几何为二维的情况,存储的序列为{Y1, X2, Y2, X3, Y3, X4, Y4......}格式;几何为三维坐标的话,如三维坐标的多边形它的存储的序列为{X1, Y1, Z1, X2, Y2, Z2, X3, Y3, Z3, X4, Y4, Z4, X1, Y1, Z1}格式。坐标序列中的数据必须都合法且不为空。具体坐标的组合成几何的结合SDO_ELEM_INFO来理解。

六、参考例子:

6.1、矩形:

矩形的具体几何形状和坐标,如下图:

用SDO_GEOMETRY定义该矩形,如何确定sdo_geometry()构造方法中的各个参数值。详细解释如下:

SDO_GTYPE = 2003;2003中的2表示二维数据,2003中的3表示表示多边形。具体参考 图1

SDO_SRID = NULL;

SDO_POINT = NULL;

SDO_ELEM_INFO = (1, 1003, 3).;在属性单元SDO_ELEM_INFO (1,1003,3)中的最后一个3表示该几何为矩形,具体参考 图4 。

---因为它是矩形且为二维所以它的构造方法为:sdo_point_type(坐下坐标,右上坐标)。

SDO_ORDINATES = (1,1, 5,7). 定义了具体的坐下坐标和右上坐标的坐标序列。

例子:用SQL 命令插入一个矩形:

INSERT INTO beniy388 VALUES(

1,          //其他的属性字段的值

'UpDooGIS',    //其他的属性字段的值

MDSYS.SDO_GEOMETRY(  //几何字段SDO_GEOMETRY的值

2003,  -- 二维多边形

NULL,

NULL,

MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,3), -- 一个矩形(1003为逆时针方向)

MDSYS.SDO_ORDINATE_ARRAY(1,1, 5,7) -- 只需要两点

)

);

6.2、有岛多边形:

有岛多边形的具体几何形状和坐标,如下图:

用SDO_GEOMETRY定义该多边形,如何确定sdo_geometry()构造方法中的各个参数值。详细解释如下:

SDO_GTYPE = 2003;---2003中的2表示二维数据,2003中的3表示表示多边形。具体参考 图1

SDO_SRID = NULL;

SDO_POINT = NULL;

SDO_ELEM_INFO = (1,1003,1, 19,2003,1); ---有两个三元组SDO_ELEM_INFO属性元素。具体参考 图4

---其中1003表明对应的坐标序列组成的几何A为外多边形环(顺时针);而2003表明对应的坐标序列组成的几何B为内多边形环(逆时针)。

---19 表示几何B坐标序列开始的位置,也就是说从19开始的几何坐标组成几何B,而1到18组成几何A。

SDO_ORDINATES = (10,10, 10,14, 6,10, 14,10);---坐标系列

例子:用SQL 命令插入一个有岛的多边形:

INSERT INTO beniy388 VALUES

10,                   //其他的属性字段的值

'UpDooGIS',       //其他的属性字段的值

MDSYS.SDO_GEOMETRY(  //几何字段SDO_GEOMETRY的值

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)

)

);

6.3、复杂多义线

下图描述的是一个由一条直线和一条曲线构成的复杂多义线。图中出现了4个点,(10,10)和(10,14)点表示的是直线 ;10,14), (10,6), 和 (14,10) 描述的是圆弧曲线:

用SDO_GEOMETRY定义该复杂多义线,如何确定sdo_geometry()构造方法中的各个参数值。详细解释如下:

SDO_GTYPE = 2002;2002中的2表示二维数据,第二个2表示表示一条或多条直线段。具体参考 图1。

SDO_SRID = NULL;

SDO_POINT = NULL;

SDO_ELEM_INFO = (1,4,2, 1,2,1, 3,2,2). ---有三个三元组,其中后两个是SDO_ELEM_INFO属性元素三元组,前一个为表述组合。具体参考 图4。

---第一个三元组【1,4,2】,根据4可以得到是个描述三元组,2表示有两个几何元素组成,即后两个三元组描述各自的几何A和几何B。

---第二个三元组【1,2,1】,为SDO_ELEM_INFO属性元素三元组,它描述的是几何A。根据 图4可以得到它是一条直线段,且该直线段的最后一个节点还是下一个几何B的开始点,即几何A和几何B有几何节点重合。

---第二个三元组【3,2,2】,为SDO_ELEM_INFO属性元素三元组,它描述的是几何B。根据 图4可以得到它是一条曲线段,该几何B的起点和几何A终点节点重合。

SDO_ORDINATES = (10,10, 10,14, 6,10, 14,10);---坐标系列

例子:用SQL 命令插入一个复杂多义线:

INSERT INTO beniy388 VALUES(

11,                   //其他的属性字段的值

'UpDooGIS',       //其他的属性字段的值

MDSYS.SDO_GEOMETRY(  //几何字段SDO_GEOMETRY的值

2002,

NULL,

NULL,

MDSYS.SDO_ELEM_INFO_ARRAY(1,4,2, 1,2,1, 3,2,2), -- 复杂多义线

MDSYS.SDO_ORDINATE_ARRAY(10,10, 10,14, 6,10, 14,10)

)

);

oracle spatial java 类库,[ Oracle Spatial 系列 ] 之一 SDO_Geometry详细说明(ZZ)相关推荐

  1. java中oracle.链接,java连接Oracle数据库的方法解析

    本文主要对java连接Oracle数据库方法进行步骤解析,具有很好的参考价值,需要的朋友一起来看下吧 Oracle数据库先创建一个表和添加一些数据 1.先在Oracle数据库中创建一个student表 ...

  2. java调用oracle过程,JAVA调用ORACLE存储过程报错

    当前位置:我的异常网» Java Web开发 » JAVA调用ORACLE存储过程报错 JAVA调用ORACLE存储过程报错 www.myexceptions.net  网友分享于:2015-07-1 ...

  3. Oracle 原理: JAVA连接Oracle数据库 (JDBC)

    首先第一步要新建JAVA工程并且到导入Oracle驱动到JAVA外部依赖包: 驱动也可以在网络上找.只要下载Oracle,Oracle驱动就存在,驱动就是 jdbc目录下的ojdbc6.jar文件., ...

  4. java oracle dbhelper,Java实现Oracle连接的DbHelper及相关异常

    Java中使用DbHeplper来连接Oracle数据库时,一般可以分为以下几个步骤: 第一步,导入sql包: 第二步,将Oracle中的Java驱动包添加到项目下,并生成路径,Java驱动包存放在路 ...

  5. oracle的java路径,oracle学习----访问路径

    什么是访问路径?表扫描数据的时候使用了什么方式,这个方式就是访问路径 1.全表扫描 TABLE ACCESS FULL 全表扫描,多块读,等待事件:db file scattered read 如果是 ...

  6. oracle truct,java向oracle 存储过程 传输数组

    1 根据传参创建一个自定义类型 create or replace type user_type force as object( age number, username nvarchar2(20) ...

  7. java查询数据比Oracle少,java对ORACLE中的于NCHAR数据的处理,查询

    nchar 数据如果指定了长度,如果数据不满指定的位数,将会在后面补空格. 所以当你使用 jdbc 或者其他框架以该字段作为查询条件时,形成的 sql 也会自动补空格 如: SELECT FROM m ...

  8. 『Oracle数据复制容灾案例系列』兴业证券Oracle容灾案例

    『Oracle数据复制容灾案例系列』   兴业证券Oracle数据库复制容灾案例 使用产品:DDS 上线时间:2006 系统环境:Oracle 10g RAC  IBM AIX5L 应用系统:恒生 证 ...

  9. 『Oracle数据复制容灾案例系列』中银国际证券Oracle容灾案例

    『Oracle数据复制容灾案例系列』   中银国际证券Oracle数据库容灾案例 使用产品:DDS 上线时间:2007 系统环境:Oracle 10g RAC 惠普 安腾 IA 64 HPUX 11. ...

最新文章

  1. CCNp笔记(EIGRP)
  2. 如何学习SVM?怎么改进实现SVM算法程序?答案来了
  3. 神经网络的设计与分析之概述
  4. 国外程序员整理的 C++ 资源大全 (zt)
  5. TCP客户端服务端编程模型
  6. SAP NetWeaver平台介绍
  7. linux 加jre环境变量
  8. 计算机网络原理笔记-三次握手
  9. python学习-类(类方法、实例方法、静态方法)
  10. JSONModel的基本使用
  11. mysqlbinlog工具_带你解析MySQL binlog
  12. codeforces B. Strongly Connected City(dfs水过)
  13. 信安教程第二版-第6章认证技术原理与应用
  14. dataframe格式的数据处理
  15. php开源qq群,QQ群免IDKEY加群PHP源码
  16. 30篇记录==一个月了~
  17. GoldenGate实施参考
  18. 熊猫烧香病毒样本分析
  19. Twitter开发者账号申请流程
  20. win7网上邻居_win7系统网上邻居在哪

热门文章

  1. 分享131个ASP源码,总有一款适合您
  2. 计算机原理(CPU是如何进行工作的?)
  3. 说说Android桌面(Launcher应用)背后的故事(八)——让桌面的精灵穿越起来
  4. 真正实现flash涂鸦论坛
  5. java基于web的自行车租赁系统ssh
  6. AP微积分该如何学习?
  7. BDD - SpecFlow Web UI 测试实践
  8. pytesseract识别中文并获得中文的位置信息(Bounding Box)
  9. Window安装Go语言最新版
  10. 粉丝投稿 | [CPU+目标检测] OpenVINO 实现 Robomaster 自瞄