转:http://blog.csdn.net/jing_xin/article/details/4355642

由于最近弄一些空间数据,所以找了些oracle空间数据库的一些知识.下面是汇总:

Oracle Spatial由一坨的对象数据类型,类型方法,操作子,函数与过程组合而成。一个地理对象作为一个SDO_GEOMETRY对象保存在表的一个字段里。空间索引则由普通的DDL和DML语句来建立与维护。

创建表: CREATE TABLE cola_markets

( mkt_id NUMBER PRIMARY KEY,

name VARCHAR2(32),

shape SDO_GEOMETRY

);

插入数据:

INSERT INTO cola_markets

VALUES(

1,

'cola_a',

SDO_GEOMETRY(

2003, -- two-dimensional polygon

NULL,

NULL,

SDO_ELEM_INFO_ARRAY(1,1003,3), -- one rectangle (1003 = exterior)

SDO_ORDINATE_ARRAY(1,1, 5,7) -- only 2 points needed to

-- define rectangle (lower left and upper right) with

-- Cartesian-coordinate data ) );

INSERT INTO cola_markets VALUES(

2,

'cola_b',

SDO_GEOMETRY( 2003, -- two-dimensional polygon

NULL,

NULL,

SDO_ELEM_INFO_ARRAY(1,1003,1), -- one polygon (exterior polygon ring)

SDO_ORDINATE_ARRAY(5,1, 8,1, 8,6, 5,7, 5,1) ) );

INSERT INTO cola_markets VALUES(

3,

'cola_c',

SDO_GEOMETRY( 2003, -- two-dimensional polygon

NULL,

NULL,

SDO_ELEM_INFO_ARRAY(1,1003,1), -- one polygon (exterior polygon ring)

SDO_ORDINATE_ARRAY(3,3, 6,3, 6,5, 4,5, 3,3) ) );

INSERT INTO cola_markets VALUES(

4,

'cola_d',

SDO_GEOMETRY( 2003, -- two-dimensional polygon

NULL,

NULL,

SDO_ELEM_INFO_ARRAY(1,1003,4), -- one circle

SDO_ORDINATE_ARRAY(8,7, 10,9, 8,11) ) );

更新视图:

USER_SDO_GEOM_METADATA INSERT INTO user_sdo_geom_metadata (TABLE_NAME, COLUMN_NAME, DIMINFO, SRID)

VALUES ( 'cola_markets', 'shape', SDO_DIM_ARRAY( -- 20X20 grid SDO_DIM_ELEMENT('X', 0, 20, 0.005), SDO_DIM_ELEMENT('Y', 0, 20, 0.005) ), NULL -- SRID );

创建空间索引:

CREATE INDEX cola_spatial_idx ON cola_markets(shape) INDEXTYPE IS MDSYS.SPATIAL_INDEX; -- Preceding statement created an R-tree index.

这样在mapguide下就可以preview空间数据信息.

下面来说一下其中最关键的一些object:

( SDO_GEOMETRY对象类型 在Spatial中,地理对象的描述是放在一个单独的类型为SDO_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);

当然Spatial也定义了SDO_POINT_TYPE, SDO_ELEM_INFO_ARRAY, 和 SDO_ORDINATE_ARRAY类型:

CREATE TYPE sdo_point_type AS OBJECT (

X NUMBER,

Y NUMBER,

Z NUMBER);

CREATE TYPE sdo_elem_info_array AS VARRAY (1048576) of NUMBER;

CREATE TYPE sdo_ordinate_array AS VARRAY (1048576) of NUMBER;

因为SDO_ORDINATE_ARRAY最大为1048576,所以SDO_GEOMETRY对象的顶点数量就依赖于它的维度,二维为524288,三维为349525,四维只有262144个顶点了。

注意:

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

如果你使用四位的SDO_ETYPE那么,你也要使用四位的SDO_GTYPE。

)

SDO_GEOMETRY Object Type

2.1 SDO_GTYPE  dltt

d:维数

l:linear referencing system (LRS)

tt:Geometry type

00 UNKNOWN_GEOMETRY

01 POINT

02 LINE or CURVE

03 POLYGON

04 COLLECTION

05 MULTIPOINT

06 MULTILINE or MULTICURVE

07 MULTIPOLYGON

2.2 SDO_SRID

确认coordinate system,此值为SDO_COORD_REF_SYS表中的SRID值。此值也被插入到USER_SDO_GEOM_METADATA视图中。

2.3 SDO_POINT

(1)SDO_ELEM_INFO and SDO_ORDINATES are both null

(2)SDO_POINT attribute is non-null

结论:存储坐标

2.4 SDO_ELEM_INFO

用来解释存储在SDO_ORDINATES属性中的坐标信息。

SDO_STARTING_OFFSET:SDO_ORDINATES中的offset min为1

SDO_ETYPE: 1, 2, 1003, and 2003 simple elements; 3 polygon ring; 4, 1005, and 2005 compound elements

SDO_INTERPRETATION

2.5 SDO_ORDINATES

长数组,存放空间对象的坐标

2.6 Usage Considerations

SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT 用来检查几何对象的一致性。

1.1 SDO_GEOMETRY字段详解

Oracle Spatial的空间数据都存储在空间字段sdo_Geometry中,理解sdo_Geometry是编写Oracle Spatial程序的关键。sdo_Geometry是按照Open GIS规范定义的一个对象,其原始的创建方式如下所示:

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_GTYPE

NUMBER

几何对象的类型

SDO_SRID

NUMBER

几何对象的坐标系

SDO_POINT

SDO_POINT_TYPE

表示几何类型为点的几何对象

SDO_ELEM_INFO

SDO_ELEM_INFO_ARRAY

是一个可变长度的数组,每3个数作为一个元素单位,用于解释坐标是如何存储在SDO_ORDINATES中的

SDO_ORDINATES

SDO_ORDINATE_ARRAY

是一个可变长度的数组,用于存储几何对象的真实坐标,该数组的类型为NUMBER型

表1.1.1  sdo_geometry 各组成部分的意义

① SDO_GTYPE

是一个NUMBER型的数值,用来定义存储几何对象的类型。SDO_GTYPE是一个4个数字的整数,其格式为dltt,其中d表示几何对象的维数;l表示三维线性参考系统中的线性参考值,当d为3维或者4维时需要设置该值,一般情况下为空;tt为几何对象的类型,Oracle Spatial定义了7种类型的几何类型,目前,tt使用了00到07,其中08到99是Oracle Spatial保留的数字,以备将来几何对象扩展所用。下表描述了Oracle Spatia1支持的几何对象类型。

数值    几何类型        描述

DL00                    用于存放自定义类型的几何对象

DL01    点              几何对象包含一个点

DL02    直线或曲线      几何对象由直线或曲线段组成

DL03    多边形          几何对象包含一个多边形,该多边形可以含有洞

DL04    复合形状集      点、线、多边形超集,可包含所有类型

DL05    复合点          几何对象由一个点或多个点组成

DL06    复合线或曲线    几何对象由一条线或多条线组成

DL07    复合多边形      几何对象可以包含多个外环、多个不相交的多边形

DL08 - 99               Oracle Spatial 暂且保留

表1.1.2  Oracle Spatia1支持的几何对象类型
② SDO_SRID

SDO_SRID也是一个NUMBER型的数值,它用于标识与几何对象相关的空间坐标系。如果SDO_SRID为空(null),则表示没有坐标系与该几何对象相关;如果该值不为空,则该值必须为MDSYS.CS_SRS表中SRID字段的一个值,在创建含有几何对象的表时,这个值必须加入到描述空间数据表元数据的USER_SDO_GEOM_METADATA视图的SRID字段中。对于我们通常使用国际标准的Longitude/Latitude(8307),Oracle Spatial规定,一个几何字段中的所有几何对象都必须为相同的SDO_SRID值。
③ SDO_POINT

SDO_POINT是一个包含三维坐标X,Y,Z数值信息的对象,用于表示几何类型为点的几何对象。如果SDO_ELEM_INFO和SDO_ORDINATES数组都为空,则SDO_POINT中的X,Y,Z为点对象的坐标值,否则,sdo_Point的值将被忽略(用NULL表示)。Oracle Spatial强烈要求用SDO_POINT存储空间实体为点类型空间数据,这样可以极大的优化Oracle Spatial的存储性能和查询效率。

④ SDO_ELEM_INFO

SDO_ELEM_INFO是一个可变长度的数组,每3个数作为一个元素单位,用于表示坐标是如何存储在SDO_ORDINATES数组中的。本文把组成一个元素的3个数称为3元组。一个3元组包含以下3部分的内容:

◇ SDO_STARTING_OFFSET SDO_STARTING_OFFSET 表明每个几何元素的第一个坐标在SDO_ORDINATES数组中的存储位置。它的值从1开始,逐渐增加。

◇ SDO_ETYPE SDO_ETYPE 用于表示几何对象中每个组成元素的几何类型。当它的值为1, 2, 1003和2003时,表明这个几何元素为简单元素。如果SDO_ETYPE为1003,表明该多边形为外环(第一个数为1表示外环),坐标值以逆时针存储;如果SDO_ETYPE为2003,表明该多边形为内环(第一个数为2表示内环),坐标值以顺时针存储。当SDO_ETYPE为4, 1005和2005时,表明这个几何元素为复杂元素。它至少包含一个3元组用以说明该复杂元素具有多少个几何简单元素。同样,1005表示多边形为外环,坐标值以逆时针存储;2005表示多边形为内环,坐标值以顺时针存储。

SDO_INTERPRETATION SDO_INTERPRETATION具有两层含义,具体的作用由SDO_ETYPE是否为复杂元素决定。如果SDO_ETYPE是复杂元素(4, 1005和2005),则SDO_INTERPRETATION表示它后面有几个子3元组属于这个复杂元素。如果SDO_ETYPE是简单元素(1, 2, 1003和2003),则SDO_INTERPRETATION表示该元素的坐标值在SDO_ORDINATES中是如何排列的。 需要注意的是,对于复杂元素来说,组成它的子元素是连续的,一个子元素的最后一个点是下一个子元素的起点。最后一个子元素的最后一个坐标要么与下一个元素的SDO_STARTING_OFFSET值减1所对应的坐标相同,要么是整个SDO_ORDINATES数组的最后一个坐标。SDO_ETYPE和SDO_INTERPRETATION之间的关系如下表:

SDO_ETYPE        SDO_INTERPRETATION           描述说明

0                任意值                       用于自定义类型,Oracle Spatial不支持

1                1                            点类型

1                n > 1                        具有n个点的点集合

2                1                            由直线段组成的线串

2                2                            由弧线段组成的线串,一个弧线段由起点、弧线上任意一点和终点组成,相邻两个弧线段的接点只需要存储一次

1003 2003             1                            由直线段组成的多边形,起点和终点必须相同

1003 2003             2                            由弧线段组成的多边形,起点和终点必须相同。一个弧线段由起点、弧线上任意一点和终点组成,相邻两个弧线段的接点只需要存储一次

1003 2003             3                            矩形:由左下角和右上角两点确定

1003 2003             4                            圆:由圆周上的三个点组成

4                n >1                         由直线段和弧线段组成的复合线,n表示复合线的相邻子元素的个数,子元素的SDO_ETYPE必须为2,一个子元素的最后一点是下一子元素的第一个点,并且该点不能重复

1005 2005             n >1                         由直线段和弧线段组成的复合多边形,n表示复合线的相邻子元素的个数,子元素的SDO_ETYPE必须为2,一个子元素的最后一点是下一子元素的第一个点,并且该点不能重复。多边形的起点和终点必须相同

表1.1.3

SDO_ETYPE和SDO_INTERPRETATION 的组合关系

⑤ SDO_ORDINATES

SDO_ORDINATES是一个可变长度的数组,用于存储几何对象的实际坐标,是一个最大长度为1048576,类型为Number的数组。

SDO_ORDINATES必须与sdo_Elem_Info数组配合使用,才具有实际意义。SDO_ORDINATES的坐标存储方式由几何对象的维数决定,如果几何对象为二维,则SDO_ORDINATES的坐标以{ x1, y1, x2, y2, …}顺序排列,如果几何对象为三维,则SDO_ORDINATES的坐标以{x1, y1, z1, x2, y2, z2, …}的顺序排列。

实例说明 下面用实例来进一步说明SDO_GEOMETRY对象的使用方法。
① 一个带洞的多边形
• SDO_GTYPE = 2003,表示几何对象是一个二维的多边形。

• SDO_SRID = NULL,在二维情况下不需设置线性参考值。

• SDO_POINT = NULL,表示几何对象不是点类型。

• SDO_ELEM_INFO = (1,1003,1, 19,2003,1),有两个三元组元素(1,1003,1) 和(19,2003,1),按照先后顺序,在(1,1003,1)中,“1”表示该子元素的起点为SDO_ORDINATES数组中的第1个值,“1003”表示该元素为多边形外环,“1”表示该多边形由直线组成;在(19,2003,1)中,“19”表示该子元素的起点为SDO_ORDINATES数组中的第15个值,“2003”表示该元素为多边形内环,“1”表示该多边形由直线组成。

• 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)。外环坐标以逆时针排列,内环坐标以顺时针排列。

② 一个直线段与弧线段组成的复合线串

• SDO_GTYPE = 2002,表示几何对象是一个二维的线串。

• SDO_SRID = NULL,在二维情况下不需设置线性参考值。

• SDO_POINT = NULL,表示几何对象不是点类型。

• SDO_ELEM_INFO = (1,4,2, 1,2,1, 3,2,2),有三个三元组元素(1,4,2)(1,2,1) 和(3,2,2),按照先后顺序,(1,4,2)表示该线串为复合线串,它由下面两个三元组描述的子元素组成;在(1,2,1)中,“1”表示该子元素的起点为SDO_ORDINATES数组中的第1个值,“2”表示该元素为线,“1”表示这段线由直线组成;在(3,2,2)中,“3”表示该子元素的起点为SDO_ORDINATES数组中的第3个值,“2”表示该元素为线,“2”表示这段线由弧线段组成。

• SDO_ORDINATES = (10,10, 10,14, 6,10, 14,10),坐标(10,14)是直线段和弧线段的连接点,没有重复存储。
③ 一个直线段与弧线段组成的复合多边形

• SDO_GTYPE = 2003,表示几何对象是一个二维的多边形。

• SDO_SRID = NULL,在二维情况下不需设置线性参考值。

• SDO_POINT = NULL,表示几何对象不是点类型。

• SDO_ELEM_INFO = (1,1005,2, 1,2,1, 5,2,2),有三个三元组元素(1,2005,2)(1,2,1) 和(5,2,2),按照先后顺序,(1,2005,2)表示该多边形为复合多边形,它由下面两个三元组描述的子元素组成;在(1,2,1)中,“1”表示该子元素的起点为SDO_ORDINATES数组中的第1个值,“2”表示该元素为线,“1”表示这段线由直线组成;在(5,2,2)中,“5”表示该子元素的起点为SDO_ORDINATES数组中的第5个值,“2”表示该元素为线,“2”表示这段线由弧线段组成。

• SDO_ORDINATES = (6,10, 10,1, 14,10, 10,14, 6,10),坐标(14,10)是直线段和弧线段的连接点,没有重复存储。     在Oracle Spatial中,可以运用SQL语句进行几何数据的各种操作,例如: 创建一个oralce数据库名为Data1:

Create Table Data1( mktID integer,//第几号目标

Name char(20),                        //目标名称

Shape SDO_GEOMETRY                     //目标的空间数据 );

把上例中的复合多边形插入数据库Data1:

Insert into Datal values( 1,                      //编号

‘复合多边形’,                                   //名称

MDSYS.SDO_GEOME1RY(2003,NULL,NULL,              //空间数据

MDSYS.SDO_ELEM _INFO_ARRAY( 1, 1005, 2, 1, 2, 1, 5, 2, 2 ),

MDSYS.SDO_ORDINATES_ARRAY(6,10, 10,1, 14,10, 10,14, 6,10) );

oracle 空间数据库说明的更多相关文章

  1. Oracle空间数据库的备份与恢复

    大型GIS系统,存储.管理海量(TB级)空间数据时,数据库备份变的尤其重要.这里随笔说说冷备份的一种方法. 基于ArcSDE.Oracle空间库的冷备份: (1) 在数据入库工作后或者更新变动较大时, ...

  2. Qgis连接Oracle

    CMake编译中选择编译Oracle一项以后,编译的qgis才会有连接Oracle数据库的功能. 编译qgis以后,可以通过添加矢量图层中选择Oracle数据库,或是添加Oracle空间图层,或是添加 ...

  3. Oracle spatial、openlayers、geoserver开发地理信息系统总结

    感谢开源,使用OpenLayers+Geoserver的地理信息系统开发很简单,完全可以套用开发MIS系统的经验,我这里总结为三个步骤: 1.数据准备 2.数据发布 3.数据展现 我将按照这个思路来介 ...

  4. 学习OCI编程

    转自:http://kulong0105.blog.163.com/blog/static/174406191201162145944574/ 最近公司做的一个项目,要处理海量数据,数据是存放在Ora ...

  5. 开源GIS-对比GeoServer和MapServer

    1  主流组合: 基于C.C++系列的:Mapserver(服务器)+QGIS(桌面软件)+PostGIS(数据库)+Openlayers(JS)/ openscale (FLex)(浏览器客户端) ...

  6. MapServer教程3

    Compiling on Unix Compiling on Win32 PHP MapScript Installation .NET MapScript Compilation IIS Setup ...

  7. Oracle下的ArcSDE创建的空间数据库的备份与恢复

    对Oracle下ArcSDE创建的空间数据库, 整体备份.恢复或迁移. 一.imp和exp命令方式 1.1 数据库完整备份 检查数据库字符集是否一致 SQL>select userenv(‘la ...

  8. 有oracle 10g,但没有安装arcgis,又想使用空间数据库的解决方案

    我在一台虚拟机中部署系统进行测试,配置如下: OS:WIN2008 R2 SP1 X64 DB: oracle 12c 结果系统报错,查找原因,原来是oracle里还不支持arcgis的一些所谓的空间 ...

  9. Oracle案例11——Oracle表空间数据库文件收缩

    我们经常会遇到数据库磁盘空间爆满的问题,或由于归档日志突增.或由于数据文件过多.大导致磁盘使用紧俏.这里主要说的场景是磁盘空间本身很大,但表空间对应的数据文件初始化的时候就直接顶满了磁盘空间,导致经常 ...

随机推荐

  1. paip.获取proxool的配置 xml读取通过jdk xml 初始化c3c0在代码中总结

    paip.获取proxool的配置  xml读取通过jdk xml 初始化c3c0在代码中  xml读取通过jdk xml 初始化c3c0在代码中.. ... 作者Attilax  艾龙,  EMAI ...

  2. java 初学者需注意问题

    1.Java为什么能跨平台运行? Java语言编写的程序既是编译型的,又是解释型的.程序代码经过编译之后转换为一种Java字节码的中间语言,Java虚拟机即JVM将对字节码进行解释和运行.编译只进行一 ...

  3. Java中Atomic包的实现原理及应用

    1. 同步问题的提出 假设我们使用一个双核处理器执行A和B两个线程,核1执行A线程,而核2执行B线程,这两个线程现在都要对名为obj的对象的成员变量i进行加1操作,假设i的初始值为0,理论上两个线程运 ...

  4. 关于iReport报表的分页

    问题:二手车认证系统的检测报告采用iReport开发,开发者自定义了一张超级长的纸张,导致打印时自动缩放到了一张A4纸上.需要修改使之能够合理的分页打印,这是来到新公司的第一个任务. 解决方案一: 1 ...

  5. android如何播放和录制音频

    视频录制功能正在走来,在Androidsdk中有与之相关的类:android.media.MediaRecorder.当然,因为模拟器上没有提供必要的硬件设施,所以在学习过程中并不能实现.Media能 ...

  6. Backbone.js Wine Cellar 教程

    中文版: http://rd.189works.com/article-74541-1.html http://www.189works.com/article-74542-1.html http:/ ...

  7. Imagick总结及反思

    2014-08-23 今天安装Imagick出现了很多问题,自己也有些着急,以下为各版本信息: ImageMagick: 安装版本:ImageMagick-6.5.8-Q16 安装目录:E:/PHPS ...

  8. IOS 7 UI 的适配

    官方问题答案:https://developer.apple.com/library/ios/qa/qa1797/_index.html 官方建议: https://developer.apple.c ...

  9. 最近使用ajaxFileUpload和Jcrop来实现图片上传和截图,出现一个图片无法更换的问题

    使用setImage 都无法更换 刷新图片 找了很久 什么方法都找过,最后发现...... 原来是 上传的图片的命名问题... 每次上传的图片 保存后都是同样的图片, 所以返回路径都是一样... jc ...

  10. asp.net mvc 动态显示不同的部分视图

    首先是AJAX请求 //第一次打开 默认s单行文本 $.ajax({ type: "GET", url: "/Admin/Field/ChoiceType4Edit&qu ...