如何用MapX访问Oracle空间数据库原理及方法
[ 来源:《计算机应用》 | 时间:2007年10月11日 | 收藏本文 ] 【大 中 小】
http://www.tianmomo.com/GIS/Spatial-Database/MapX-Connect-Oracle.html
目前,采用数据库管理空间数据已经成为主流技术,其优点在于能够实现空间数据与属性数据的无缝集成,这种数据库也称为空间数据库。空间数据库利用数据库的管理机制可以保证空间数据的完整性和安全性,对空间数据进行备份和恢复以及控制用户的并发访问等。
Oracle的空间数据选件(Oracle Spatial)可以把复杂的地图对象(包括空间数据和属性数据)存入一个表中,同时建立空间数据索引,从而实现空间数据和属性数据的一体化存储和管理。 Oracle Spatial还提供空间算子,结合SQL语句实现对空间数据的查询和其它复杂空间分析。
MapX是MapInfo公司的地图控件,用户可以在自己的程序中引入MapX控件,实现带地图功能的应用,同时可以选择用户熟悉的开发工具,如VB、VC、PowerBuilder、Delphi等。
用MapX访问Oracle的空间数据是通过Oracle提供给Mapinfo的底层数据库接口OCI(Oracle Call Interface)。
Mapinfo提供EasyLoader工具,用来将用户制作的Mapinfo地图数据上载到Oracle数据库中。如果将来地图数据发生了变更,也只需要通过EasyLoader的刷新表功能,即可将发生变化的地图数据在Oracle数据库中更新。
摘 要:采用数据库管理空间数据是当前的发展趋势,文中总结了Oracle数据库中空间数据的上载和存储机制,探讨了应用程序对Oracle数据库中空间数据的访问,并给出应用实例。
关键词:空间数据库;Oracle数据库;MapX
中图分类号:TP311;P285.3文献标识码:A
Accessing Spatial Data in Oracle Using MapX
Abstract:Spatial data managed by database is development trend currently. This paper summarizes spatial data uploaded to Oracle database and its storage,discusses accessing spatial data in Oracle database and gives an application instance.
Key words:spatial database;Oracle database;MapX
本 文着重探讨用VC、MapX开发带地图的应用程序,Oracle中空间数据的存储和管理以及如何在应用程序中访问存储Oracle中的空间数据。工作环境 如下:Visual C++ 6.0,Mapinfo6.5,MapX4.5,EasyLoader for Oracle 81116,Oracle81116。Mapinfo6.5用来进行地图的编辑和属性数据的编辑,EasyLoader for Oracle8.1.6将地图数据上载到Oracle中,Visual C++6.0与MapX4.5相结合开发实现Oracle中空间数据访问的应用程序。
1 空间数据的准备和管理
1.1 空间数据存储的配置
首先创建数据库,然后进行空间数据存储的配置,主要涉及以下两个方面的配置:
1)为存储空间数据创建新的表空间
每个Oracle的数据库至少有一个SYSTEM表空间,为了提高运行效率和管理的需要,最好使用其他表空间来划分用户和应用程序,因此为访问空间数据的用户和应用程序创建新的表空间,设表空间名为GISTEST,并配置GISTEST的初始大小、增量大小等参数。
2)创建有权访问空间数据的用户
Oracle中可以为用户设定特定的表空间作为他的缺省表空间,创建用户GISTESTuser的缺省表空间为GISTEST,则该用户便具有访问空间数据的权利,同时还要为用户GISTESTuser设定合适的角色、系统权限和对象权限。
1.2 Mapinfo地图的上载
地 图用Mapinfo编辑完成,再用EasyLoader forOracle81116将编辑好的Mapinfo的地图上载到Oracle中。要将地图上载到GISTEST表空间中,需要以用户 GISTESTuser的身份登录到Oracle。通过Oracle的身份验证后,才可以上载Map-info地图。第一次上载Mapinfo地图到 Oracle时,EasyLoader会自动创建一个名为mapinfo的用户,该用户的缺省口令为“mapinfo”,缺省表空间和临时表空间都是 SYSTEM,同时会在该用户下创建一个名为MAPINFO-MAPCATALOG的表,这个表用来记录所有上载到Oracle中的Mapinfo地图的 信息,如:地图的存储和索引形式、地图的名称、地图的所有者、存储地图空间数据的列名、地图的坐标系、地图的边界、地图中点线面的样式信息等。
1.3 Mapinfo地图在Oracle中的存储和管理方式
Oracle为管理空间数据提供了对象管理模式SDO(Spatial Data Object),同时提供优秀的空间索引机制。
MDSYS 是Oracle Spatial的管理用户,MDSYS方案规定几何数据的存储方式、语法形式和语义。MDSYS方案中,表SDOGEOM-METADATA-TABLE 存储所有上载到Oracle中的Mapinfo地图的信息,表SDO-INDEX-METADATA-TABLE存储与索引相关的信息,如:被索引的列 名,索引的方式,索引的级别,索引的所有者等。MDSYS方案中还有与空间数据及其索引相关的视图:ALL-SDO-GEOM- METADATA,ALL-SDO-INDEXMETA DATA,DBA-SDO-GEOM-METADATA,DBA-SDO-INDEXMET ADATA,USER-SDO-GEOM-METADATA,USER-SDOINDEX-METADATA。
上载到Oracle中的每一个地图 由两个表表示,一个是与该地图空间索引方式相关的表,叫做索引表,另一个用来存储地图属性数据和空间数据,叫数据表。例如:一个名为 ShangHaiMap的地图上载到Oracle,创建两个表:数据表ShangHaiMap和索引表ShangHaiMap-SX-FL6$。 Oracle为了有效的管理和存储Mapinfo地图,在数据表ShangHaiMap中新增加两列:一列是类型为NUMBER的“MI-PRINX”, 它是唯一性索引字段,一列是类型为SDO-GEOMETRY的“GEOLOC”,用来存储空间数据。SDO-GEOMETRY是Oracle中存储地图数 据的空间数据类型。
2 应用程序的开发
在VC下,引入MapX控件开发带地图的应用程序。MapX控件一般自动打开在系统中注册的缺省.GST文件,其路径位 于注册表HKEY-LOCAL-MACHINE"Software"MapInfo"MapX"4.0下,注册键SearchPaths下是缺省的数据目 录,定位3.gst文件。3.gst文件是MapX可以访问的地图文件,由MapX的实用程序GeoSet Manager创建,它是将多个Mapinfo的地图文件(3.tab)集中在一起,这样打开一个3.gst文件,即可将一个包含多层的地图打开。此外还 有注册键GeoDicionary,用来定位3.dct文件。3.dct文件由MapX的另一个实用程序Geodictionary Manager生成,Geodictionary Manager默认的3.dct文件为自带的GeoDict.dct,用户可以根据需要,建立自己的3.dct文件。
应用程序采用客户/服务器结构,通过OCI接口,实现应用程序对Oracle中空间数据的访问,如图1所示。
2.1 应用程序开发中的关键技术
在VC的工程项目中加入MapX.cpp和MapX.h两个文件,这两个文件中定义了有关MapX控件的类和访问方法。开发过程中,有如下几个关键技术:
1)访问用户自己的GST文件
在应用程序中,如果用户要访问自己的GST文件,改变MapX控件缺省打开的3.gst文件,就必须对类CMapX进行设置,指定要打开的3.gst文件。方法如下:
CMapX m_MapX;
//指明用户要访问的.GST文件替代缺省设置
m-MapX.SetGeoSet("."roads"roads.gst");
2)访问Oracle空间数据库
MapX 控件有两种方式访问Oracle中的空间数据,一种为ODBC方式,一种为OCI方式。ODBC方式的缺点是通用接口,速度慢,需要配置数据源DNS。 OCI方式的优点是底层接口,速度快。现以OCI方式实现在应用程序中与Oracle的连接并访问Oracle中的空间数据。
通过OCI访问空间 数据相当于从服务器端下载相关的空间数据,并在客户端进行显示。客户端显示空间数据的方式就是在原有地图上增加一层新的地图,而与图层相关的类为 CmapX2LayerInfo,有两个重要的方法SetType()和AddParameter()。前者用来设置图层的类型,后者为连接数据库设置参 数。
图2所示为连接Oracle空间数据库的流程。
类CmapXLayerInfo是类ColeDispatchDriv2er的继承类,创建类CmapXLayerInfo的方法,即为创建新图层的方法。方法如下:
CMapXLayerInfo LayerInfoObject;
if (!LayerInfoObject.CreateDispatch(LayerInfoObject.GetClsid()))
{
TRACE0("Failed to Createobject");
return;
}
图层类型为miLayerInfoTypeServer时,连接Oracle数据库需要设置连接字符串、连接方式、是否设置缓存、是否设置最小边界矩形查询、新建图层名称、查询空间数据的SQL语句等参数。下面给出设置连接字符串的VC语句。
VARIANT s;
CString str;
str="SRVR=GISTEST;UID=GISTESTuser;PWD=GISTESTuser";
s.vt = VT-BSTR;
s.bstrVal = str.AllocSysString();
LayerInfoObject.AddParameter("CONNECTSTRING",s);
查询结果的显示通过类CmapXLayers的Add()方法实现,具体示例如下:
m_MapX.GetLayers().Add(LayerInfoObject,1);
3)Oracle Spatial的空间函数
Oracle Spatial提供了适合于空间数据操作的空间函数,如比较常用的用于相交查询的SDO-FILTER,SDORELATE,SDO-WITHIN- DISTANCE;用于缓冲区分析的SDO-GEOM.SDO-BUFFER;用于面积、长度计算函数的SDO-GEOM.AREA,SDO- GEOM.LENGTH等。下面给出用于面积计算的SQL语句示例:
update aTable set aTable.AREA=
mdsys.sdo-geom.sdo-area(GEOLOC,(select sdo-diminfo
from mdsys.sdo-geom-metadata-table where sdo-geommetadata-
table.sdo-table-name = 'aTable' and sdo-geommetadata-
table.sdo-column-name= 'GEOLOC'))
其中aTable表示一个空间数据表,它存储空间数据的列名为“GEOLOC”,列AREA存放计算出的面积值,SDOAREA计算二维多边形的面积,并将计算结果存放到列AREA中保存。
2.2 应用程序示例
应用程序通过与空间数据库的接口来实现对数据库中存储的属性数据和空间数据的访问,同时根据实际情况的需要对数据进行查询,并用地图等直观的形式反应查询结果。
图3中的地图基本数据来源于北大方正MapInfo事业部,基于实验目的,增添了道路长度字段,并设定各个道路的长度,其查询SQL语句为:
SELECT 3 FROM Shanghai-thirdr
WHERE Shanghai-thirdr.RoadLength > 10
文章只是对空间数据库的访问方面做了一些有益的探索,还有很多工作需要做。随着面向空间数据库的应用,基于空间数据库的空间数据挖掘以及将空间数据应用于各行各业的研究将会不断展开。
参考文献
[1] 本丛书编委会.Oracle8.1.6管理员指南[M]. 北京:北京希望电子出版社,2000.
[2] 修文群,池天河,等. 城市地理信息系统[M]. 北京:北京希望电子出版社,1999.
[3] Oracle8.Oracle Spatial User's Guide and Reference Release 8.1.6[DB/CD].
作者简介:霍宏(1972-),女,辽宁本溪人,讲师,硕士,主要研究方向:地理信息系统、智能交通系统; 胡福乔(1957-),男,浙江宁波人,副教授,主要研究方向:智能交通系统.