基于OCI的空间数据访问
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图 1 为对象关系数据库存储空间数据的存储模型 , [2] [4] Oracle Spatial [3] 中就是采用这种存储模式。
图 1 对象关系数据库存储空间数据的存储模型 图 1 中,特征表 (Feature Table) 对应着一个特征类,特 征是具有几何属性的几何对象。特征表中包含许多特征,每 个特征在特征表中用一行表示,它包含一些数目的几何属性,
主要是根据空间对象在oracle数据库中的存储结构对相应的部分进行查询分析和处理在oraclespatial的对象关系模型中空间数据是被作为几何对象来处理的因此在我们的程序中也引入面向对象的思想把对空间数据的操作转化成对对象属性的操作
电脑编程技巧与维护
基于 OCI 的空间数据访问
邵晓芳 1,刘纯贵 2,杨泽刚 3
(dvoid*) &dtype, (ub4 *) 0, (ub4) OCI_AT- TR_DATA_TYPE,errhp )) ; IOraConnection::checkerr ( errhp,OCIAttrGet ( ( dvoid*) parmdp, OCI_DTYPE_PARAM, ( dvoid** ) &col_name, ( ub4 *) &col_name_len, (ub4) OCI_ATTR_NAME,errhp )) ;
{ bool IsEquals; char query [300] ; sword status;
ub2 dtype; OCIDefine *defnp=NULL; OCIParam *parmdp; … sprintf (query, " select A.%s FROM %s A,%s B where A.%s= '%s' and B.%s='%s' \and SDO_RELATE ( A.% s,B.% s,'mask =EQUAL \querytype = WINDOW') ='TRUE'" ,row_name,table1,table2,row_name,ge- om1,row_name, geom2,geom_column,geom_column) ; //建立查询语句 IOraConnection::checkerr (errhp, OCIStmtPrepare (stmthp, errhp, (text *) query, (ub4) strlen (query) , (ub4) OCI_NTV_SYN- TAX, (ub4) OCI_DEFAULT)) ; // 解析查询语句 IOraConnection::checkerr (errhp,OCIStmtExecute (svchp, stmthp, errhp, (ub4) 1, (ub4) 0, (OCISnapshot *) NULL, (O- CISnapshot *) NULL, OCI_DESCRIBE_ONLY)) ; //取得选项列表 (用户需要查询的信息列表) 的信息 IOraConnection::checker (errhp,OCIParamGet ((dvoid*) stmthp, OCI_HTYPE_STMT,errhp,&parmdp, 1)) ; IOraConnection::checkerr ( errhp,OCIAttrGet ( ( dvoid*) parmdp, OCI_DTYPE_PARAM,
(dvoid*) global_rowid, (sb4) sizeof (OCINumber) , SQLT_VNU,
(dvoid *) 0, (ub2 *) 0, (ub2 *) 0, (ub4) OCI_DE- FAULT)) ;
break; case 1://VARCHAR2 IOraConnection::checkerr (errhp, OCIDefineByPos (stmthp, &defnp, errhp, (ub4) 1, ( dvoid *) &result, ( sb4) ( col_name_len +1) , SQLT_STR, (dvoid *) 0, (ub2 *) 0, (ub2 *) 0, (ub4) OCI_DE- FAULT)) ; break; …/ /省略了其他类型 } status =OCIStmtExecute ( svchp, stmthp, errhp, ( ub4) 1, (ub4) 0, ( OCISnapshot *) NULL, ( OCISnapshot *) NULL, (ub4) OCI_DEFAULT) ;//执行 if (status == OCI_SUCCESS_WITH_INFO || status == O- CI_NO_DATA) IsEquals=FALSE; //如果查询成功执行而没有返回数据,说明两空间对象不相等
本文收稿日期:2009-11-18
用列表示。几何属性与一个包含几何对象的几何表 (Geometry Table) 相关联,这种关联是通过一个存储在特征表中的被叫 做外来关键字 (Foreign Key) 的几何标识 (Geometry ID) 相 联系的。
Oracle Spatial 将空间对象类型 SDO_GEOMETRY 定义为 [3]: CREATE TYPE sdo_geometry AS OBJECT (
3 OCI 编程
3.1 数据结构 Handles 和 descriptors 是在 OCI 应用中定义的透明数据结
构并被直接分配,Handle 是指向 OCI 分配的一块存储区的透 明指针,大多数 OCI 应用都需要访存储在 handles 中的信息, OCIAttrGet () 和 OCIAttrSet () 访问这些信息。OCI descriptors 和 locators 是保存特定数据信息的透明数据结构。
OCI 调用中使用 3 类参数:地址、二进制整数和短二进制 整数。
- 64 -
DATABASE AND INFORMATION MANAGEMENT
数据库与信息管理
3.2 编程步骤 OCI 程序主要是通过分配调用相应功能的句柄,控制 SQL
语句的执行来实现的。程序流程图如图 2、图 3 所示。
图 2 OCI 程序流程
(1. 海军航空工程学院青岛分院,青岛 266041;2. 海军装备研究院航空所,上海 200436;3. 海军潜艇学院,青岛 266040)
摘 要: Oracle Spatial 是现今应用广泛的空间数据库,而 OCI 是 Oracle 数据库的一个应用程序接口,基于 OCI 进 行复杂的空间数据访问,可以提高数据访问的效率和灵活性。文中用实例介绍了基于 OCI 进行空间数据访问的方 法。 关键词: OCI; 空间数据; Oracle; OpenGIS; Oracle Spatial
switch (dtype) //根据不同数据类型分别处理 { case 2://number case 3://interger case 4://float case 8://long
IOraConnection::checkerr ( errhp, OCIDefineByPos ( stmthp, &defnp, errhp, (ub4) 1,
The Spatial Data Access Based on OCI
SHAO Xiaofang1 , LIU Chungui2 ,YANG Zegang3
(1. Qingdao Branch of Naval Aeronautical Engineering Institute , Qingdao 266041; 2. Aeronautical Institue of the Naval Equipment Academa , Shanghai 200436; 3. Naval Submarine Institute , Qingdao 266040)
图 3 SQL 语句的具体处理过程
4 程序设计
实例程序的类模块结构主要有以下几个部分: (1) IOraConnection 类:主要功能为负责与数据库建立连 接,成员变量有环境句柄和错误处理句柄等,成员函数有建 立连接函数 connect ()、断开连接函数 disconnect ()、异常处理 函数 checkerr () 和取得 TDO (Type Descriptor Object) 指针的 get_tdo () 函数。 (2) IGeometry 类:主要是根据空间对象在 Oracle 数据库 中的存储结构对相应的部分进行查询、分析和处理,在 Oracle Spatial 的对象-关系模型中,空间数据是被作为几何对象来处 理的,因此在我们的程序中也引入面向对象的思想,把对空 间数据的操作转化成对对象属性的操作。根据 Oracle Spatial 中空间对象的存储模式,在程序中建立起相应的数据结构。 这样既简化了编程也简化了对空间数据的处理。 (3) IspatialRelation 类:主要实现对两个几何对象空间关 系的判断,其成员函数是参照 OpenGIS 规范 [1] 定制的。 (4) IspatialOperator 类:主要实现对几何对象的空间操 作,其成员函数也是参照 OpenGIS 规范 [1] 定制的,主要有 Boundary ()、 Distance ()、 Buffer ()、 Intersection ()、 Union ()、Difference ()、 ConvexHull (),由于篇幅有限不加赘述。 上述各个类模块的成员函数主要是通过结合 Oracle Spatial 中的 Spatial Usage Operators 以及 Geometry Functions 的 SQL 查 询语句的执行并对结果加以分析来实现的,示例程序代码如 下: BOOL ISpatialRelation::Equals ( ) //判断两空间对象是否相等
SDO_GTYPE NUMBER, SDO_SRID NUMBER, SDO_POINT SDO_POINT_TYPE,
SDO_ELEM_INFO MDSYS.SDO_ELEM_INFO_AR- RAY,
SDO_ORDINATES MDSYS.SDO_ORDINATE_AR- RAY) ; 其中,SDO_GTYPE 表示空间对象的类型;SDO_SRID 表 示空间对象的空间参考系统,目前为保留字段;SDO_POINT 表示点对象,为空时表示为其他类型;SDO_ELEM_INFO 为变 长 数 组 , 用 于 解 析 SDO_ORDINATES 的 含 义 ; SDO_ORDI- NATES 也是变长数组,为空间对象的坐标集。
Abstract:Oracle Spatial is a spatial database which is popularly used these days and OCI is an application programming interface for Oracle. It is efficient and convenient to access complex spatial data through OCI. This paper introduces how to use this method in practice. Key words:OCI ; Spatial Data ; Oracle ; OpenGIS ; Oracle Spatial
1 引言
近年来,对空间数据的处理已经成为信息处理越来越重 要的内容 [1]。Oracle Spatial 是现今应用广泛的空间数据库, 访问 Oracle 数据库有 3 种方法:通过 ODBC 数据源、基于 O- racle API 或 OCI。这些方法中,ODBC 虽然通用但效率和灵活 性较差,关于 Oracle API 编程的资料很少,而基于 OCI 进行 复杂的空间数据访问,可以提高数据访问的效率和灵活性。
Oracle 调用接口简称 OCI, 是一个应用程序接口 (AP)I , 提供了一组接口子函数,支持所有的 SQL 数据定义、数据操 纵、查询和事务控制等。使用 OC主 要介绍基于 OCI 对空间数据的访问。
2 Oracle Spatial 中空间存储模型及数据结构
图 1 对象关系数据库存储空间数据的存储模型 图 1 中,特征表 (Feature Table) 对应着一个特征类,特 征是具有几何属性的几何对象。特征表中包含许多特征,每 个特征在特征表中用一行表示,它包含一些数目的几何属性,
主要是根据空间对象在oracle数据库中的存储结构对相应的部分进行查询分析和处理在oraclespatial的对象关系模型中空间数据是被作为几何对象来处理的因此在我们的程序中也引入面向对象的思想把对空间数据的操作转化成对对象属性的操作
电脑编程技巧与维护
基于 OCI 的空间数据访问
邵晓芳 1,刘纯贵 2,杨泽刚 3
(dvoid*) &dtype, (ub4 *) 0, (ub4) OCI_AT- TR_DATA_TYPE,errhp )) ; IOraConnection::checkerr ( errhp,OCIAttrGet ( ( dvoid*) parmdp, OCI_DTYPE_PARAM, ( dvoid** ) &col_name, ( ub4 *) &col_name_len, (ub4) OCI_ATTR_NAME,errhp )) ;
{ bool IsEquals; char query [300] ; sword status;
ub2 dtype; OCIDefine *defnp=NULL; OCIParam *parmdp; … sprintf (query, " select A.%s FROM %s A,%s B where A.%s= '%s' and B.%s='%s' \and SDO_RELATE ( A.% s,B.% s,'mask =EQUAL \querytype = WINDOW') ='TRUE'" ,row_name,table1,table2,row_name,ge- om1,row_name, geom2,geom_column,geom_column) ; //建立查询语句 IOraConnection::checkerr (errhp, OCIStmtPrepare (stmthp, errhp, (text *) query, (ub4) strlen (query) , (ub4) OCI_NTV_SYN- TAX, (ub4) OCI_DEFAULT)) ; // 解析查询语句 IOraConnection::checkerr (errhp,OCIStmtExecute (svchp, stmthp, errhp, (ub4) 1, (ub4) 0, (OCISnapshot *) NULL, (O- CISnapshot *) NULL, OCI_DESCRIBE_ONLY)) ; //取得选项列表 (用户需要查询的信息列表) 的信息 IOraConnection::checker (errhp,OCIParamGet ((dvoid*) stmthp, OCI_HTYPE_STMT,errhp,&parmdp, 1)) ; IOraConnection::checkerr ( errhp,OCIAttrGet ( ( dvoid*) parmdp, OCI_DTYPE_PARAM,
(dvoid*) global_rowid, (sb4) sizeof (OCINumber) , SQLT_VNU,
(dvoid *) 0, (ub2 *) 0, (ub2 *) 0, (ub4) OCI_DE- FAULT)) ;
break; case 1://VARCHAR2 IOraConnection::checkerr (errhp, OCIDefineByPos (stmthp, &defnp, errhp, (ub4) 1, ( dvoid *) &result, ( sb4) ( col_name_len +1) , SQLT_STR, (dvoid *) 0, (ub2 *) 0, (ub2 *) 0, (ub4) OCI_DE- FAULT)) ; break; …/ /省略了其他类型 } status =OCIStmtExecute ( svchp, stmthp, errhp, ( ub4) 1, (ub4) 0, ( OCISnapshot *) NULL, ( OCISnapshot *) NULL, (ub4) OCI_DEFAULT) ;//执行 if (status == OCI_SUCCESS_WITH_INFO || status == O- CI_NO_DATA) IsEquals=FALSE; //如果查询成功执行而没有返回数据,说明两空间对象不相等
本文收稿日期:2009-11-18
用列表示。几何属性与一个包含几何对象的几何表 (Geometry Table) 相关联,这种关联是通过一个存储在特征表中的被叫 做外来关键字 (Foreign Key) 的几何标识 (Geometry ID) 相 联系的。
Oracle Spatial 将空间对象类型 SDO_GEOMETRY 定义为 [3]: CREATE TYPE sdo_geometry AS OBJECT (
3 OCI 编程
3.1 数据结构 Handles 和 descriptors 是在 OCI 应用中定义的透明数据结
构并被直接分配,Handle 是指向 OCI 分配的一块存储区的透 明指针,大多数 OCI 应用都需要访存储在 handles 中的信息, OCIAttrGet () 和 OCIAttrSet () 访问这些信息。OCI descriptors 和 locators 是保存特定数据信息的透明数据结构。
OCI 调用中使用 3 类参数:地址、二进制整数和短二进制 整数。
- 64 -
DATABASE AND INFORMATION MANAGEMENT
数据库与信息管理
3.2 编程步骤 OCI 程序主要是通过分配调用相应功能的句柄,控制 SQL
语句的执行来实现的。程序流程图如图 2、图 3 所示。
图 2 OCI 程序流程
(1. 海军航空工程学院青岛分院,青岛 266041;2. 海军装备研究院航空所,上海 200436;3. 海军潜艇学院,青岛 266040)
摘 要: Oracle Spatial 是现今应用广泛的空间数据库,而 OCI 是 Oracle 数据库的一个应用程序接口,基于 OCI 进 行复杂的空间数据访问,可以提高数据访问的效率和灵活性。文中用实例介绍了基于 OCI 进行空间数据访问的方 法。 关键词: OCI; 空间数据; Oracle; OpenGIS; Oracle Spatial
switch (dtype) //根据不同数据类型分别处理 { case 2://number case 3://interger case 4://float case 8://long
IOraConnection::checkerr ( errhp, OCIDefineByPos ( stmthp, &defnp, errhp, (ub4) 1,
The Spatial Data Access Based on OCI
SHAO Xiaofang1 , LIU Chungui2 ,YANG Zegang3
(1. Qingdao Branch of Naval Aeronautical Engineering Institute , Qingdao 266041; 2. Aeronautical Institue of the Naval Equipment Academa , Shanghai 200436; 3. Naval Submarine Institute , Qingdao 266040)
图 3 SQL 语句的具体处理过程
4 程序设计
实例程序的类模块结构主要有以下几个部分: (1) IOraConnection 类:主要功能为负责与数据库建立连 接,成员变量有环境句柄和错误处理句柄等,成员函数有建 立连接函数 connect ()、断开连接函数 disconnect ()、异常处理 函数 checkerr () 和取得 TDO (Type Descriptor Object) 指针的 get_tdo () 函数。 (2) IGeometry 类:主要是根据空间对象在 Oracle 数据库 中的存储结构对相应的部分进行查询、分析和处理,在 Oracle Spatial 的对象-关系模型中,空间数据是被作为几何对象来处 理的,因此在我们的程序中也引入面向对象的思想,把对空 间数据的操作转化成对对象属性的操作。根据 Oracle Spatial 中空间对象的存储模式,在程序中建立起相应的数据结构。 这样既简化了编程也简化了对空间数据的处理。 (3) IspatialRelation 类:主要实现对两个几何对象空间关 系的判断,其成员函数是参照 OpenGIS 规范 [1] 定制的。 (4) IspatialOperator 类:主要实现对几何对象的空间操 作,其成员函数也是参照 OpenGIS 规范 [1] 定制的,主要有 Boundary ()、 Distance ()、 Buffer ()、 Intersection ()、 Union ()、Difference ()、 ConvexHull (),由于篇幅有限不加赘述。 上述各个类模块的成员函数主要是通过结合 Oracle Spatial 中的 Spatial Usage Operators 以及 Geometry Functions 的 SQL 查 询语句的执行并对结果加以分析来实现的,示例程序代码如 下: BOOL ISpatialRelation::Equals ( ) //判断两空间对象是否相等
SDO_GTYPE NUMBER, SDO_SRID NUMBER, SDO_POINT SDO_POINT_TYPE,
SDO_ELEM_INFO MDSYS.SDO_ELEM_INFO_AR- RAY,
SDO_ORDINATES MDSYS.SDO_ORDINATE_AR- RAY) ; 其中,SDO_GTYPE 表示空间对象的类型;SDO_SRID 表 示空间对象的空间参考系统,目前为保留字段;SDO_POINT 表示点对象,为空时表示为其他类型;SDO_ELEM_INFO 为变 长 数 组 , 用 于 解 析 SDO_ORDINATES 的 含 义 ; SDO_ORDI- NATES 也是变长数组,为空间对象的坐标集。
Abstract:Oracle Spatial is a spatial database which is popularly used these days and OCI is an application programming interface for Oracle. It is efficient and convenient to access complex spatial data through OCI. This paper introduces how to use this method in practice. Key words:OCI ; Spatial Data ; Oracle ; OpenGIS ; Oracle Spatial
1 引言
近年来,对空间数据的处理已经成为信息处理越来越重 要的内容 [1]。Oracle Spatial 是现今应用广泛的空间数据库, 访问 Oracle 数据库有 3 种方法:通过 ODBC 数据源、基于 O- racle API 或 OCI。这些方法中,ODBC 虽然通用但效率和灵活 性较差,关于 Oracle API 编程的资料很少,而基于 OCI 进行 复杂的空间数据访问,可以提高数据访问的效率和灵活性。
Oracle 调用接口简称 OCI, 是一个应用程序接口 (AP)I , 提供了一组接口子函数,支持所有的 SQL 数据定义、数据操 纵、查询和事务控制等。使用 OC主 要介绍基于 OCI 对空间数据的访问。
2 Oracle Spatial 中空间存储模型及数据结构