资源描述
1 引言地球表面高低起伏,呈现一种连续变化的曲面,这种曲面无法用平面地图来确切表示。于是我们就利用一种全新的数字地球表面的方法数字高程模型的方法,这种方法已经被普遍广泛采用。数字高程模型即DEM(Digital Elevation Model),是以数字形式按一定结构组织在一起,表示实际地形特征空间分布的模型,也是地形形状大小和起伏的数字描述。由于地理信息系统的普及,DEM作为数字地形模拟的重要成果已经成为国家空间数据基础设施(NSDI)的基本内容之一,并被纳入数字化空间框架(DGDF)进行规模化生产,已经成为独立的标准基础产品5。DEM有三种主要的表示模型:规则格网模型,等高线模型和不规则三角网。格网(即GRID)DEM在地形平坦的地方,存在大量的数据冗余,在不改变格网大小情况下,难以表达复杂地形的突变现象,在某些计算,如通视问题,过分强调网格的轴方向。不规则三角网(简称TIN,即Triangulated Irregular Network)是另外一种表示数字高程模型的的方法(Peuker等,1978),它既减少了规则格网带来的数据冗余,同时在计算(如坡度)效率方面又优于纯粹基于等高线的方法。不规则三角网能随地形起伏变化的复杂性而改变采样点的密度和决定采样点的位置,因而它能够避免地形起伏平坦时的数据冗余,又能按地形特征点如山脊,山谷线,地形变化线等表示数字高程特征。基于三角形的表面建模可适合所有的数据结构,且三角形在形状和大小方面有很大灵活性,能很容易地融合断裂线,生成线或其他任何数据,因此基于三角形的方法在地形表面建模中得到了越来越多的注意,已经成为表面建模的主要方法之一。VB语言简洁易学,对于学习GIS的学生来说无疑是接受很容易而且较快的一门计算机编程和开发语言,也是大多数学生最熟悉和了解的语言。正是基于对生成不规则三角网算法的研究和满足学GIS的学生对VB语言的喜爱和熟悉的情况下,本文就主要介绍用三角网生长算法生成不规则三角网及其在VB6.0环境下的实现。2 TIN的算法种类及各算法特点在介绍构成TIN各种算法之前我们要来了解认识一下一个重要法则Delaunay三角网法则。通常构建三角网并不考虑地性线(山脊线,山谷线)的骨架作用,但是,由于用等高线数据构建三角网时,由于地形的复杂多样,有的地区存在因地形突变而形成的断裂线等特殊地貌。另外一些地区存在大面积水域等内部不需要构网的区域,因此,在精度要求较高的TIN中,必须考虑以上问题。因此此时应顾及地性线,断裂线,水域线等特殊情况,也就是应构建约束Delaunay三角网。约束法是基于约束图计算约束D三角剖分1,9(简称CDT,即Constrained Delaunay Triangulation)构造算法8,这种Delaunay三角网满足这样的法则:Delaunay三角网为相互邻接且互不重叠的三角形的集合,每一个三角形的外接圆内不包含其他点。Delaunay三角网由对应Voronoi多边形的点连接而成。Delaunay三角形有三个相邻点连接而成,这三个相邻顶点对应的Voronoi多边形有一个公共的顶点,此顶点是Delaunay三角形外接圆的圆心(如图1)。根据构建三角网的步骤,可将三角网生成算法分为三类:(1)分而治之算法(由Shmaos和Hoey提出),其基本思路是使问题简化,把点集划分到足够小,使其易于生成三角网,然后把子集中的三角网合并生成最终的三角网,用局部优化(LOP,即Local Optimization Procedure)算法保证其成为Delaunay三角网3,它的优点是时间效率高,但需要大量递归运算,因此占用内存空间较多,如果计算机没有足够的内存,这一方法就无法使用2;(2)数据点渐次插入算法(由Lawson提出),其思路很简单,先在包含所有数据点的一个多边形中建立初始三角网,然后将余下的点逐一插入,用LOP算法保证其成为Delaunay三角网3。此算法虽然容易实现,但效率极低;(3)三角网生长算法,在这三种算法中,三角网生长算法在80年代以后的文献中已很少见,较多的是前两种算法3,三角网生长算法目前较少人研究,笔者在这里讨论的就是这一算法,该算法是由Michael J.McCullagh,Charles G.Ross提出的,本文对原有的三角网生长算法作了进一步优化。2.1 三角网生长算法步骤:(过程如图2)(1) 在所采集的离散点中任意找一点,然后查找距此点最近的点,连接后作为初始基线。(2) 在初始基线右侧运用Delaunay法则搜寻第三点,具体的做法是:在初始基线右侧的离散点中查找距此基线距离最短的点,做为第三点。(3) 生成Delaunay三角形,再以三角形的两条新边(从基线起始点到第三点以及第三点到基线终止点)作为新的基线。(4) 重复步骤(2),(3)直至所有的基线处理完毕。也有人称此算法为“炸弹法”。 图1 delaunay三角形与Voronoi多边形偶图 图2 三角网生长算法过程2.1 在VB环境中的数据结构为了对离散数据进行有效管理,作者在构建TIN时采用的数据结构为点结构,边(或线)结构,三角形(或面)结构。数据结构定义如下(图3是对应于图4的不规则三角网的表示方法6):(1)类模块a.三角形数据结构Triangle(Triangle.cls)Public pnt1 As New POINT 三顶点Public pnt2 As New POINTPublic pnt3 As New POINTPublic NO As Long 三角形编号Public triNO1, triNO2, triNO3 As Long 三角形的相邻三角形号Public EdgeNO1, EdgeNO2, EdgeNO3As Long 三角形的三条边号b.点的数据结构Point(Point.cls)Public x As DoublePublic y As DoublePublic z As DoublePublic pntNO As Long 顶点编号c.边的数据结构Edge(Edge.cls)Public eS As Point 边的起点Public eE As Point 边的终点Public LTriNO As Long 边的左三角形编号Public RTriNO As Long 边的左三角形编号(2) 模块a. 三角形数组和点数组,三角形记数和点记数Modulel(Modulel.bas)Public triArray As New Collection 三角形集合Public pntArray As New Collection 点的集合Public edgeArray As New Collection 边的集合Public nCount As Long 点个数Public eCount As Long 边个数Public triCount As Long 三角形个数b. 存放窗体函数中的调用函数mathCal(mathCal.bas)Function TwoPntDistance(ByVal p1 As POINT, ByVal p2 As POINT) As Double 计算两点之间的距离Function MinDistancePnt(ByVal p As POINT) As POINT 找与已知点最短距离的点Function MaxAnglePnt(ByVal e as Edge) As POINT 找距与已知的基线两端点组成夹角最大的点图 3 TIN的数据结构 图 4 TIN的平面图形3 VB环境中此算法思想以及实现过程本文选用的方法是一种改进的生长算法,本算法和原始的生长算法比较,具有速度快等优点,主要是在Edge边数据结构中加入了边的使用次数,这样就没有必要对每个新生成的三角形的两条新边都向外扩展生长,有效地减少了扩展的边个数,从而提高了构网速度,本算法的详细如下。(1) 在离散数据点集V 中任取一点A ,以点A为基点寻找与它最近的一点B。连接AB ,就得到了三角形的一条基边,把该边作为扩展基边,转(2) 。(2) 在扩展基边(是有向的)的右边点集中去找与该边两端点连成直线组成的夹角为最大的P点,就组成了第一个三角形,将所有新生成的边与三角形信息用相应的链表进行存储起来,边每使用一次,其数据结构中的UseTimes就加1,转(3) 。(3) 在边链表中取出头位置的边,以该边为扩展基边向外进行扩展。如果该边的使用次数为2或是右边没有点,该边不进行扩展;否则,转( 2)进行扩展,同时存储新生成的边和三角形。转(4)。(4) 对边链表中下一位置的边进行扩展,实现过程同步骤(3) ,转(5)。(5) 重复步骤( 4) ,直至边链表中的所有边都进行了扩展,就结束构网。 为了对算法的稳定性及可行性进行检验,笔者在VB中实现了上述算法,并用一些实验数据点验证了上述算法,图5是原始的数据点,图6是用该算法实现TIN。应用以上算法原理,基于Visual Basic 6.0 编译环境及数据库相结合,高效地实现了海量数据的Delaunay 三角网构建,实验表明,此算法的执行效率较高,对计算机硬件配置的要求较低。图5 原始数据点 图6 原始数据点生成TIN4 数据的存储数据库管理由于我们构网所使用的点是我们事先所采样测量得到的点,且对于一个实际的项目应用来说,数据容量大,而如果是直接人为在窗体的坐标轴中输入数据的话,很难找准所给的采样点位置,因此就要将数据存储在数据库中,进行统一存储管理。本文中,作者是将数据库与VB连接起来,那么在VB中程序运行时可直接调用数据库中的数据。在现实的工程项目中,修路时要将某处的山地挖为平地,旅游园林公园等单位要在某些平坦的地方填方建造山林,采矿单位在地下挖方开采就形成了低洼或山体的峡谷等,形成了地形的复杂多变,那么就要在变化的区域进行点的重新测量采样,在构网时,有的地方要增加点,有的地方要删除点,有时我们还需要查询和编辑修改某个点的说明信息。那么这些都要依靠数据库的管理。当然,也可以将数据存储在文本文件中进行读取,关于从文件中读取数据,相信大家在平时的学习中都有所接触,这里不再赘述。本文空间数据的操作包括图形的显示,放大,缩小,漫游,编辑,拓扑建立,查询和分析。5 改进和提高数据放在数据库(内存)里,再从内存中读取数据,这比直接从硬盘上读取数据快的多,但是,若数据量很大,Windows就要频繁地在内存和硬盘之间交换数据,反而影响速度,这种方法对硬件的依赖很大,并未从根本上解决问题4,7。为了提高构网速度,要采用格网索引,即在寻找第三点时,减少搜寻时间。同时对于生成的三角网的显示和缩放具有优势。在这里的改进方式有文件格网索引和数据库格网索引。对格网索引有兴趣的话可参阅4,7。6结束语实现上述算法具有很强的现实意义。TIN的直接应用价值就是生成DEM,为DEM的生成在许多领域中打下基础。在土木工程中,如工程项目的填挖方计算,线路勘测设计,水利建设工程等的应用;TIN在GIS中得到了普遍使用,特别是在三维可视化方面受到格外关注,基于DEM的水文分析与GIS结合,DEM库,矢量库,影像库的三维一体化,DEM与数字地球等的应用。还有在摄影测量与遥感方面,气候分析和环境研究中的应用以及在地质和采矿工程,林业,地形学方面都有很强的应用。本文对不规则三角网生长算法实现的研究,利用了VB6.0强大的可视化用户界面及其编程语言的灵活性及简单易懂特点,基于各行业对于DEM的需要,从而开发出一种利用VB语言生成基于生长算法的不规则三角网,结合数据库强大的数据库存取,编辑,查询功能,共同实现离散点的管理和三角网的构成。此算法思想的实现和数据的存储结构具有可行性,稳定性,高效性,相信这一研究会有很大的现实作用及意义。
展开阅读全文