OracleGIS教程(PPt)OracleSpatial.ppt

上传人:小飞机 文档编号:6513394 上传时间:2023-11-08 格式:PPT 页数:33 大小:277.49KB
返回 下载 相关 举报
OracleGIS教程(PPt)OracleSpatial.ppt_第1页
第1页 / 共33页
OracleGIS教程(PPt)OracleSpatial.ppt_第2页
第2页 / 共33页
OracleGIS教程(PPt)OracleSpatial.ppt_第3页
第3页 / 共33页
OracleGIS教程(PPt)OracleSpatial.ppt_第4页
第4页 / 共33页
OracleGIS教程(PPt)OracleSpatial.ppt_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《OracleGIS教程(PPt)OracleSpatial.ppt》由会员分享,可在线阅读,更多相关《OracleGIS教程(PPt)OracleSpatial.ppt(33页珍藏版)》请在三一办公上搜索。

1、Oracle Spatial是Oracle公司推出的空间数据库组件,通过Oracle数据库系统存储和管理空间数据。Oracle从9i开始对空间数据提供了较为完备的支持。,Oracle Spatial简介,由于Oracle Spatial本身是ORACLE数据库的一个特殊的部分,因此可以用ORACLE提供的程序接口来对Oracle Spatial管理的空间数据进行操作。目前,ORACLE数据库主要提供两种接口方式对其数据进行存取:ORACLE提供的面向C语言程序员的编程接口OCI(Oracle Call Interface,简称OCI);用ORACLE本身所提供的OLE对象(Oracle Obj

2、ects for OLE,以下简称OO4O)来快速访问有关数据库。,Oracle Spatial主要通过元数据表、空间数据字段(即SDO_GEOMETRY字段)和空间索引来管理空间数据,并在此基础上提供一系列空间查询和空间分析的函数,让用户进行更深层次的GIS应用开发。Oracle Spatial使用空间字段SDO_GEOMETRY存储空间数据,用元数据表来管理具有SDO_GEOMETRY字段的空间数据表,并采用R树索引和四叉树索引技术来提高空间查询和空间分析的速度。,元数据表说明 Oracle Spatial的元数据表存储了有空间数据的数据表名称、空间字段名称、空间数据的坐标范围、坐标参考信

3、息以及坐标维数说明等信息。用户必须通过元数据表才能知道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对象的动态

4、数组,SRID则用于标识与几何对象相关的空间坐标参考系。SDO_DIM_ELEMENT对象的定义如下所示:Create Type SDO_DIM_ELEMENT as OBJECT(SDO_DIMNAME VARCHAR2(64),SDO_LB NUMBER,SDO_UB NUMBER,SDO_TOLERANCE NUMBER);其中,SDO_DIMNAME是空间维名称,SDO_LB为该空间维的左下角坐标,SDO_UB为该空间维的右上角坐标,SDO_TOLERANCE为几何对象的表示精度。,CREATE TABLE GEOD_CITIES(LOCATION MDSYS.SDO_GEOMETRY

5、,CITY VARCHAR2(42),STATE_ABRV VARCHAR2(2),POP90 NUMBER,RANK90 NUMBER);,例子,INSERT INTO USER_SDO_GEOM_METADATA(TABLE_NAME,COLUMN_NAME,DIMINFO,SRID)VALUES(GEOD_CITIES,LOCATION,MDSYS.SDO_DIM_ARRAY(MDSYS.SDO_DIM_ELEMENT(LONG,-180.0,180.0,0.0000005),MDSYS.SDO_DIM_ELEMENT(LAT,-90.0,90.0,0.0000005),NULL);,空

6、间字段解析 Oracle Spatial的空间数据都存储在空间字段SDO_GEOMETRY中,理解SDO_GEOMETRY是编写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_ARR

7、AY);该对象由五个部分组成,下面分别介绍这五个部分的定义方法。,(1)SDO_GTYPESDO_GTYPE是一个NUMBER型的数值,用来定义存储对象的类型。SDO_GTYPE是一个4个数字的整数,其格式为dltt,其中d表示几何对象的维数;l表示三维线性参考系统中的线性参考值,当d为3维或者4维时需要设置该值,一般情况下为空;tt为几何对象的类型,Oracle Spatial定义了7种类型的几何类型,目前,tt使用了00到07(包括一种用户自定义类型),另外,08到99是Oracle Spatial保留的数字,以备将来几何对象扩展所用。,(2)SDO_SRIDSDO_SRID也是一个NUM

8、BER型的数值,它用于标识与几何对象相关的空间坐标参考系。如果SDO_SRID为空(null),则表示没有坐标系与该几何对象相关;如果该值不为空,则该值必须为MDSYS.CS_SRS表中SRID字段的一个值,在创建含有几何对象的表时,这个值必须加入到描述空间数据表元数据的USER_SDO_GEOM_METADATA视图的SRID字段中。Oracle Spatial规定,一个几何字段中的所有几何对象都必须为相同的SDO_SRID值。,(3)SDO_POINTSDO_POINT是一个包含X,Y,Z数值信息的对象,用于表示几何类型为点的几何对象。如果SDO_ELEM_INFO和SDO_ORDINAT

9、ES数组都为空,则SDO_POINT中的X,Y,Z为点对象的坐标值,否则,SDO_POINT的值可以忽略(用NULL表示)。Oracle Spatial强烈建议用SDO_POINT存储空间实体为点类型空间数据,这样可以极大的优化Oracle Spatial的存储性能,提高查询效率。,(4)SDO_ELEM_INFOSDO_ELEM_INFO是一个可变长度的数组,每3个数作为一个元素单位,用于解释坐标是如何存储在SDO_ORDINATES数组中的。本文把组成一个元素的3个数称为3元组。一个3元组包含以下3部分的内容:l SDO_STARTING_OFFSETSDO_STARTING_OFFSET

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

11、05表示多边形为外环,坐标值以逆时针存储;2005表示多边形为内环,坐标值以顺时针存储。,l SDO_INTERPRETATION SDO_INTERPRETATION具有两层含义,具体的作用由SDO_ETYPE是否为复杂元素决定。如果SDO_ETYPE是复杂元素(4,1005和2005),则SDO_INTERPRETATION表示它后面有几个子3元组属于这个复杂元素。如果SDO_ETYPE是简单元素(1,2,1003和2003),则SDO_INTERPRETATION表示该元素的坐标值在SDO_ORDINATES中是如何排列的。需要注意的是,对于复杂元素来说,组成它的子元素是连续的,一个子元

12、素的最后一个点是下一个子元素的第一点。最后一个子元素的最后一个坐标要么与下一个元素的SDO_STARTING_OFFSET值减1所对应的坐标相同,要么是整个SDO_ORDINATES数组的最后一个坐标。,(5)SDO_ORDINATESSDO_ORDINATES是一个可变长度的数组,用于存储几何对象的真实坐标,该数组的类型为NUMBER型,它的最大长度为1048576。SDO_ORDINATES必须与SDO_ELEM_INFO数组配合使用,才具有实际意义。SDO_ORDINATES的坐标存储方式由几何对象的维数决定,如果几何对象为三维,则SDO_ORDINATES的坐标以X1,Y1,Z1,X2

13、,Y2,Z2,.的顺序排列,如果几何对象为二维,则SDO_ORDINATES的坐标以X1,Y1,X2,Y2,.顺序排列。,insert into BJPIC.GEOD_COUNTRY values(20,MDSYS.SDO_GEOMETRY(2007,NULL,NULL,MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1,53,1003,1),MDSYS.SDO_ORDINATE_ARRAY(109.633316,18.113594,109.142250,18.347574,108.855591,18.499420,108.764137,19.077269,108.78056

14、3,19.204344,108.888641,19.312555,109.077347,19.420931,109.401825,19.701113,109.623779,19.676178,109.645920,19.752447,109.753990,19.930529,109.861320,19.918058,110.119545,。,Oracle Spatial空间索引技术 Oracle Spatial提供了R树索引和四叉树索引两种索引机制来提高空间查询和空间分析的速度。用户需要根据空间数据的不同类型创建不同的索引,当空间数据类型比较复杂时,如果选择索引类型不当,将使Oracle Sp

15、atial创建索引的过程变得非常慢。,CREATE INDEX territory_idx ON territories(territory_geom)INDEXTYPE IS MDSYS.SPATIAL_INDEX;,创建R树索引,CREATE INDEX ROADS_FIXED ON ROADS(SHAPE)INDEXTYPE IS MDSYS.SPATIAL_INDEXPARAMETERS(SDO_LEVEL=8);,创建四叉树索引,空间数据的导入,Imp命令备份文件(dmp文件)imp bjpic/bjpic2003 file=proj_data.dmp full=ySqlldr控制文

16、件(ctl文件)sqlldr system/manager geod_country.ctl控制文件可由shp2sdo工具生成Sql命令insert语句,要对Oracle Spatial进行操作,首先需要建立与Oracle 数据库的连接,可以用以下语句完成对数据库的连接工作。OSession m_session;/定义oo4o会话句柄ODatabase m_database;/定义数据库对象m_session.Open();/打开一个会话m_database.Open(m_session,dbaseName,userName,password);/建立数据库连接,dbaseName是数据库名称

17、,基于OO4O的Oracle Spatial接口程序实现,数据库的连接,ORACLM32.lib,ORACLM32.DLL,ORACL.H,从Oracle Spatial中获取空间数据,与空间数据表相关的信息都存储在元数据表MDSYS.SDO_GEOM_METADATA_TABLE中,获取元数据表信息的语句为:ODynaset dyn;/定义结果集对象dyn.Open(m_database,select SDO_OWNER,SDO_TABLE_NAME,SDO_COLUMN_NAME,SDO_DIMINFO from MDSYS.SDO_GEOM_METADATA_TABLE);,其中SDO_

18、OWNER为空间数据表所属的用户名称,SDO_TABLE_NAME为空间数据表名称,SDO_COLUMN_NAME为空间字段名称,SDO_DIMINFO为维数信息。对于每一条记录,可以采用如下语句获取相关的数据:OValue tName;/表名OValue cName;/列名OValue oName;/用户名称OCollection dInfo;/维数信息OObject diminfo;/用于解析维数信息的变量dyn.GetFieldValue(0,/获取维数信息和边界,由于dInfo是一个对象集合,因此需要通过进一步解析才能得到各个维数的信息,以获取第一维信息为例(第二、第三维信息可以类推)

19、,则获取该维信息的语句为:dInfo.GetValue(1,/获取几何精度值,当字段的类型为SDO_GEOMETRY时表示这个字段存储了空间信息,我们可以通过对该字段的解析,获取Oracle Spatial存储的空间数据。OObject sdoGeo;/几何信息OValue m_nGeomType;/几何类型OValue m_nSRID;/坐标系信息OObject gPointType;/点类型OCollection gElem;/空间坐标信息OCollection gCood;/坐标值,dyn.GetFieldValue(fieldName,/获取坐标值对于gElem和gCood,我们同样需

20、要使用GetAttrValue函数进一步解析出具体的数据,通过gElem的三元组数据我们可以得到各个几何实体的坐标值。,将空间信息导入Oracle Spatial,将空间信息导入Oracle Spatial是上述过程的逆过程,但是需要在建立空间数据表时首先判断是否有同名的表,在将空间数据导入到Oracle Spatial后,需要更新元数据表的信息,并且需要根据不同的空间数据类型建立不同的空间索引。值得注意的是,Oracle Spatial的空间字段的坐标数组只能接受999个坐标,简单的insert语句不能插入坐标超过999个的数据,必须采用变量绑定的方法才能把大数据量的坐标准确插入到Oracl

21、e Spatial中。,sdoGeo.Open(m_database,MDSYS.SDO_GEOMETRY);gElem.Open(m_database,MDSYS.SDO_ELEM_INFO_ARRAY);gCood.Open(m_database,MDSYS.SDO_ORDINATE_ARRAY);sdoGeo.SetAttrValue(SDO_GTYPE,2002);/默认为简单线段sdoGeo.SetAttrValue(SDO_SRID,8307);/坐标系WGS-84gElem.SetValue(1,1);/设置简单线段的三元组gElem.SetValue(2,2);gElem.Se

22、tValue(3,1);for(int j=0;jnum;j+)/设置坐标值gCood.SetValue(j*2+1,xj);gCood.SetValue(j*2+2,yj);sdoGeo.SetAttrValue(SDO_ELEM_INFO,gElem);sdoGeo.SetAttrValue(SDO_ORDINATES,gCood);,OParameterCollection params=m_database.GetParameters();/准备绑定变量params.Add(MGEOM,sdoGeo,OPARAMETER_INVAR,OTYPE_OBJECT,MDSYS.SDO_GEO

23、METRY);spaDataStr=INSERT INTO+userName+.+(CString)tableName+VALUES(+attSql+:MGEOM);m_database.ExecuteSQL(spaDataStr);其中,MGEOM绑定了sdoGeo变量,attSql为其它类型字段的数据。这里没有设置gPointType的值,表示SDO_POINT为空。对于更新元数据表信息,只需用INSERT语句就可以实现了。,indexStr=CREATE INDEX+userName+.+indexName+ON+userName+.+tableName+(GEOM)+INDEXTYPE IS MDSYS.SPATIAL_INDEX;/建立R树索引m_database.ExecuteSQL(indexStr);/新建索引,完成了空间数据的导入之后,我们可以为空间数据字段建立空间索引,空间索引的建立是Oracle Spatial中最复杂的工作,这里仅给出为空间字段建立R树索引的方法,其它的索引操作,用户可以参考Oracle Spatial的用户指南。,Figure 1:Apply offsets,Figure 2:Apply scaling,Gridsize=3*AVG,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号