好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

空间数据库操作课件.ppt

53页
  • 卖家[上传人]:cl****1
  • 文档编号:580270684
  • 上传时间:2024-08-28
  • 文档格式:PPT
  • 文档大小:2.23MB
  • / 53 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 测绘学院Oracle Spatial是Oracle公司推出的空间数据空间数据库组件库组件,通过Oracle数据库系统存储和管理空间数据 Oracle从9i开始对空间数据提供了较为完备的支持由于Oracle Spatial本身是ORACLE数据库的一个特殊的部分,因此可以用ORACLE提供的程序接口来对Oracle Spatial管理的空间数据进行操作目前,ORACLE数据库主要提供两种接口方式对其数据进行存取:Oracle Spatial简介 测绘学院1.ORACLE提供的面向C语言程序员的编程接口(Oracle Call Interface,简称OCI)l最新Oracle 10g Instant Client,l可以免费下载l 2.ORACLE本身所提供的OLE对象(Oracle Objects for OLE,简称OO4O)来快速访问有关数据库l安装Oracle客户端即可使用两种方式 测绘学院连接数据库的基本参数•Oracle Net Service Name/SID•TCP/IP •Host Name(IP) and Port •User and Password 测绘学院Oracle9i\network\admin\tnsnames.oraOracle9i\network\admin\tnsnames.oraPOLARDB = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCPTCP)(HOST = 192.168.158.236192.168.158.236)(PORT = 15211521)) ) (CONNECT_DATA = (SID = polardbpolardb) (SERVER = DEDICATED) ) ) 测绘学院Oracle Spatial主要通过空间数据字段空间数据字段(即SDO_GEOMETRY字段) 、元数据表元数据表和空空间索引间索引来管理空间数据,并在此基础上提供一系列空间查询和空间分析空间查询和空间分析的函数,让用户进行更深层次的GIS应用开发。

      Oracle Spatial InfrastructureSDO_GEOMETRYSDO_GEOMETRYUSER_SDO_GEOM_METADATAspatial_index 测绘学院创建一个含有空间数据字段的表:创建一个含有空间数据字段的表:道路表道路表 roadsroadscreate table roads(rname varchar2(64),geometry mdsys.sdo_geometry);•例子例子 测绘学院insert into user_sdo_geom_metadata values('roads','geometry',mdsys.sdo_dim_array(mdsys.sdo_dim_element('X',0,100,0.05),mdsys.sdo_dim_element('Y',0,100,0.05)),8307);元数据注册 测绘学院insert into roads(rname,geometry) values('luoyu road',mdsys.sdo_geometry(2002,8307,null,mdsys.sdo_elem_info_array(1,2,1),mdsys.sdo_ordinate_array(10,10,10,15,15,15)));增加数据记录 测绘学院Table Roads 测绘学院河流表 Rivercreate table rivers(rname varchar2(64),geometry mdsys.sdo_geometry);insert into user_sdo_geom_metadata values( 'rivers','geometry',mdsys.sdo_dim_array(mdsys.sdo_dim_element('X',0,100,0.05),mdsys.sdo_dim_element('Y',0,100,0.05)),8307);create index rivers_spatial_idx on rivers(geometry) indextype is mdsys.spatial_index;insert into rivers(rname,geometry) values('Yangtze River',mdsys.sdo_geometry(2002,8307,null,mdsys.sdo_elem_info_array(1,2,1),mdsys.sdo_ordinate_array(8,8,9,10,15,15))); 测绘学院Table River 测绘学院空间示意图(0,0)(0,0)x xy yYangtze RiverYangtze River(5,15)(5,15)Yellow RiverYellow River(10,10)(10,10)(15,15)(15,15)Luoyu Luoyu roadroadJianghan Jianghan roadroadJiefang Jiefang roadroadYangtze RiverYangtze RiverYellow RiverYellow RiverLuoyu Luoyu RoadRoadJianghanJianghan Road RoadJiefangJiefang Road Road4 412121515 测绘学院Oracle Spatial提供了R树索引和四叉树索引两种索引机制来提提高高空空间间查查询询和和空空间间分分析析的的速速度度。

      用户需要根据空间数据的不同类型创建不同的索引,当空间数据类型比较复杂时,如果选择索引类型不当,将使Oracle Spatial创建索引的过程变得非常慢 Oracle Spatial空间索引技术 测绘学院create index roads_spatial_idx on roads(geometry) indextype is mdsys.spatial_index;创建空间索引创建空间索引select t1.rname road,t2.rname river from gis.roads t1,gis.rivers t2 where mdsys.sdo_relate(t1.geometry,t2.geometry,'mask=anyinteract querytype=window')='TRUE';空间分析检索空间分析检索 测绘学院•空间位置的拓扑关系lTOUCH, lOVERLAPBDYDISJOINT, lOVERLAPBDYINTERSECT, lEQUAL,lINSIDE, lCOVEREDBY, lCONTAINS,l COVERS, lANYINTERACT, lON. 测绘学院VC读写Oracle数据库•OO4O介绍准备:1.首先要安装Oralce数据库客户端,2.并安装了本地Oracle数据库 或者有远程数据库服务3.已知用户名称和用户密码•219.140.160.67/polardb•gis/gis2006 测绘学院要对Oracle Spatial进行操作,首先需要建立与Oracle 数据库的连接,可以用以下语句完成对数据库的连接工作。

       ODatabase m_database; // 定义数据库对象定义数据库对象 OSession m_session; // 定义定义oo4o会话句柄会话句柄m_session.Open(); // 打开一个会话打开一个会话m_database.Open(m_session, dbaseName, userName, password) ; // 建立数据库连接建立数据库连接, dbaseName是数据库名称是数据库名称数据库的连接数据库的连接ORACLM32.lib, ORACLM32.DLL, ORACL.H基于基于OO4OOO4O的的Oracle SpatialOracle Spatial接口程序实现接口程序实现 测绘学院从从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_OWNER为空间数据表所属的用户名称,SDO_TABLE_NAME为空间数据表名称,SDO_COLUMN_NAME为空间字段名称,SDO_DIMINFO为维数信息。

      对于每一条记录,可以采用如下语句获取相关的数据:OValue tName; //表名表名OValue cName; //列名列名OValue oName; //用户名称用户名称OCollection dInfo; //维数信息维数信息OObject diminfo; //用于解析维数信息的变量用于解析维数信息的变量dyn.GetFieldValue(0, &oName); // 获取用户名获取用户名dyn.GetFieldValue(1, &tName); // 获取元数据中的表名获取元数据中的表名 dyn.GetFieldValue(2, &cName); // 获取元数据中的列名获取元数据中的列名dyn.GetFieldValue(3, &dInfo); // 获取维数信息和边界获取维数信息和边界 测绘学院由于dInfo是一个对象集合,因此需要通过进一步解析才能得到各个维数的信息,以获取第一维信息为例(第二、第三维信息可以类推),则获取该维信息的语句为:dInfo.GetValue(1,&diminfo);// 获取第一维信息获取第一维信息OValue elem;diminfo.GetAttrValue(1,&elem); //获取维数名称获取维数名称diminfo.GetAttrValue(2,&elem); //获取该维的左下角数据获取该维的左下角数据diminfo.GetAttrValue(3,&elem); //获取该维的右上角数据获取该维的右上角数据diminfo.GetAttrValue(4,&elem); //获取几何精度值获取几何精度值 测绘学院当字段的类型为SDO_GEOMETRY时表示这个字段存储了空间信息,我们可以通过对该字段的解析,获取Oracle Spatial存储的空间数据。

      OObject sdoGeo; // 几何信息OValue m_nGeomType; // 几何类型OValue m_nSRID; // 坐标系信息OObject gPointType; // 点类型OCollection gElem; // 空间坐标信息OCollection gCood; // 坐标值 测绘学院dyn.GetFieldValue(fieldName,&sdoGeo);// 获取几何信息, fieldName为SDO_GEOMETRY类型sdoGeo.GetAttrValue(1,&m_nGeomType); // 获取几何类型sdoGeo.GetAttrValue(2,&m_nSRID); // 获取坐标系信息sdoGeo.GetAttrValue(3,&gPointType); // 获取点信息sdoGeo.GetAttrValue(4,&gElem); // 获取空间坐标的存储信息sdoGeo.GetAttrValue(5,&gCood); // 获取坐标值对于gElem和gCood,我们同样需要使用GetAttrValue函数进一步解析出具体的数据,通过gElem的三元组数据我们可以得到各个几何实体的坐标值。

      测绘学院将空间信息导入将空间信息导入Oracle Spatial 将空间信息导入Oracle Spatial是上述过程的逆过程,但是需要在建立空间数据表时首先判断是否有同名的表,在将空间数据导入到Oracle Spatial后,需要更新元数据表的信息,并且需要根据不同的空间数据类型建立不同的空间索引值得注意的是,Oracle Spatial的空间字段的坐标数组只能接受999个坐标,简单的insert语句不能插入坐标超过999个的数据,必须采用变量绑定的方法才能把大数据量的坐标准确插入到Oracle 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.SetValue(3,1);for(int j=0;j

      这里没有设置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的用户指南 测绘学院 测绘学院利用VC向导创建 测绘学院 测绘学院 测绘学院OO4O实战•VC代码实例 测绘学院PHP操作Oracle数据库•前提:安装PHP以及Oracle连接模块loci_connect()lOci_parse()lOci_excute()lOci_fetch()lOci_close() 测绘学院•实习(任选一题):lOO4O编写一段代码,实现空间数据字段的创建、录入、更新、查询功能lPHP编写一段代码,实现空间数据字段的创建、录入、更新、查询功能 测绘学院The End 测绘学院谢 谢 测绘学院    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_UB NUMBER,SDO_TOLERANCE NUMBER);其中,SDO_DIMNAME是空间维名称,SDO_LB为该空间维的左下角坐标,SDO_UB为该空间维的右上角坐标,SDO_TOLERANCE为几何对象的表示精度。

       USER_SDO_GEOM_METADATA 测绘学院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_ARRAY);该对象由五个部分组成,下面分别介绍这五个部分的定义方法 sdosdo_geometry _geometry 空间字段解析空间字段解析 测绘学院((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也是一个NUMBER型的数值,它用于标识与几何对象相关的空间坐标参考系如果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_ORDINATES数组都为空,则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 表明每个几何元素的第一个坐标在SDO_ORDINATES数组中的存储位置它的值从1开始,逐渐增加 测绘学院   l  SDO_ETYPE SDO_ETYPE 用于表示几何对象中每个组成元素的几何类型当它的值为1, 2, 1003和2003时,表明这个几何元素为简单元素如果SDO_ETYPE为1003,表明该多边形为外环(第一个数为1表示外环),坐标值以逆时针存储;如果SDO_ETYPE为2003,表明该多边形为内环(第一个数为2表示内环),坐标值以顺时针存储当SDO_ETYPE为4, 1005和2005时,表明这个几何元素为复杂元素它至少包含一个3元组用以说明该复杂元素具有多少个几何简单元素同样,1005表示多边形为外环,坐标值以逆时针存储;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中是如何排列的需要注意的是,对于复杂元素来说,组成它的子元素是连续的,一个子元素的最后一个点是下一个子元素的第一点最后一个子元素的最后一个坐标要么与下一个元素的SDO_STARTING_OFFSET值减1所对应的坐标相同,要么是整个SDO_ORDINATES数组的最后一个坐标 测绘学院 测绘学院((5))SDO_ORDINATESSDO_ORDINATES是一个可变长度的数组,用于存储几何对象的真实坐标,该数组的类型为NUMBER型,它的最大长度为1048576SDO_ORDINATES必须与SDO_ELEM_INFO数组配合使用,才具有实际意义SDO_ORDINATES的坐标存储方式由几何对象的维数决定,如果几何对象为三维,则SDO_ORDINATES的坐标以{X1,Y1,Z1,X2,Y2,Z2,…..}的顺序排列,如果几何对象为二维,则SDO_ORDINATES的坐标以{X1,Y1,X2,Y2,…..}顺序排列。

        测绘学院Oracle数据库支持 测绘学院空间拓扑关系 测绘学院DISJOINT•DISJOINT  没有任何关系 测绘学院TOUCH•TOUCH 边界相交但区域无关 测绘学院OVERLAPBDYDISJOINT•OVERLAPBDYDISJOINT 区域相交但边界不相关,比如: 测绘学院OVERLAPBDYINTERSECT•OVERLAPBDYINTERSECT 边界和区域都相交 测绘学院ANYINTERACT•ANYINTERACT 任意相关 。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.