王雪娇 宋学山 柴志勇 刘金玉
中水北方勘测设计研究有限责任公司,中国·天津 300222
Oracle Spatial;Geodatabase;地籍;入库
空间数据的存储与管理往往是GIS 研究的重点,比较常用的空间数据存储机制是ESRI 公司提供的面向对象的Geodatabase 的空间存储方案,这种空间存储方式将客观世界的实体对象抽象化实现对空间数据的存储,Geodatabase 能够很好的再现客观地理实体对象的特点,[4]但是Geodatabase 空间数据模型实际处于逻辑概念模型阶段,实际应用中对空间数据的存储依然是将属性与规则分解进行存储的。本文以Oracle Spatial 为空间数据库,分析其数据模型特点并结合Geodatabase 数据模型搭建语义映射转换模型,实现空间数据的入库预加载。
甲骨文(Oracle)为实现空间数据的存储于管理的方式是他们推出了Oracle Spatial 数据库组件。Oracle Spatial 由以下几个部分组成:(1)规定了支持的各种空间数据(包括矢量数据和栅格数据)几何类型规范、元数据语义和存储方法函数的模块(MDSYS);(2)空间索引机制;(3)用于执行兴趣区域查询、空间连接查询和其他空间分析操作的操作符、函数和过程;(4)用于表示在网络中建模为节点和链接的功能或对象的网络数据模型;(5)用于处理拓扑中节点、边和面的数据的拓扑数据模型[1]。
Oracle Spatial 是由一组对象数据类型、方法以及使用这些类型的运算符,函数和过程组成的数据库组件,最新版本的Oracle Spatial 的矢量空间数据模型只有对象数据模型(SDO_Geometry)。空间索引创建和维护使用基本的DDL(CREATE,ALTER,DROP) 和DML(INSERT,UPDATE,DELETE)语句完成。
Oracle Spatial 旨在使位置启用的应用程序和地理信息系统(GIS)应用程序的用户更轻松,更自然地进行空间数据管理。一旦将空间数据存储在Oracle 数据库中,便可轻松操作,检索数据,并将其与存储在数据库中的所有其他数据相关联。
Oracle Spatial 摆脱了以序列化的二进制实现空间数据存储的方式,采用一个MDSYS 模块,定义了一些结构化类型来实现几何空间数据的存储于管理。MDSYS 定义了很多空间存储类型,比如,用于存储Shapefile 等矢量数据格式的SDO_GEOMETRY 类型和用于存储影像等栅格数据类型的SDO_RASTER 类型。
客观世界的地理实体对象的几何描述(空间参考、几何坐标、几何类型等信息)会作为对象存储在Oracle Spatial中MDSYS 模块的矢量数据对象的数据类型(比如SDO_GEOMETRY)当中。任何具有SDO_GEOMETRY 类型列的表都必须具有另一列或一组列,这些列或表定义了该表的唯一主键。这种表格有时被称为空间表格或空间几何表格。SDO_GEOMETRY 类型是空间数据在Oracle Spatial 存储的关键所在,其中SDO_GEOMETRY 类型定义如下:
CREATE TYPE sdo_geometry AS OBJECT(
SDO_GTYPE NUMBER,//几何数据类型标识
SDO_SRID NUMBER,//空间坐标系统标识
SDO_POINT SDO_POINT_TYPE,//单点几何数据类型
SDO_ELEM_INFO SDO_ELEM_INFO_ARRAY// 坐标点的排列方式
SDO_ORDINATES SDO_ORDINATE_ARRAY)// 坐标点集合;
Geodatabase(地理数据库)数据模型是在汲取以往数据模型工作成果的基础上,采用面向对象思想提出的适合关系数据库管理系统的空间数据模型[3]。在Geodatabase 中,每一个对象都定义了一个组件,允许用户在这些基本数据模型的基础上扩展自己的面向对象模型。Geodatabase 利用面对对象理论,将现实客观世界共同特征抽象成Object Class(对象类)、Feature Class(要素类)、Relationship Class(关系类)和Feature Dataset(要素数据集)实现对地理实体对象的存储和管理。地理实体对象一般包括空间数据和非空间数据,在Geodatabase中,对象类通过表(Table)实现非空间数据的存储和管理;如图1所示,Geodatabase 将几何对象的数据和属性通过要素进行存储,而具有同一类要素的集合被称为要素类;当不同的要素类之间存在某种联系时,可以通过要素数据集来组织和管理这些要素类,而不同要素之间的关联关系则用关系类描述[2]。
图1 Geodatabase 的数据组织结构
Geodatabase 提供了Workspace(工作空间)充当空间数据和非空间数据的临时容器,并提供了实例化现有数据集和创建新的数据集的方法。如图2所示,Geodatabase 可以利用Workspace 接口操作不同数据类型的Workspace Factory(工作空间工厂)实现对不同数据格式的空间数据的存储和管理。比较常见的工作空间工厂有操作CAD 格式数据的CAD Workspace Factory、操作Shape file 格式数据的Shape file Workspace Factory、操作SDE 数据库空间数据的SDE Workspace Factory和操作coverage 矢量数据的ARC Info Workspace Factory。
图2 利用Workspace 实现对不同ArcGIS 数据的操作
Geodatabase 不只是存储地理实体对象的空间数据和属性数据,还将客观世界的地理实体对象的行为、关系和拓扑规则引入到地理要素中,尽最大可能的模仿现实客观地理要素对象。使得地理实体对象在空间数据库的存储不再是简单的点、线、面几何对象, 而更加接近人类对现实客观世界的表达。而且Geodatabase 具备面向对象的可继承性和多态性,用户可以基于已有的数据模型对象进行拓展构建出符合自身需求的数据对象。但是Geodatabase 空间数据模型实际处于逻辑概念模型阶段,实际应用中对空间数据的存储依然是将属性与规则分解进行存储的。
客观地理实体中,每一种地理要素被称为要素类,要素类中通过属性表的方式存储地理实体的空间数据和非空间数据的,而地理实体中的单个要素对象就是要素类属性表中的一条记录转换到Oracle Spatial 中也是关系表中的一行数据。所以,Oracle Spatial 与Geodatabase 的语义映射过程实质上就是要素类属性表结构向Oracle Spatial 空间数据表结构的转换。在建立Oracle Spatial 与Geodatabase 的语义建模过程一般包括:几何类型的语义映射、空间坐标系的语义映射和字段类型的语义映射,如图3所示。
图3 Oracle Spatial 与Geodatabase 的语义转换模型
Geodatabase 的要素具有:几何形状、属性、行为和关系等特性。要素具有表示几何形状和空间位置的特殊字段,名称为“SHAPE”,字段类型为“Geometry”。ArcGIS 地理实体的几何类型是通过esri Geometry Type 描述的。而Geodatabase 的几何要素一般为点、线、面、多点(属性相同的一组点的无序集合)和多面体。Oracle Spatial 通过SDO_Geometry 对象数据类型存储空间对象的几何描述(空间坐标参考、坐标点信息和几何类型形状),如表1所示,Oracle Spatial支持的点状几何类型(2001)映射到Geodatabase 的点要素对象(esri Geometry Point);Oracle Spatial 中的由直线或曲线组成的多义线(2002)映射到Geodatabase的线状要素对象(esri Geometry Polyline);Oracle Spatial 中的由直线或曲线组成的封闭多边形(2002)映射到Geodatabase 的线状要素对象(esri Geometry Polygon)。
表1 SDO_GType 与esri Geometry Type 对照表
要素的几何形状是由一组结构化的x,y,z 坐标存储的,这些坐标通过空间坐标系统与地球实际形状相关联。其中,地理坐标系是描述地理空间实体对象在理想化的地球椭球面上的位置的坐标系统(用B,L,H 表示);而投影坐标系就是按照一定的投影方式(如高斯-克吕格投影)将地球椭球面转换成二维平面并加上高程所形成的三维坐标系统(用x,y,z 表示)。Geodatabase 和Oracle Spatial 一般采用文本标志语言WKT(well-known text)记录坐标系的中的元素信息(地球椭球,投影参数等信息),Geodatabase 都为每一个坐标系的确定一个唯一的WKID(Well-Know ID)值,而Oracle Spatial 通过定义一个唯一标识SDO_SRID 存储坐标信息。
Oracle Spatial 将现有的比较常见的地理坐标系和投影坐标系的相关信息都定义到SDO_COORD_REF_SYSTEM 表,且表中存储SDO_SRID 属性数值的SRID 具有唯一性。通过查询此表可以获得Oracle Spatial 坐标系的SDO_SRID 的值,Geodatabase 也可以通过数据框属性中的坐标系获得WKID 的值,将查询结果进行对比得到表2和表3。
4.2.1 地理坐标系的语义转换
以中国常用的地理坐标系为例查询和对比WKID 和SDO_SRID 的值得到表2,通过表2可知,这些地理坐标系的WKID 值和Oracle Spatial 的SDO_SRID 有一定的关系但不是完全相等对应关系,而和Oracle Spatial 存储空间参考信息的表中SOURCE_GEOG_SRID(下面简称S_SRID)列的值是对应相等的。所以地理坐标系的语义转换,可以根据Geodatabase 的WKID 和Oracle Spatial 空间参考表中的S_SRID 列实现。
表2 常用地理坐标系的WKID 和SDO_SRID 的值
中国常用的投影坐标系一般是在地理坐标系的基础上经过高斯-克吕格投影按照不同的分带方式投影得到的。不同地区不同经纬度下的投影坐标系不尽相同,所以同一地理坐标系下的投影坐标系种类相对较多。本文对中国常用的地理坐标系下对应的投影坐标系随机抽取几个相对应的WKID 值并与Oracle Spatial的SDO_Srid的值进行对比得到如表3所示,通过表3发现,投影坐标系的WKID 的值与Oracle Spatial 的SDO_SRID 的值是对应相等的关系,所以投影坐标系可以通过WKID 和SDO_SRID 的值实现Oracle Spatial 向Geodatabased 的空间坐标系映射转换。
表3 常用投影坐标系的WKID 和SDO_SRID 的值
4.2.3 自定义坐标系的语义转换
Oracle Spatial 和Geodatabase 的空间坐标系大多都是基于EPSG 维护和发布的空间坐标参数数据集。基于EPSG 标准的空间坐标系虽然可以满足基本用户的使用,但对于一些特殊的情况往往需要创建自定义坐标系。关于自定义坐标系Oracle Spatial 和Geodatabase 对于空间参考的描述不仅相同,但它们的坐标系的都是基于WKT 的,所以可以以WKT 为桥梁,实现Oracle Spatial 和Geodatabase 自定义坐标系的语义转换。
Oracle Spatial 于非空间数据类型和Oracle 数据库的类型一样。Oracle 支持的基本数据类型一般有字符串类型(CHAR,VarChar2),数值类型(NUMBER)、日期类型(Date,TimeStamp)和LOB 类型(用于存储大数据)。Geodatabase是通过字段存储属性数据和空间数据的,字段的数据类型使用枚举类型esriFieldType 表示。将Oracle 的基本数据类型与Geodatabase 的枚举类型esriFieldType 进行对比得到如表4所示,通过此表可以知道Geodatabase 的字段数据类型与Oracle基本数据类型的对应关系,并实现Geodatabase 与Oracle 的字段类型语义转换。
表4 Geodatabase 字段类型与Oracle 基本数据类型对照表
以某地区的地籍权属数据为例,结合ArcGIS Engine 的二次开发技术,开发地籍增量更新模型系统,并利用Oracle Spatial 和Geodatabase 的语义映射转换模型实现地籍增量过程中的地籍权属数据的入库和加载。模型系统的主界面如图4所示。
图4 程序主界面
地籍权属数据一般是一种属性数据与空间数据分离的CAD 数据,本次实验中所用到的地籍权属数据时DGN 格式的矢量权属数据,可以通过FME 数据转换技术将DGN 格式的权属数据转换为属性空间一体化的Shape file 格式的数据,并通过Oracle Spatial 与Geodatabase 语义映射转换模型将地籍权属数据导入到Oracle Spatial 空间数据库中。地籍增量过程一般分宗地新增、宗地合并、宗地灭失、宗地分割和宗地公共边界调整五种变更方式。每一种的变更过程中都会涉及到地籍权属数据的入库和加载,通过Oracle Spatial 和Geodatabase 语义映射转换模型能够直接操作Oracle Spatial 中不同时间段的地籍权属数据实现地籍增量更新过程。通过本次实验可以表明该模型能够实现点、线、面Shape file 格式的地籍权属数据向Oracle Spatial 空间数据库的入库与加载。