版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
OracleSpatial是Oracle公司推出的空间数据库组件,通过Oracle数据库系统存储和管理空间数据。Oracle从9i开始对空间数据提供了较为完备的支持。由于OracleSpatial本身是ORACLE数据库的一个特殊的部分,因此可以用ORACLE提供的程序接口来对OracleSpatial管理的空间数据进行操作。目前,ORACLE数据库主要提供两种接口方式对其数据进行存取:OracleSpatial简介ORACLE提供的面向C语言程序员的编程接口(OracleCallInterface,简称OCI)最新Oracle10gInstantClient,可以免费下载
ORACLE本身所提供的OLE对象(OracleObjectsforOLE,简称OO4O)来快速访问有关数据库。安装Oracle客户端即可使用两种方式连接数据库的基本参数OracleNetServiceName/SIDTCP/IPHostName(IP)andPortUserandPasswordOracle9i\network\admin\tnsnames.oraPOLARDB=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=36)(PORT=1521)))(CONNECT_DATA=(SID=polardb)(SERVER=DEDICATED)))OracleSpatial主要通过空间数据字段(即SDO_GEOMETRY字段)、元数据表和空间索引来管理空间数据,并在此基础上提供一系列空间查询和空间分析的函数,让用户进行更深层次的GIS应用开发。OracleSpatialInfrastructureSDO_GEOMETRYSDO_GEOMETRYUSER_SDO_GEOM_METADATAspatial_index创建一个含有空间数据字段的表:道路表roadscreatetableroads(
rnamevarchar2(64),
geometrymdsys.sdo_geometry
);
例子insertintouser_sdo_geom_metadatavalues(
'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);元数据注册insertintoroads(rname,geometry)values
('luoyuroad',mdsys.sdo_geometry(
2002,
8307,
null,
mdsys.sdo_elem_info_array(1,2,1),
mdsys.sdo_ordinate_array(10,10,10,15,15,15))
);
增加数据记录TableRoads河流表Rivercreate
tablerivers(
rnamevarchar2(64),
geometrymdsys.sdo_geometry);insert
intouser_sdo_geom_metadatavalues(
'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
indexrivers_spatial_idxonrivers(geometry)indextype
ismdsys.spatial_index;insert
intorivers(rname,geometry)values
('YangtzeRiver',mdsys.sdo_geometry(2002,8307,null,
mdsys.sdo_elem_info_array(1,2,1),
mdsys.sdo_ordinate_array(8,8,9,10,15,15)));TableRiver空间示意图(0,0)xyYangtzeRiver(5,15)YellowRiver(10,10)(15,15)LuoyuroadJianghanroadJiefangroadYangtzeRiverYellowRiverLuoyuRoadJianghanRoadJiefangRoad41215OracleSpatial提供了R树索引和四叉树索引两种索引机制来提高空间查询和空间分析的速度。用户需要根据空间数据的不同类型创建不同的索引,当空间数据类型比较复杂时,如果选择索引类型不当,将使OracleSpatial创建索引的过程变得非常慢。
OracleSpatial空间索引技术createindexroads_spatial_idxonroads(geometry)indextypeismdsys.spatial_index;创建空间索引selectt1.rname
road,t2.rname
riverfromgis.roadst1,gis.riverst2where
mdsys.sdo_relate(t1.geometry,t2.geometry,'mask=anyinteractquerytype=window')='TRUE';空间分析检索空间位置的拓扑关系TOUCH,OVERLAPBDYDISJOINT,OVERLAPBDYINTERSECT,EQUAL,INSIDE,COVEREDBY,CONTAINS,COVERS,ANYINTERACT,ON.VC读写Oracle数据库OO4O介绍准备:首先要安装Oralce数据库客户端,并安装了本地Oracle数据库或者有远程数据库服务已知用户名称和用户密码7/polardbgis/gis2006要对OracleSpatial进行操作,首先需要建立与Oracle数据库的连接,可以用以下语句完成对数据库的连接工作。
ODatabasem_database;//定义数据库对象
OSessionm_session;//定义oo4o会话句柄m_session.Open();//打开一个会话m_database.Open(m_session,dbaseName,userName,password);//建立数据库连接,dbaseName是数据库名称数据库的连接ORACLM32.lib,ORACLM32.DLL,ORACL.H基于OO4O的OracleSpatial接口程序实现从OracleSpatial中获取空间数据
与空间数据表相关的信息都存储在元数据表MDSYS.SDO_GEOM_METADATA_TABLE中,获取元数据表信息的语句为:ODynasetdyn;//定义结果集对象dyn.Open(m_database,"selectSDO_OWNER,SDO_TABLE_NAME,SDO_COLUMN_NAME,SDO_DIMINFOfromMDSYS.SDO_GEOM_METADATA_TABLE");其中SDO_OWNER为空间数据表所属的用户名称,SDO_TABLE_NAME为空间数据表名称,SDO_COLUMN_NAME为空间字段名称,SDO_DIMINFO为维数信息。对于每一条记录,可以采用如下语句获取相关的数据:
OValuetName;//表名
OValuecName;//列名
OValueoName;//用户名称
OCollectiondInfo;//维数信息
OObjectdiminfo;//用于解析维数信息的变量
dyn.GetFieldValue(0,&oName);//获取用户名
dyn.GetFieldValue(1,&tName);//获取元数据中的表名
dyn.GetFieldValue(2,&cName);//获取元数据中的列名
dyn.GetFieldValue(3,&dInfo);//获取维数信息和边界由于dInfo是一个对象集合,因此需要通过进一步解析才能得到各个维数的信息,以获取第一维信息为例(第二、第三维信息可以类推),则获取该维信息的语句为:dInfo.GetValue(1,&diminfo); //获取第一维信息OValueelem;diminfo.GetAttrValue(1,&elem);//获取维数名称diminfo.GetAttrValue(2,&elem);//获取该维的左下角数据diminfo.GetAttrValue(3,&elem);//获取该维的右上角数据diminfo.GetAttrValue(4,&elem);//获取几何精度值当字段的类型为SDO_GEOMETRY时表示这个字段存储了空间信息,我们可以通过对该字段的解析,获取OracleSpatial存储的空间数据。
OObjectsdoGeo;//几何信息OValuem_nGeomType;//几何类型OValuem_nSRID;//坐标系信息OObjectgPointType;//点类型OCollectiongElem;//空间坐标信息OCollectiongCood;//坐标值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的三元组数据我们可以得到各个几何实体的坐标值。将空间信息导入OracleSpatial将空间信息导入OracleSpatial是上述过程的逆过程,但是需要在建立空间数据表时首先判断是否有同名的表,在将空间数据导入到OracleSpatial后,需要更新元数据表的信息,并且需要根据不同的空间数据类型建立不同的空间索引。值得注意的是,OracleSpatial的空间字段的坐标数组只能接受999个坐标,简单的insert语句不能插入坐标超过999个的数据,必须采用变量绑定的方法才能把大数据量的坐标准确插入到OracleSpatial中。
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(intj=0;j<num;j++){//设置坐标值
gCood.SetValue(j*2+1,x[j]);
gCood.SetValue(j*2+2,y[j]);}sdoGeo.SetAttrValue("SDO_ELEM_INFO",gElem);sdoGeo.SetAttrValue("SDO_ORDINATES",gCood);OParameterCollectionparams=m_database.GetParameters();//准备绑定变量params.Add("MGEOM",sdoGeo,OPARAMETER_INVAR,OTYPE_OBJECT,"MDSYS.SDO_GEOMETRY");spaDataStr="INSERTINTO"+userName+"."+(CString)tableName+"VALUES("+attSql+":MGEOM)";m_database.ExecuteSQL(spaDataStr);其中,MGEOM绑定了sdoGeo变量,attSql为其它类型字段的数据。这里没有设置gPointType的值,表示SDO_POINT为空。对于更新元数据表信息,只需用INSERT语句就可以实现了。indexStr="CREATEINDEX"+userName+"."+indexName+"ON"+userName+"."+tableName+"(GEOM)"+"INDEXTYPEISMDSYS.SPATIAL_INDEX";//建立R树索引m_database.ExecuteSQL(indexStr);//新建索引完成了空间数据的导入之后,我们可以为空间数据字段建立空间索引,空间索引的建立是OracleSpatial中最复杂的工作,这里仅给出为空间字段建立R树索引的方法,其它的索引操作,用户可以参考OracleSpatial的用户指南。利用VC向导创建OO4O实战VC代码实例PHP操作Oracle数据库前提:安装PHP以及Oracle连接模块oci_connect()Oci_parse()Oci_excute()Oci_fetch()Oci_close()实习(任选一题):OO4O编写一段代码,实现空间数据字段的创建、录入、更新、查询功能PHP编写一段代码,实现空间数据字段的创建、录入、更新、查询功能TheEnd谢谢
OracleSpatial的元数据表存储了有空间数据的数据表名称、空间字段名称、空间数据的坐标范围、坐标参考信息以及坐标维数说明等信息。用户必须通过元数据表才能知道ORACLE数据库中是否有OracleSpatial的空间数据信息。一般可以通过元数据视图(USER_SDO_GEOM_METADATA)访问元数据表。元数据视图的基本定义为:(TABLE_NAMEVARCHAR2(32),COLUMN_NAMEVARCHAR2(32),DIMINFOMDSYS.SDO_DIM_ARRAY,SRIDNUMBER);空间数据元数据表其中,TABLE_NAME为含有空间数据字段的表名,COLUMN_NAME为空间数据表中的空间字段名称,DIMINFO是一个按照空间维顺序排列的SDO_DIM_ELEMENT对象的动态数组,SRID则用于标识与几何对象相关的空间坐标参考系。SDO_DIM_ELEMENT对象的定义如下所示:CreateTypeSDO_DIM_ELEMENTasOBJECT(SDO_DIMNAMEVARCHAR2(64),SDO_LBNUMBER,SDO_UBNUMBER,SDO_TOLERANCENUMBER);其中,SDO_DIMNAME是空间维名称,SDO_LB为该空间维的左下角坐标,SDO_UB为该空间维的右上角坐标,SDO_TOLERANCE为几何对象的表示精度。
USER_SDO_GEOM_METADATAOracleSpatial的空间数据都存储在空间字段SDO_GEOMETRY中,理解SDO_GEOMETRY是编写OracleSpatial接口程序的关键。SDO_GEOMETRY是按照OpenGIS规范定义的一个对象,其原始的创建方式如下所示。CREATETYPEsdo_geometryASOBJECT(SDO_GTYPENUMBER,SDO_SRIDNUMBER,SDO_POINTSDO_POINT_TYPE,SDO_ELEM_INFOMDSYS.SDO_ELEM_INFO_ARRAY,SDO_ORDINATESMDSYS.SDO_ORDINATE_ARRAY);
该对象由五个部分组成,下面分别介绍这五个部分的定义方法。
sdo_geometry空间字段解析
(1)SDO_GTYPESDO_GTYPE是一个NUMBER型的数值,用来定义存储对象的类型。SDO_GTYPE是一个4个数字的整数,其格式为dltt,其中d表示几何对象的维数;l表示三维线性参考系统中的线性参考值,当d为3维或者4维时需要设置该值,一般情况下为空;tt为几何对象的类型,OracleSpatial定义了7种类型的几何类型,目前,tt使用了00到07(包括一种用户自定义类型),另外,08到99是OracleSpatial保留的数字,以备将来几何对象扩展所用。
(2)SDO_SRIDSDO_SRID也是一个NUMBER型的数值,它用于标识与几何对象相关的空间坐标参考系。如果SDO_SRID为空(null),则表示没有坐标系与该几何对象相关;如果该值不为空,则该值必须为MDSYS.CS_SRS表中SRID字段的一个值,在创建含有几何对象的表时,这个值必须加入到描述空间数据表元数据的USER_SDO_GEOM_METADATA视图的SRID字段中。OracleSpatial规定,一个几何字段中的所有几何对象都必须为相同的SDO_SRID值。
(3)SDO_POINTSDO_POINT是一个包含X,Y,Z数值信息的对象,用于表示几何类型为点的几何对象。如果SDO_ELEM_INFO和SDO_ORDINATES数组都为空,则SDO_POINT中的X,Y,Z为点对象的坐标值,否则,SDO_POINT的值可以忽略(用NULL表示)。OracleSpatial强烈建议用SDO_POINT存储空间实体为点类型空间数据,这样可以极大的优化OracleSpatial的存储性能,提高查询效率。
(4)SDO_ELEM_INFOSDO_ELEM_INFO是一个可变长度的数组,每3个数作为一个元素单位,用于解释坐标是如何存储在SDO_ORDINATES数组中的。本文把组成一个元素的3个数称为3元组。一个3元组包含以下3部分的内容:
l
SDO_STARTING_OFFSETSDO_STARTING_OFFSET表明每个几何元素的第一个坐标在SDO_ORDINATES数组中的存储位置。它的值从1开始,逐渐增加。
l
SDO_ETYPESDO_ETYPE用于表示几何对象中每个组成元素的几何类型。当它的值为1,2,1003和2003时,表明这个几何元素为简单元素。如果SDO_ETYPE为1003,表明该多边形为外环(第一个数为1表示外环),坐标值以逆时针存储;如果SDO_ETYPE为2003,表明该多边形为内环(第一个数为2表示内
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 海报设计合同模板
- 家庭雇佣保姆合同样式参考
- 2024独家原创企业绩效合同签定仪式领导讲话稿
- 2024租赁办公室合同范本
- 个人教育助学贷款
- 购房借款协议2024年
- 篮球训练合作协议范本
- 房产代理合同租赁
- 个人消费借款合同范本
- 提升机租赁合同样本格式
- 临床医疗教学之127:冠心病合并心房颤动患者抗栓管理中国专家共识2020版课件
- 腰椎间盘突出区域定位及意义
- 天蓝色商务发展历程时间轴PPT模板课件
- 各潮位站基面关系
- 高处安全作业票填写模板(2022更新)
- 幼儿园绘本故事:《妈妈买绿豆》 PPT课件
- 急腹症(课堂PPT)
- 物流中心岗位设置及岗位职责
- 九年级人自然社会教案
- 某市康复医院建立的可行性报告
- 配位化学 第2章 配合物的结构和成键理论
评论
0/150
提交评论