当前位置: 首页 > news >正文

SDO_Geometry说明

2010年12月27日

 

 转自http://www.cnblogs.com/upDOoGIS/archive/2009/05/20/1469871.html

 

Oracle SpatialSDO_Geometry说明

    ArcGIS中通过SDE存储空间数据到Oracle中有多种存储方式,分别有:二进制Long Raw ESRIST_Geometry以及基于Oracle SpatialSDO_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_TYPESDO_ELEM_INFO_ARRAYSDO_ORDINATE_ARRAY也是Oracle Spatial自定义的类型和 sdo_geometry 是一样的。

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

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

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

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

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

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

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

一、SDO_GTYPE

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

     其中,d 表示几何的维数。如二维、三维对应的d=2d=3l 定义了LRS。一般l=0

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

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

SDO_GTYPE

几何类型

相关描述

2000

未知的地理类型

Spatial会无视这个类型的地理对象

2001

单点Point类型

地理对象包含一个普通的点

2002

单线PolylineCurve类型

地理对象包含直线或片段segments

2003

Polygon类型

地理对象包含一个普通的多边形,但不包含空岛

2004

集合COLLECTION类型

地理包含不同类型元素集合

2005

多点MultiPoint类型

地理对象包含多个点的集合

2006

多线MutliPolyline和多曲线类型

地理对象有一或更多的线或曲线集合

2007

多多边形MutliPolygon类型

一个地理对象包含岛(多岛)的多边形和N个多边形

 

 

 

 

 

 

 

 

 

 

 

 

 

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

二、SDO_SRID

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

MDSYS.CS_SRS

列名

类型

列名描述

CS_NAME

VARCHAR2(68)

坐标系统名称

SRID

NUMBER(38)

空间参考ID,为唯一值。1-999999spatial使用的空间参考,1000000以后为用户自定义

AUTH_SRID

NUMBER(38)

可选的SRID,是个外键。另一个坐标系统的SRID

AUTH_NAME

VARCHAR2(256)

 

WKTEXT

VARCHAR2(2046)

 

CS_BOUNDS

MDSYS.SDO_GEOMETRY

 

 

 

 

 

 

 

 

 

 

 

 

 

三、 SDO_POINT

 

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

    SDO_POINT字段定义为含有XYZ属性的SDO_POINT_TYPE类型。如果几何类型为点类型的话,SDO_ELEM_INFO SDO_ORDINATES对应的值都为NullSDO_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_arraya,b.c),其中a,b.cNumber类型。

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

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

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

    4.1SDO_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.2SDO_ETYPE :声明元素的类型。可结合 SDO_STARTING_OFFSETSDO_ETYPE 表来理解.

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

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

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

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

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

          SDO_STARTING_OFFSETSDO_ETYPE  如下图3:

        

五、SDO_ORDINATES

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

    SDO_ORDINATES存储的是空间对象的几何节点坐标序列,用逗号将XYZ以及不同点之间隔开,该字段性质:长度=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 = 20032003中的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,而118组成几何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 = 20022002中的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)
                     )
        );

 

 

相关文章:

  • GDI对象导致内存泄露
  • CCNA 笔记整理之IP路由(持续更新)
  • 一个帖子掌握android所有控件、ProgressBar 、Android 动画效果、SQLite、四大组件、Android多媒体(转...
  • Android系统模拟器绘制实现概述
  • 保留网页中空链接样式的几种写法(转)
  • DockOne微信分享(一零七):SRE工程实践——基于时间序列存储数据的报警
  • Blend中行为与Command
  • JSONP原理
  • 灭绝僵尸
  • HTTP 05 安全
  • ajax跨域jsonp及jquery中的调用问题
  • idea中git远程版本回退
  • Linux中查看系统版本的方法
  • 心有多大,微博就有多大!
  • 21.26 mongodb介绍
  • 【5+】跨webview多页面 触发事件(二)
  • 2017年终总结、随想
  • canvas绘制圆角头像
  • EOS是什么
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • ReactNativeweexDeviceOne对比
  • Sublime Text 2/3 绑定Eclipse快捷键
  • webgl (原生)基础入门指南【一】
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 基于axios的vue插件,让http请求更简单
  • 简单易用的leetcode开发测试工具(npm)
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 实现菜单下拉伸展折叠效果demo
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 算法-插入排序
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 详解移动APP与web APP的区别
  • raise 与 raise ... from 的区别
  • 如何用纯 CSS 创作一个货车 loader
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (超详细)语音信号处理之特征提取
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (十三)Flask之特殊装饰器详解
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (学习日记)2024.01.19
  • (转)德国人的记事本
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET 跨平台图形库 SkiaSharp 基础应用