面向对象的三维矢量GIS 数据模型及拓扑关系的建立
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
面向对象的三维矢量GIS数据模型及
拓扑关系的建立
孙敏①唐小明②赵仁亮①
(①中南工业大学资环建院410083)
(②中国林业科学院资源信息所100091)
【摘要】本文针对三维GIS拓扑空间关系的复杂性,提出了以表为基本单元的面向对象的数据模型,这种数据模型能表达网状的空间拓扑关系,较直观地反映了三维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位
element;//定义点类的坐标结构
}point
-
……其他成员变量及成员函数。};
class CorPoint:CBasePoint //定义坐标点元素类,由基础点元素派生
{
poly;//定义一个面元素变量标识该点的归属,用来Cpoly m
-
在输入点后生成面
……其他成员变量及成员函数。};
class CnodPoint:CBasePoint //定义结点元素类,由基础点元素派生
{
lines;// 定义一个线表用来管理以该点为结点LINELIST m
-
的线元素
……其他成员变量及成员函数。};
class CBaseLine // 定义基础线元素类
{
points;//定义一个表结构用来管理构成线元素的POINTLIST m
-
所有点元素。
POINTLIST m
nodPoints;//定义一个表结构用来管理该线元素
-
的结点;
……其他成员变量及成员函数。};
class CnodLine: CBaseLine //定义结线元素类,由基础线类派生{
poly;//定义一个表结构用来管理以该线作为邻边POLYLIST m
-
的面元素。
……其他成员变量及成员函数。};
class Cpoly ///定义面元素类
{
LINELIST m
lineList;//定义一个表结构用来管理构成该面元素
-
的所有线元素。
LINELIST m
lineList2;//定义一个表结构用来管理该面元素的所
-
有边线元素。
nodLineList;//定义一个表结构用来管理该面元素的LINELIST m
-
所有结线。
POINTLIST m
pointList;//定义一个表结构管理用来生成该面元
-
素的所有点元素。
forms;//定义一个表结构用来管理以该面元素为邻面FORMLIST m
-
的体。
……其他成员变量及成员函数。};
class Cform ///定义体元素类
{
POLYLIST m
polyList;//定义一个表结构用来管理构成该形体的
-
所有面元素。
nodPolyList;//定义一个表结构用来管理该形体的所POLYLIST m
-
有公用面元素。
WeightPoint; //定义一个树形结构用来管理不均匀TREELIST m
-
体中的插值点;
……其他成员变量及成员函数。};
以上表结构用来保存指针,通过表结构中的这种指针来表达空间拓扑关系。
从上面的定义可以看出,每个基本元素类中包含了构成它的基本元素,也包含了由它构成的更高一级的元素。很显然上面所描述的是一个具有网状关系的数据模型,如图1所示。
图 1
“构成”是指上一级元素由下一级元素组成,“结线”是指多个面以此线为公共交线,“公共面”是指相邻两个体元素以此面作为公用面。“按算法生成”是指在许多情况下,一个曲面由输入的线生成比较困难,而由点如用TEN(四面体格网)进行构造生成一个曲面。“插值”是对不均匀体按已有点进行插值用来表达不均匀体的空间特性,这些点按相邻关系连接组成一个空间树形。
三、拓扑关系的构造及生成原理
上面所给出的数据结构中,反映出的基本拓扑关系如下:
点线关系(点为线结点,线由点构成);点面关系(面由点通过算法生成,面包含点);线面关系(面由线拟合生成,线为面的结线);面体关系