您的位置:首页 > 数据库

基于OCCI的空间数据库几何对象实现方法研究

2008-10-30 14:17 786 查看
基于OCCI的空间数据库几何对象实现方法研究*
 
吴杰1    陆锋2    汤井田1   程昌秀2    袁正午1
 
(1.      中南大学信息工程学院   长沙 410083)
(2.      中国科学院资源与环境信息系统国家重点实验室   北京 100101)
 

摘要:海量空间数据的高效访问和操作是GIS平台和应用系统开发的核心技术。本文分析了Oracle数据库管理系统所提供的访问接口OCI、OCCI及对象类型转换工具OTT的特性,基于OCCI和OTT技术提出了一种面向对象的访问及操作SDO几何对象的方法,并通过实例讨论了实现过程。该方法利用SDO几何模型作为Oracle服务端的几何对象载体,在客户端通过继承SDO几何对象实现自定义几何对象模型,避免了SDO几何对象与用户定义几何对象之间的空间数据转换过程,有利于扩展自定义空间数据模型。同时,自定义几何对象可以充分利用Oracle Spatial提供的空间操作与整合功能,加速GIS软件平台研发过程。

 

关键词: 空间数据库,Oracle Spatial,几何对象,OCCI,OTT

 

1.      前言

Oracle 是以高级结构化查询语言(SQL)为基础、支持分布式海量数据存储与处理的对象关系数据库管理系统。目前很多GIS软件平台及其相关产品采用Oracle作为空间数据库管理系统的基础平台。因此,如何在Oracle中快速、有效地管理和操作海量空间数据成为GIS平台和应用系统研发人员十分关心的问题。

Oracle数据库管理系统提供了许多数据访问接口,如JDBC、SQLJ、OCI、OCCI、OO4O等[4][5],其中Oracle 调用接口(Oracle Call Interface,OCI)因其访问能力高及平台无关性而受到青睐。总的来说,OCI具有以下优点[1]:

-           在应用程序设计和程序执行方面具有更好的控制;
-           支持动态SQL语句;
-           在数据访问时具有数组操作能力;
-           设置通用的预获取缓冲区以减少与服务器的交互;
-          线程安全,不需采用互斥锁。
然而,尽管OCI具有上述优点,但是由于其操作复杂,层次性较差,对数据的传输及其操作不支持对象,给程序开发人员带来了诸多不便。

因此,如何发挥OCI和Oracle Spatial的技术特点,快速、有效地构造与实现GIS几何模型与空间数据库,并使其稳定高效,是基于Oracle建立海量空间数据库管理系统所面临的关键问题。

2.      相关技术概述

2.1 Oracle C++调用接口

Oracle C++ 调用接口(Oracle C++ Call Interface,OCCI)是提供给C++程序与Oracle数据库实现交互的应用程序接口(Application Program Interface,API),它以动态连接库的形式提供给用户。OCCI对OCI实行了对象级的封装,其底层仍是OCI。与其他的数据库访问接口相比,OCCI优点在于[2]:
-           对OCI进行封装,功能全面;
-           提供可操作的C++对象,比单纯的API函数简单易用;
-           对于熟悉JDBC的开发人员更为简单,因为JDBC更象面向Java语言的“OCCI ”;
-          导航接口管理用户自定义类型为C++类的实例。
当然,OCCI也存在一些缺点:
-           由于在OCI基础上封装,因此速度不如OCI;
-           到目前的Oracle 9.2为止,尚不支持对象的数组下载,还有待完善。

2.2 对象类型转换

利用Oracle的实用工具——对象类型转换器(Object Type Translator,OTT),用户可以通过SQL语句创建存储在Oracle服务端的对象类型,并可以用该对象创建表。之后OCCI、OCI或 Pro*C/C++的开发人员就可以访问存储在表里的对象。

利用OTT有以下优点[2]:

-           减少了程序开发人员手写大量对应于方案里对象的宿主语言变量的繁琐工作,大大提高了应用程序的开发效率;
-           有利于方案里对象的变更处理。一旦方案对象改变,OTT可以再次生成改变后对象的头文件,减少了繁琐的手工修改操作。
基于OTT和OCCI技术的数据库访问开发过程如图1。

 

图 1 基于OCCI和OTT的数据库访问开发过程
Fig1. Development procedure using the OTT utility with OCCI
 

可见,OCCI减少了数据库开发难度,可以使GIS开发人员更专注于空间数据处理部分。同时,Oracle 9i以上版本已经支持对象类型的继承,而且其空间算子十分丰富。因此,我们可以充分利用OCCI和OCT技术来开发GIS平台及应用系统。

3.      几何对象模型的客户端继承的设计及实现

3.1 原理

Oracle Spatial把SDO_GEOMETRY对象类型定义为[3][6]:

CREATE TYPE SDO_GEOMETRY AS OBJECT (

     SDO_GTYPE NUMBER,

     SDO_SRID NUMBER,

     SDO_POINT MDSYS.SDO_POINT_TYPE,

     SDO_ELEM_INFO MDSYS.SDO_ELEM_INFO_ARRAY,

     SDO_ORDINATES MDSYS.SDO_ORDINATE_ARRAY

);

为了使客户端能够与服务端的SDO_GEOMETRY进行数据交互,我们在客户端建立SDO_GEOMETRY的类对象(或用Oracle提供的OTT命令转出),并在客户端与服务端建立连接时把该对象注册到连接环境中。这样Oracle服务端即可识别客户端的SDO_GEOMETRY对象,客户端即可与服务端进行数据交互。

如果开发者建立了个性化的几何对象模型,采用SDO_GEOMETRY模型结构作为物理存储格式,开发者也可以用SDO_GEOMETRY模型派生出个性化的几何对象模型。通过SDO_GEOMETRY,个性化的几何对象模型可以与服务端的SDO_GEOMETRY模型进行一系列的数据交互,如SDO_GEOMETRY的插入、删除、更新、查询(包括空间操作查询)等。

个性化几何对象模型通过客户端继承SDO_GEOMETRY模型的过程如图2。

图 2 个性化几何模型客户端继承的数据访问流程
Fig2. Data accessing flow of inherited user defined geometric model

3.2 实现

以下是基于OCCI的SDO_GEOMETRY对象在客户端继承的实现步骤:

⑴ 编写用于OTT转出SDO_GEOMETRY对象的有关信息文件(*.typ)。

// 文件名为:SDO_GEOMETRY.type

CASE=LOWER //表示生成的对象名全是小写字母

MAPFILE=SDO_GEOMETRYm.cpp

TYPE mdsys.SDO_GEOMETRY //表明MDSYS.SDO_GEOMETRY导出时对象名为小写

⑵ 用OTT命令行转出SDO_GEOMETRY对象的类定义文件及注册文件。

ott userid=scott/tiger intype=SDO_GEOMETRY.typ
outtype=SDO_GEOMETRYout.typ code=cpp mapfile=SDO_GEOMETRYm.cpp
hfile=SDO_GEOMETRY.h cppfile=SDO_GEOMETRY.cpp attraccess=private

其中:SDO_GEOMETRYm.h为对象注册的头文件;

      SDO_GEOMETRYm.cpp为对象注册的实现文件;

      SDO_GEOMETRY.h为SDO_GEOMETRY及sdo_point等对象的头文件;

      SDO_GEOMETRY.cpp为SDO_GEOMETRY及sdo_point对象的实现文件;

      SDO_GEOMETRYout.typ为转出的信息文件;

⑶ 客户端继承

假如SDO_GEOMETRY派生User_Defined_Geometry ,则定义类User_Defined_Geometry为

class User_Defined_Geometry : public SDO_GEOMETRY

{



// 用户扩展

};

⑷ 编写客户端应用程序(基于OCCI)

-           创建连接

要使用OTT映射过来的SDO_GEOMETRY对象,就必须用对象创建环境并注册对象。如:

env = Environment::createEnvironment (Environment::OBJECT);

SDO_GEOMETRYm(env);

conn = env->createConnection (用户名, 密码, 数据库服务名);

-           编写操纵SDO_GEOMETRY或User_Defined_Geometry对象函数

-           退出时关闭连接和释放环境变量

env->terminateConnection (conn);

Environment::terminateEnvironment (env);

⑸ 编译运行

 

3.3 几何模型操作

在建立了个性化User_Defined_Geometry几何模型之后,接下来是如何实现User_Defined_Geometry对象数据的上传及下载,同时利用Oracle Spatial的空间算子实现空间查询。以下程序中insertRow (int id, User_Defined_Geometry *geo)用于插入一个空间实体,displayAllRows()用于下载所有的空间实体,testSpatialOperation (User_Defined_Geometry *geom)用于查询与特定几何实体相交的几何实体。

表island含有两个属性列,定义为:create table island(objectid number, shape mdsys.SDO_GEOMETRY),其中objectid为几何对象的ID,类型为Number型,shape为几何对象的空间属性列,类型为SDO_GEOMETRY。

// 插入User_Defined_Geometry对象

void insertRow (int id, User_Defined_Geometry *geo)

  { // 定义一个statement

    stmt=conn->createStatement("insert into island(objectid,shape) values(:x,:y)");

         stmt->setInt(1,id);  // 绑定参数:x并设值

         stmt->setObject(2,geo);  // 绑定参数:y并设值

         stmt->execute(); // 执行插入操作

         conn->commit(); // 递交事务

      conn->terminateStatement(stmt);

             }

// 下载User_Defined_Geometry对象

void displayAllRows ()

  {

         User_Defined_Geometry *Entity;     

         stmt=conn->createStatement("SELECT objectid,shape  FROM island ");

ResultSet *rset=stmt->executeQuery(); // 执行查询

while(rset->next())

 {

Entity=(User_Defined_Geometry*)rset->getObject(2);

// 获得User_Defined_Geometry对象

}

         stmt->closeResultSet (rset);//关闭resultset

         conn->terminateStatement(stmt);

 }

// 测试User_Defined_Geometry对象的空间操作

void testSpatialOperation (User_Defined_Geometry *geom)

  {

         User_Defined_Geometry * tmp;

stmt=conn->createStatement

("SELECT SDO_GEOM.SDO_INTERSECTION(a.shape,:x, 0.005) FROM island a");

    stmt->setObject(1,geom); // 绑定:x参数为geom

         ResultSet *rset=stmt->executeQuery(); // 执行空间查询

         while(rset->next())

         {

                   tmp=(User_Defined_Geometry *)rset->getObject(1); // 返回空间查询结果

         }

         stmt->closeResultSet (rset);

    conn->terminateStatement(stmt);

  }

以上程序在以下环境中调试编译通过:

服务端:linux7.2 (Redhat 7.2)+ Oracle 9i数据库服务器;

客户端:Windows2000 + Oracle 9.2客户端 + Visual C++ 6.0

4.      结论:

基于OCCI的几何对象模型客户端继承方法具有以下优点:

1)        用OTT方法转换的SDO_GEOMETRY可以派生其它类,该派生类可以作为直接上传、下载的对象;

2)        可以有效利用现有的Oracle Spatial 的空间算子进行空间操作,不需要任何的转换;

3)        用OTT方法转换的对象,不包含该对象在Oracle中定义的方法,为代码保护提供了可能。

同时,上述方法仍存在一些不足之处:

1)          OCCI大部分基于OCI封装,在一定程度上是通过牺牲运行效率来换取开发效率;

2)          OCCI只支持Oracle 9i以上的版本,而且目前尚不支持对象数组下载。

总的来说,从SDO_GEOMETRY派生出User_Defined_Geometry对象后,SDO_GEOMETRY模型结构可以作为User_Defined_Geometry对象模型的服务端载体,从而避免了SDO_GEOMETRY对象与User_Defined_Geometry对象之间空间数据的相互转换,有利于扩展用户自定义空间数据模型。另外User_Defined_Geometry可以参与Oracle服务端的SDO_GEOMETRY的空间运算及操作,从而减少了用户在空间运算上投入的资源,可缩短软件的开发周期,加速GIS软件平台的研发过程。

 

参考文献

[1]Jack Melnick.Oracle.Call Interface Programmer’s Guide.2002
[2]Roza Leyderman.Oracle C++ Call Interface Programmer’s Guide.2002
[3]Chuck Murray.Oracle Spatial User’s Guide and Reference.2002
[4]John Russell.Oracle9i Application Developer’s Guide – Fundamentals.2001
[5]Bill Gietz.Oracle 9i Application Developer’s Guide - Object-Relational Features.2001
[6]John Russell.PL/SQL User’s Guide and Reference.2002
 
Method Research About Geometric Object Implement Basing On Spatial Database With OCCI
Wu Jie Lu Feng Tang Jingtian Cheng Changxiu Yuan Zhengwu
(Institute of  Informational
Physics and engineering ,Central South University ,Chang
Sha,410083;Institute of Geographic Science and Resources Research
,Chinese Academy of Science ,Beijing 100101)
Abstract:
Accessing and manipulating the spatial data efficiently stored in the
enterprise relational database management systems is an important task
for GIS platforms and engineering. Among the interfaces provided by
Oracle, Oracle Call Interface (OCI) and Oracle C++ Call Interface (OCCI
) are welcomed for their outstanding advantages. With a detailed
analysis on OCI, OCCI and Object Type Translator (OTT), the author set
forward an object oriented method accessing and manipulating the SDO
geometric objects in Oracle system with OCCI and OTT technologies, and
conducted an experiment with Oracle 9i. The method allows users
construct their own geometric model with inheritance from SDO geometric
model, thus avoids the spatial information transformation between SDO
geometric objects and user defined geometric objects during uploading
and downloading the spatial data. Moreover, the spatial operators and
spatial aggregate functions of Oracle Spatial can be used sufficiently.

 

Keyword: Spatial database, Oracle Spatial, Geometric objects, OCCI, OTT

 

 

资助项目:863重大项目(2001AA135180)、国家自然科学基金项目(40201043)资助

作者简介:吴杰(1974-),男,中南大学信息工程学院硕士研究生,研究方向为空间数据库技术研发
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐