三维矢量GIS数据模型的建立
一、引 言
到目前为止,三维GIS一直处于理论研究阶段,虽然有三维GIS系统问世,但其功能远远不能满足人们分析问题的需要,原因主要是三维GIS理论不成熟,其拓扑关系模型一直没有解决,另外三维基础上的数据量十分大,很难建立一个有效的,易于编程实现的三维模型。采用什么样的数据模型对GIS空间拓扑关系的建立以及空间分析与操作至关重要。随着在许多行业诸如煤炭、地质、石油、矿山、城市地下管网、城市空间规划等对三维GIS的需求日益迫切,三维GIS数据模型理论近来受到许多学者的关注,在八叉树与三维边界表示法基础上提出了如基于八叉树与TIN的混合结构[1]、八叉树与TEN的混合结构[2]、面向对象的矢量与栅格一体化结构[3]以及其他结构[4],尽管这些结构在理论上有很大的进展,但实现较困难,也难以与已有的二维GIS兼容。基于八叉树结构的缺点在于指针占用存贮空间大,重编码费时长且精度低,不宜于表示线面对象。而三维GIS中的矢量与栅格一体化在目前实现有相当的困难,且目前所提出的模型的可行性有待检验。三维GIS要比二维GIS复杂得多,如果GIS中拓扑空间基本元素分为点、线、面,那么在二维空间的GIS中,GIS的主要元素点、线、面同处于一个平面上,点的第三维坐标(高程)作为一个属性值输入,且一个面的描述只用其周边即可确定。而在三维GIS中,面元素不再只是平面,而可能是极不规则的空间曲面。描述一个面元素不能再只用其边线。面的生成与描述要用较复杂的方法,如用TIN、TEN或分块Bezier曲面、分块B样条曲面合成的方法(后两种算法适合于大面积较规则的曲面)。因而一个能直观、全面、清晰地表达三维GIS中复杂的拓扑关系,并能简捷地完成三维GIS空间数据分析和操作的数据模型成了人们研究探讨的核心。这里笔者针对三维GIS拓扑空间的复杂性,提出一种面向对象的三维GIS空间矢量网状数据模型,它以链表作为基本结构,把点、线、面、体看作是三维GIS的基本元素,以每个元素为对象设计数据结构。这种结构由面向对象的二维GIS发展而来,符合人们处理GIS基本元素对象的习惯,能较直观自然地表达三维GIS中各个对象间的拓扑关系,由面向对象的二维GIS系统向面向对象的三维GIS过渡也较易实现。
二、面向对象三维矢量GIS数据结构
按面向对象程序设计的风格,对每一个基本元素定义一个类,拓扑关系包含在类的成员变量及成员函数中。这样程序设计中只针对每个元素,运用其成员变量,编写其成员函数,程序通过调用其成员函数即可实现拓扑关系的自动建立。用Visual C++可写出三维矢量GIS数据模型如下:
class CBasePoint //定义A基础点元素类
{
struct point{ float x;//X坐标 浮点型32位
float y;//Y坐标 浮点型32位
float z;//Z坐标 浮点型32位
}point-element;//定义点类的坐标结构
……其他成员变量及成员函数。 };
class CorPoint:CBasePoint //定义坐标点元素类,由基础点元素派生
{
Cpoly m-poly;//定义一个面元素变量标识该点的归属,用来在输入点后生成面
……其他成员变量及成员函数。 };
class CnodPoint:CBasePoint //定义结点元素类,由基础点元素派生
{
LINELIST m-lines;// 定义一个线表用来管理以该点为结点的线元素
……其他成员变量及成员函数。 };
class CBaseLine // 定义基础线元素类
{
POINTLIST m-points;//定义一个表结构用来管理构成线元素的所有点元素。
POINTLIST m-nodPoints;//定义一个表结构用来管理该线元素的结点;
……其他成员变量及成员函数。};
class CnodLine: CBaseLine //定义结线元素类,由基础线类派生
{
POLYLIST m-poly;//定义一个表结构用来管理以该线作为邻边的面元素。
……其他成员变量及成员函数。};
class Cpoly ///定义面元素类
{
LINELIST m-lineList;//定义一个表结构用来管理构成该面元素的所有线元素。
LINELIST m-lineList2;//定义一个表结构用来管理该面元素的所有边线元素。
LINELIST m-nodLineList;//定义一个表结构用来管理该面元素的所有结线。
POINTLIST m-pointList;//定义一个表结构管理用来生成该面元素的所有点元素。
FORMLIST m-forms;//定义一个表结构用来管理以该面元素为邻面的体。
……其他成员变量及成员函数。};
class Cform ///定义体元素类
{
POLYLIST m-polyList;//定义一个表结构用来管理构成该形体的所有面元素。
POLYLIST m-nodPolyList;//定义一个表结构用来管理该形体的所有公用面元素。
TREELIST m-WeightPoint; //定义一个树形结构用来管理不均匀体中的插值点;
……其他成员变量及成员函数。};
以上表结构用来保存指针,通过表结构中的这种指针来表达空间拓扑关系。
从上面的定义可以看出,每个基本元素类中包含了构成它的基本元素,也包含了由它构成的更高一级的元素。很显然上面所描述的是一个具有网状关系的数据模型。
“构成”是指上一级元素由下一级元素组成,“结线”是指多个面以此线为公共交线,“公共面”是指相邻两个体元素以此面作为公用面。“按算法生成”是指在许多情况下,一个曲面由输入的线生成比较困难,而由点如用TEN(四面体格网)进行构造生成一个曲面。“插值”是对不均匀体按已有点进行插值用来表达不均匀体的空间特性,这些点按相邻关系连接组成一个空间树形。
三、拓扑关系的构造及生成原理
上面所给出的数据结构中,反映出的基本拓扑关系如下:
点线关系(点为线结点,线由点构成);点面关系(面由点通过算法生成,面包含点);线面关系(面由线拟合生成,线为面的结线);面体关系(体由面构成,面为多体公用面)。隐含的关系有:线与线关系(多线共用结点——相交);面与面关系(多面共用结线——相交);体与体关系(多体相邻或包含)。
这些关系基本上能全面反映已有的空间拓扑关系,由于以点、线、面、体基本对象构建,故适合于面向对象的空间操作与分析。按上面数据模型有如下拓扑关系自动构建过程,(以输入数据为例,基本元素通过指针操作而非普通变量):
到目前为止按矢量的方式,人们输图时是以点为基本元素输入的,因而在建立拓扑关系之前,已有的基本元素只有点,所以拓扑关系的自动建立由点元素开始(在这里仍然沿用图层的概念,同一类元素看作一层,并以层来管理同一类元素)。
1.点的输入
每输入一个点,如属于某个面,按坐标点类处理并在其关系表中加入特征值或编码值,也可以是预先给定的面的编号,如属于某条线则进行线的生成。
2.线的生成
加入一个新点,将此点加入到线的点表中,起点和终点作为结点加入到线的结点表中。
3.线线关系的建立
每生成一个新线,与已有的所有可能相交的线进行求交计算:交点作为结点加入到有关线的结点表中,新线也加入到有关结点类元素的线表中。
4.面的生成
对于规则的面(如平面)按二维处理。对于不规则的面,由一系列点按一定算法生成(用分块B样条曲面合成法或分块Bezier曲面合成法,也可以用多曲线拟合法(适于直接由二维GIS中已有的等值线构造曲面)),生成后的曲面再进行填充、光照效果等处理后即可用来较真实地反映三维GIS中曲面实体。
5. 线面关系的建立
显然通过面的生成,如果线在一个面内,线面关系已经存在;当一条线不属于某一个面时则要进行线面关系的处理。经过复杂的计算可以确立如相交、相离等关系。对这种复杂关系使用相应的成员函数动态地建立相应的关系表(对已有的拓扑关系进行进一步完善)。
6.面面关系的建立
确立面面关系,主要是进行面面求交计算,得到新面与结线。在结线的面表中加入有关面元,在面元的结线表中加入有关线,这样进一步确立了线面关系,也得到了面面关系。
7. 体的生成
类似于二维中面的生成,按算法搜索闭合空间即构成一个体元。体元生成后体与面的关系也已经存在。这时可以进行体与体之间的拓扑关系(如包含关系)的生成。这里体的搜索按空体进行,对于实体用填充方法由空体得到。
四、空间数据库的建立
上面给出的结构似乎存在大量数据冗余,但实际上数据的存贮几乎不存在冗余。这是由图2所给出的存贮过程决定的(以一个体元的存贮过程为例说明)。
很明显,这里建立的是一个网络数据库,一般网络数据库模型是用连接指令或指针来确定数据间的显式连接关系的,因而数据间关系复杂时指针部分会占大量存贮空间。这是网状数据库的最大缺点。在本结构中在数据量不大时将32位指针以16位整数编号代替,可得到改善。事实上在关系数据库中,关系表中都要建立记录号,许多时候还要人为地加以编号,同样占用大量的存贮空间,另外关系表本身难以表达完整的拓扑空间关系。在进行空间查询时,在网状数据库中可以不进行操作运算,其存贮结构可以使查找从任一元素节点开始,存在唯一路径,并以另一元素节点结束。
图3为调查某林地地下水测得的含水层位置图,由三个体元构成。按本文提出模型有表1、表2所示的存贮关系(限于篇幅不列出线元素及点元素)。
五、结束语
本文提出的数据模型可以清楚地描述三维GIS复杂的空间拓扑关系,该模型不再对三维GIS中的元素进行维数划分,而以其类型划分。在拓扑关系建立中均匀实体看作空体处理,不均匀实体看作是空体的填充,并以一个点树来表达其不均匀性,这一点沿用二维GIS中多边形填充的思想。这样在以此数据模型构建的系统中GIS的基本元素就有点、线、面、体四种,数据的空间操作与分析以这些基本元素为单元进行,易于编程实现,且能较好地与已有面向对象的二维GIS兼容。在空间数据的存贮中也以这些基本元素为对象进行存贮,避免了数据的大量冗余。构建的网络数据库结构,很直观地保存了空间拓扑关系,便于查询与空间分析等操作。另外以面向对象的模型构建的系统本身具有良好的可持续发展性