GIS 与Oracle 数据库空间数据格式的转换
1 概述
近几十年来,由于社会应用需求的增长和多年研究工作的积累,地理信息系统(GIS)技术有了明显的进步,正朝着跨平台运行、分布式处理、开放式开发、网络化集成的方向发展。从空间数据管理角度看,GIS 已经从纯文件方式管理图形数据和属性数据向图形数据文件方式管理和属性数据关系型数据库管理方式发展。然而由于GIS 的图形数据格式多样,图形数据用文件来管理的模式给信息共享带来了极大不便,特别是随着GIS 应用领域的不断拓宽,数据量的快速增大,在实现数据共享、网络通信、并发控制及数据安全恢复机制等方面呈现出明显局限,出现了诸多难以解决的问题。
目前,大多数GIS 软件都逐渐倾向于采用空间数据与属性数据一体化的管理方式,而且选用Oracle 数据库作为存储空间数据和属性数据的数据库管理系统,特别是Oracle 推出Spatial 之后,基于Oracle Spatial 的空间数据管理方式逐渐被认同[1]。然而,由于各个不同的GIS 软件的数据存储结构是封闭的,各自采用不同的数据格式,在数据上载Oracle Spatial 中存在数据语义表达的不一致性,彼此之间难以实现数据互访,并且用户又难以控制,本文针对这一问题以MAPGIS 平台和Oracle 数据库为例探讨GIS 软件与Oracle 数据库数据交换的方法。
2 MAPGIS 明码格式
MAPGIS 的明码格式数据接口是一个开放式的软件数据接口,用户用其他软件获取的数据只要按照明码格式写成图形文件,就可以由MAPGIS 系统读取。其明码数据格式是ASCII 码的文件,较全面、清晰,且以点、线、面分开的方式存储空间实体,易于读写。下面以线文件为例,分析其明码数据格式的构成。线文件结构如下:
逻辑结构:文件头 线数 1 号线 2 号线......
具体为:
文件头, 8 个字节WMAP9021
线数n
1号线线型号辅助线型号颜色
线宽x系数y系数辅助色
图层透明输出
线点数m1
x x1y1; x2y2;…; xm1ym1
ID 线长度
2号线线型号辅助线型号颜色
线宽x系数y系数辅助色
图层透明输出
线点数m2
x x1 y1; x2y2; …; xm2 ym2
ID 线长度
……
n号线线型号辅助线型号颜色
线宽x系数y系数辅助色
图层透明输出
线点数mn
x1 y1; x2y2; …; xmn ymn
ID 线长度
3 Oracle Spatial 数据结构
在Oracle Spatial 的对象—关系模型中,一个空间实体的空间信息是存储在字段类型为SDO_EOMETRY 的对象类型记录中。SDO_ GEOMETRY 在
Oracle 中的定义如下:
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);
在MAPGIS 明码数据上载Oracle Spatial 之前,先在Oracle 中建立与MAPGIS 明码格式相一致的空间类型信息和图形属性信息库结构,见表1 所示:
表1 线信息数据库结构
名称数据类型含义名称数据类型含义
Line_ID GUID 线对象代码Line_WD int 线宽
Line_xy GEOMETRY 坐标序列Line_X float x 系数
Line_TID Int 线型号Line_Y float y 系数
Line_TFID Int 辅助线型号Line_CLR int 辅助色
Line_CL Int 颜色Line_OUT log 透明输出
Line_LAY char 图层Line_LEG float 周长
4 空间数据引擎实现方法
4.1 基本过程
目前,各类专题空间数据库建立的过程包括技术设计、资料准备、数据获取和数据入库等内容。数据的获取常可利用现有的GIS 软件如GeoStar、MAPGIS、SUPERMAP、ARCGIS 等来实现,获得的数据通过某一空间数据引擎(如Easyloader)上载到Oracle 数据库中,实现利用Oracle Spatial 存储、管理空间数据。MAPORA 引擎是把MAPGIS 的明码格式通过编程实现空间数据上载Oracle Spatial 的一种方法,其具体过程如图1 所示[2]:
4.2 实现程序代码
1)利用Oracle JDBC 驱动程序连接Oracle 数据库。其java 程序段如下:
myconnection=DriverManager.getConnection(
“jdbc:oracle:thin:@localhost:1521:orcl”,
“scott”
“tiger”);
2)使用CREATE 语句创建数据库表单:
CREATE TABLE F001B (
Point_id INTEGER CONSTRAINT PRIMARY
KEY,
Point_xy MDSYS.SDO_GEOMETRY,
file://坐标对字段的定义
Point_TID INTEGER,
file://线型号字段的定义
Point_TFID INTEGER,
file://辅助线型号字段的定义
......);
3)读取MAPGIS 明码格式后,写入Oracle 数据库中:
INSERT INFO F001B VALUES(
1,
MDSYS.SDO_GEOMETRY(
SDO_GTYPE = 2001
SDO_SRID= NULL
SDO_POINT = (1,1,NULL)
SDO_ELEM_INFO = NULL
SDO_ORDINATES = NULL)
12,
20,
......);
5 数据应用
目前,虽然GIS 软件产品较多,但由于GIS 应用于各行各业,不可能解决所有的专业问题,还必须根据用户的实际需要进行开发,例如MapInfo 公司提供的MapBasic、MapX,ESRI 公司提供的AVENUE、ArcObjects 等语言和开发组件都方便用户进行二次开发。
MapX 是一个基于Windows 操作系统的标准控件,不仅支持Visual Basic、Delphi、Visual C++等面向对象语言,而且支持Oracle Spatial。本文利用Oracle 数据库存储空间数据,利用MapX 控件和Visual Basic 语言实现空间数据的交换及应用开发,其过程如图2 所示。
6 结论
1)采用Oracle Spatial 存储、管理空间数据,易于解决数据共享、分布式处理、网络通信、开放式开发、并发控制、网络化集成、跨平台运行及数据安全恢复机制等方面的难题。
2)MAPORA 数据引擎为用户提供了ASCII 码格式的空间数据上载Oracle Spatial 的一种便利方法,用户可以把通过野外测量或其他途径获取的数据较方便的上载到Oracle 数据库中,同时用户又可以通过SQL 语言操作数据库,实现远程数据的应用。