1.导入河道地形数据
(1)功能需求简述。由于大量的矢量化数据需要检查,在二维图形系统中不直观,提出了用三维可视化直观的手段来检查数据,就需要将二维河道地形数据生成三维河道地形,以便快速检查异常数据。
(2)设计思路(实现思路与流程)。将河道数据中参与DEM插值计算的数据作为离散点存放在xyz文件中,将河道等值线数据存放在con文件中,将边界存放在bod文件中。首先读取xyz文件中的离散点数据,对其进行三角剖分,给定DEM格网间隔,利用三角剖分的结果,插值计算出每个格网点上的高程z值,判断边界,边界以外的z值设为-99 999。生成DEM文件保存起来。然后给定一个256级的色表,根据DEM的z值不同,将DEM的颜色分成256级。在将河道等值线与DEM合并,将高程能被5整除的等值线设成红色,其余的线条设成白色。在三维场景中打开。流程图如图6-2所示。
(3)实现方法描述。调用IDL控件实现离散点的三角剖分和DEM的格网插值。
(4)功能实现结果。输入界面如图6-3所示。
输出结果如图6-4所示。
图6-2 河道数据导入流程
图6-3 导入河道数据输入界面
图6-4 导入河道数据输出结果
2.生成DEM
(1)功能需求简述。有些情况下,由于已经存在离散点文件xyz和边界文件bod,但没有等值线文件con。就可用此功能单独生成DEM,而不需要有等值线的存在。
(2)设计思路(实现思路与流程)。将参与DEM插值计算的离散点数据存放在xyz文件中,将边界存放在bod文件中。首先读取xyz文件中的离散点数据,对其进行三角剖分,给定DEM格网间隔,利用三角剖分的结果,插值计算出每个格网点上的高程z值,判断边界,边界以外的z值设为-99 999。生成NSDTF DEM文件并保存起来。流程图如图6-5所示。
图6-5 生成DEM流程图
(3)实现方法描述。调用IDL控件实现离散点的三角剖分和DEM的格网插值。
(4)功能实现结果。运行该功能后,出现如图6-6所示的对话框,选择正确的参数,按“确定”即可。
图6-6 生成DEM输入界面
(5)其他需要说明的情况。NSDTF-DEM的文件格式如表6-1所示。
文件头分两类数据:一类是基本的必须的数据,另一类是扩充的附加信息。附加部分可以省略。文件头的基本组成单元是项目,格式为“项目名:项目值”,每个项目单独占一行。文件头中各项目的内容逐条说明如下:
表6-1 NSDTF-DEM的文件格式
如果是DEM,数据体内容为每个格网的高程乘以放大倍率后的整数值;其他格网数据的数据体内容则是任意字符串,一般代表该格网的分类编码。格式分两种:压缩方法为0(不压缩)时采用每行十个格网值,写完为止的方式;压缩方法为1(游程编码)时,采用每行十对“格网值,整数”,写完为止的方式,此时整数表示游程长度。数据体中的总数值单元数由行数乘列数决定。
3.成批生成DEM
(1)功能需求简述。此功能是为了将整个长江河道数据按分块模式生成各块的DEM。DEM按金字塔模式分成三级。在飞行浏览时根据情况调用不同级别的DEM,在全景模式下,调用最粗的一级。在近景模式下,调用最精细的一级。这样既保证了速度,又保证了数据精度。
(2)设计思路(实现思路与流程)。首先选定目录和索引文件(ind,在二维平台中生成的),搜索该目录下的所有离散点数据xyz文件,逐个进行三角剖分,根据给定的DEM格网数和索引文件,计算出格网间隔,利用三角剖分的结果,插值计算出每个格网点上的高程z值,再寻找对应的边界,判断边界,边界以外的z值设为-99 999。这里会生成三级DEM,其中与xyz同名的DEM为最精细的一级,带_1的DEM格网数为给定DEM格网数的一半,带_2的DEM格网数为给定DEM格网数的三分之一,是最粗的一级。生成VirtuoZo DEM文件并保存起来。流程图如图6-3所示。
图6-7 成批生成DEM流程图
(3)实现方法描述。调用IDL控件实现离散点的三角剖分和DEM的格网插值。
(4)功能实现结果。运行该功能后,选择正确的参数,按“确定”即可。
(5)其他需要说明的情况。VirtuoZo DEM的文件格式如下:
第一行为:DEM的左下角坐标X、Y,DEM的旋转角度,X方向上间隔,Y方向上间隔,列数,行数,其余为格网上的z值。如:
4.删除物体
(1)功能需求简述。此功能是为了删除场景中一些物体对象,包括树木、注释、建筑物、DEM等。
(2)设计思路(实现思路与流程)。用鼠标在场景中选择要删除的对象,系统将在数据链表中找到并删除该对象。如果是链头,就将链头指针指向下一个节点。如果在链中间,就将上个节点的next指针指向选中节点的下一个节点。如果在链尾,直接删除,并将上个节点的next指针赋为null。
(3)功能实现结果。选择该功能后,用鼠标选中要删除的对象即可。
5.添加注释
(1)功能需求简述。此功能是为了在场景中添加一些注记,如河段名称、地点名称。
(2)设计思路(实现思路与流程)。由于在三维场景中不存在可以直接用的字体对象,为了实现在三维场景中显示字体,采用了纹理技术。首先构造hDC,然后用选择的字体和给定的字符串以及颜色,在hDC上显示该字符串。再将显示的内容生成hbmBitmap,并将该位图的背景设为透明。最后将此透明纹理贴在一个矩形框上,放在场景中相应的位置即可。
(3)功能实现结果。选择该功能后,弹出如图6-8所示的对话框。
运行结果如图6-9所示。
图6-8 添加注释的界面
图6-9 添加注释输出结果
6.添加树木
(1)功能需求简述。此功能是为了在三维场景中加一些树木对象以模拟逼真的现实世界。
(2)设计思路(实现思路与流程)。设计思路类似于添加注释。所不同的是位图已经存在,不用生成,只需要从文件里面读入并将该位图的黑色设为透明。最后将此透明纹理贴在一个矩形框上,放在场景中相应的位置即可。并且随视点的移动而转动,保证始终朝向观察者的眼睛。即平常所说的Billboard技术。
(3)功能实现结果。选择该功能后,弹出如图6-10所示的对话框。
图6-10 添加树木的界面
选定树木类型、树高、树宽后,运行结果如图6-11所示。
图6-11 添加树木的效果
7.开挖分析
(1)功能需求简述。在河道采沙过程中需要计算某地方泥沙的体积。开挖分析可以计算出给定边界内的泥沙的体积。
(2)设计思路(实现思路与流程)。采用垂向区域法来计算泥沙的体积。如图6-12所示,有效区域A表示用户关心的泥沙计算区域。设计面为工程开挖完成后的形态,原始DEM表示还未开挖的情况。垂向区域法充分利用了DEM的格网特点,根据DEM的网格将岩体离散成一个个小方柱,每个小方柱的高度根据该网格4个顶点的z值采用距离反比法来拟合,上下两个z值的差即为该小方柱的高度。将落在有效区域A里面的小方柱的体积累加起来,即为所有开挖的量。同样可以计算回填的量。这里要注意边界部分的处理,在边界处并非包含整个小方柱体。可以将网格和有效区域的边界同时投影到水平面,求出区域边界与各方格边的交点的x、y值,交点的z值用通过该交点的那条网格边的两点的z值线性内插得到。同样可以求得边界处这些非方柱体的体积。
图6-12 开挖分析设计思路示意图
(3)实现方法描述。采用距离反比法来拟合小方柱的高度。
z=(z1*1/d1+z2*1/d2+z3*1/d3+z4*1/d4)/(1/d1+1/d2+1/d3+1/d4) (6-1)
式中,z1、z2、z3、z3分别为方柱4个点的高程;d1、d2、d3、d4分别为小方柱的中心到4个点的平面距离。
(4)功能实现结果。选择该功能后,用鼠标在场景中输入一条边界或导入一条边界,系统自动计算出体积并弹出如图6-13所示的对话框显示结果。图形窗口中显示出开挖后的效果。开挖后的效果如图6-14所示。
图6-13 开挖分析的界面
图6-14 开挖分析的结果
8.测量分析(面积、距离)
(1)功能需求简述。有时需要在三维场景中量算一下某河段的长度或面积。此功能提供在三维可视化场景中直接量算功能。
(2)设计思路(实现思路与流程)。充分利用DEM格网,将每个网格分成两个三角形,求出该空间三角形的面积,累加这些小三角形的面积就为河道表面面积。投影到xoy平面上可以计算出投影面积。
(3)功能实现结果。选择该功能后,用鼠标在场景中输入一条边界或导入一条边界,系统自动计算出体积并弹出如图6-15所示的对话框显示结果。
图6-15 测量分析的计算结果
9.通视分析
(1)功能需求简述。有时需要在长江航道上布置灯塔等,需要选择合理的位置,以便能看到的范围更广。通视分析提供“可视域分析”和“两点通视”两种。通过“可视域分析”工具可以计算并显示三维场景中某一点的可视范围,并通过给定通视点的坐标和视点高度计算出可视面积和可视率,其结果可以三维可视表达。通过“两点通视”工具可以进行任意两点之间的通视性判定。
(2)设计思路(实现思路与流程)。“可视域分析”的原理充分利用DEM的格网。从该点向360°方向画射线,可以判断每条射线经过的DEM格网点,是否被该射线所经过前面的DEM格网点所遮挡。如果遮挡,标识为不可见;如果未遮挡,标识为可见。这样将DEM所有的点都遍历一次,就能求出该给定高度条件下的可视范围。
“两点通视”可以进行任意两点之间的通视性判定,其原理是用两点所经过的垂直平面对DEM进行剖面分析,然后判断该剖面线是否与该直线段相交。相交即不可见,反之,则可见。
(3)实现方法描述。“两点通视”利用了剖面分析。详见剖面分析章节。
(4)功能实现结果。选择“可视域分析”后,用鼠标在场景中定一点,系统弹出如图6-16所示的对话框显示结果,并在场景中显示可见区域。
图6-16 可视域分析的界面
可见区域效果如图6-17所示。
选择“两点通视”后,用鼠标在场景中指定多点,系统弹出如图6-18所示的对话框显示结果。
10.水淹分析(槽蓄量计算)
(1)功能需求简述。有时需要库区的库容量以及某河段的槽蓄量。根据数字高程模型(DEM)求取给定水位条件下的淹没区,可区分以下两种情形:①凡是高程值低于给定水位的点,皆计入淹没区;②考虑“流通”淹没的情形,即洪水只淹没它能流到的地方。
水淹分析提供“无源淹没”和“有源淹没”两种功能。
图6-17 可视域分析的效果图(www.xing528.com)
图6-18 两点通视的结果
(2)设计思路。无源淹没处理相对简单,只要DEM网格上的高程低于给定水位,都统计进来。而有源淹没需处理迂回连通问题,算法较为复杂。我们采用有源淹没算法中比较实用的种子蔓延算法——一种基于种子空间特征的扩散探测算法,其核心思想是将给定的种子点作为一个对象,并赋予特定的属性,然后在某一平面区域上沿4个(或8个)方向游动扩散,求取满足给定条件、符合数据采集分析精度且具有连通关联分布的点的集合。该集合给出的连续平面就是所要估算的淹没区范围,而满足水位条件,但与种子点不具备连通关联性的其他连续平面,将不能进入集合。其计算过程如图6-19所示。
图6-19 水淹分析流程图
(3)实现方法描述。有源淹没分析采用区域填充算法。区域填充指先将区域的一点赋予指定的颜色,然后将该颜色扩展到整个区域的过程。区域填充算法要求区域是连通的,因为只有在连通区域中,才可能将种子点的颜色扩展到区域内的其他点。区域可分为4向连通区域和8向连通区域:4向连通区域指的是从区域上一点出发,可通过4个方向,即上、下、左、右移动的组合,在不越出区域的前提下,到达区域内的任意像素;8向连通区域指的是从区域内每一像素出发,可通过8个方向,即上、下、左、右、左上、右上、左下、右下这8个方向的移动的组合来到达,如图6-20所示。
图6-20 种子填充算法示意图
区域填充的递归算法 以上讨论的多边形填充算法是按扫描线顺序进行的。种子填充算法假设在多边形内有一像素已知,由此出发利用连通性找到区域内的所有像素。
设(x,y)为内点表示的4向连通区域内的一点,oldcolor为区域的原色,要将整个区域填充为新的颜色newcolor。内点表示的4向连通区域的递归填充算法:
对于内点表示和边界表示的8向连通区域的填充,只要将上述相应代码中递归填充相邻的4个像素增加到递归填充8个像素即可。
区域填充的扫描线算法 区域填充的递归算法原理和程序都很简单,但由于多次递归,费时,费内存,效率不高。为了减少递归次数、提高效率,可以采用扫描线算法。算法的基本过程如下:当给定种子点(x,y)时,首先填充种子点所在扫描线上的位于给定区域的一个区段,然后确定与这一区段相连通的上、下两条扫描线上位于给定区域内的区段,并依次保存下来。反复这个过程,直到填充结束。
区域填充的扫描线算法可由下列4个步骤实现:①初始化:堆栈置空。将种子点(x,y)入栈。②出栈:若栈空则结束。否则取栈顶元素(x,y),以y作为当前扫描线。③填充并确定种子点所在区段:从种子点(x,y)出发,沿当前扫描线向左、右两个方向填充,直到边界。分别标记区段的左、右端点坐标为xl和xr。④确定新的种子点:在区间[xl,xr]中检查与当前扫描线y上、下相邻的两条扫描线上的像素。若存在非边界、未填充的像素,则把每一区间的最右像素作为种子点压入堆栈,返回第④步。
上述算法对于每一个待填充区段,只需压栈一次;而在递归算法中,每个像素都需要压栈。因此,扫描线填充算法提高了区域填充的效率。
(4)功能实现结果。选择有源分析功能并给定水位条件后,系统自动计算出洪水容量和淹没面积,如图6-21和图6-22所示。
图6-21 有源水淹分析界面
图6-22 有源水淹分析结果
11.坡度、坡向分析
(1)功能需求简述。在河道演变分析中,需要知道河道的坡度等数据。
(2)设计思路。坡度/坡向是一种描述地形表面特征的重要变量。基于规则DEM数据进行的坡度/坡向计算方法较多,其精度与计算效率各不相同,本项目将采用求解坡度的最佳方法——二次曲面拟合法,即采用3×3的窗口(表6-2)。每个窗口中心为一个高程点。点e的坡度/坡向的求解公式如下:
表6-2中,3×3的窗口求解坡度、坡向的计算公式:
表6-2 3×3的窗口9个高程点
aspect=slopesn/slopewe (6-3)
式中,slope为坡度;aspect为坡向;slopewe为X方向的坡度;s1opesn为Y方向上的坡度。关于slopewe和slopesn的计算,采用下述算法:
式中,cellsize为格网DEM的格网间隔。
(3)功能实现结果。选择该功能后,用鼠标在场景中点任意一点,即可知道该点的坡度、坡向,如图6-23所示。
图6-23 坡度、坡向计算结果
12.剖面分析
(1)功能需求简述。有时需要画出河道断面形状。剖面分析此功能提供直接在三维可视化场景中直接绘出任意断面的剖面图。
(2)设计思路。充分利用DEM格网,将每个网格分别与剖面线求交点,交点连成一条曲线就是河道地形的剖面线。计算各交点之间的距离,形成距离-高程的数据组,绘出距离-高程曲线。
(3)实现方法描述。具体实现方法:首先判断剖面线段所在DEM网格的起始网格和终止网格。先将剖面线段起始点放入交点列表,由于直线段与方格最多只有两个交点。而且,由于是从小向大循环,下个网格只有可能两条边与之相交,双重循环中,先循环X方向,所以每个网格只需要计算右边界和上边界。将交点保留在交点列表中。交点列表中点的顺序即剖面线段所交DEM网格的顺序,如图6-24所示。
图6-24 网格求交示意图
(4)功能实现结果。选择该功能后,用鼠标在场景中输入一条剖面线或导入一条剖面线,系统显示断面曲线,结果如图6-25所示。
图6-25 断面分析结果
13.路径漫游
(1)功能需求简述。在河道浏览过程中,需要按给定的路径进行浏览。
(2)设计思路(实现思路与流程)。通过路径编辑器(图6-26),让用户自己定义自己的飞行路径。将飞行路径保存起来,然后在飞行时用该路径的空间位置来改变相机的位置,从而实现按路径飞行。
首先需要编辑一条飞行路径,具体方法如下:
①“飞行漫游”下拉菜单中,选择“编辑飞行路径”,弹出如图6-26所示的窗口。
图6-26 路径编辑器
②鼠标左键在左侧图形显示区域内点取关键点形成飞行路线;系统将在对话框右侧记录各个关键点的序号,X、Y、Z地理坐标;设置对地面高度和飞行速度;“清空点集”即清除列表中已经记录的关键点信息;“保存点集”将设置的关键点存为一个kpt文件;“装载点集”可以选择一个已存在的kpt文件,装载后可做修改形成新的飞行路线;“保存路径”将当前飞行路径保存为*.pth文件。
路径设置完毕,保存路径为一个pth文件,然后“关闭”窗口,即完成飞行路径的编辑。在计算飞行路径中的高度时,利用DEM格网的高程值通过距离反比法来拟合。
(3)实现方法描述。采用距离反比法来拟合飞行高度。
z=(z1*1/d1+z2*1/d2+z3*1/d3+z4*1/d4)/(1/d1+1/d2+1/d3+1/d4) (6-5)
式中,z1、z2、z3、z4分别为DEM网格4个点的高程;d1、d2、d3、d4分别为该点到4个点的平面距离。
(4)功能实现结果。选择该功能后,场景将按给定的路径飞行,如图6-27所示。
图6-27 按路径飞行效果
14.键盘漫游
(1)功能需求简述。有时需要通过键盘实时控制漫游的姿态,以满足对局部河道进行全方位浏览的需求。
(2)设计思路。利用定时器消息,来实时监测键盘的状态,对不同的键响应不同的动作。
(3)功能实现结果。通过键盘实时控制飞行的位置、速度等。
15.录制电影
(1)功能需求简述。在飞行过程中,有时需要将飞行的过程录制下来,以便成果交流与共享。
(2)设计思路。在按路径飞行的过程中,将场景中的画面以AVI格式一帧一帧保存在硬盘上,飞一帧,写一帧。
(3)实现方法描述。采用Windows自带的Vfw32.lib,来存储AVI格式的文件。
(4)功能实现结果。生成AVI动画格式(图6-28)。
图6-28 AVI的播放
16.分幅漫游
(1)功能需求简述。为了实现对整个长江的实时漫游,要将整个长江地形分成多块多级DEM。DEM分块后就需要一种实时调度机制或功能。为此提出了分幅漫游。
(2)设计思路。DEM数据分块就是把整个区域的数字高程模型划分为若干个规则的块,以便于DEM数据的管理和实时绘制。通常块大小的选择取决于计算机硬件对图形处理的能力以及系统对显示性能的要求。为便于计算,块的边长通常取2n倍的格网间距,即包含2n+1个格网顶点,如33×33、65×65、129×129。具体块大小的选择则需要根据系统的硬件配置进行实验来确定。在飞行过程中,动态地装载相关的DEM块,删除远离视点的DEM块。在浏览时根据情况调用不同级别的DEM,在全景模式下,调用最粗的一级。在近景模式下,调用最精细的一级。这样既保证了速度,又保证了数据精度。
(3)实现方法描述。通过索引窗口打开在二维平台中生成的索引文件ind,在索引窗口中画出DEM分块的网格线。同时显示ind文件中的飞行路径。用户可以通过拉框的方式自由地选择感兴趣的区域,系统根据拉框的范围来装载在框框范围内的DEM块,同时根据拉框的大小来判断调用哪一级的DEM。原则是:小于1/2全局范围时,调用最精细的一级;大于1/2并小于2/3全局范围时,调用中间级;大于2/3全局范围时,调用最粗的一级。
在飞行时,保证始终装载飞行路径点周围的两倍网格宽度范围内的DEM块。也就是说,在内存中的DEM块为以当前点所在块为中心的5×5的网格。继续往前飞行时,增加新的DEM块,删除不在范围内的DEM块。如图6-29所示,E表示飞行路径的当前点。这样在飞行时,既保证视野范围内充满了数据,又保证了飞行速度。
图6-29 分块调度示意图
(4)功能实现结果。打开索引文件如图6-30所示。全流域浏览结果。
图6-30 分幅调度界面
实时飞行浏览效果如图6-31所示。
图6-31 分幅调度飞行效果
17.网络发布
(1)功能需求简述。所有三维河道数据都要通过B/S方式来浏览。就需要将三维数据发布到网上的功能。
图6-32 网络发布界面
(2)设计思路。为了实现B/S体系,就需要为浏览器做个插件。在浏览器打开带三维场景数据的网页时,自动装载该插件来打开该三维数据。由于是在Internet上传输数据,需要考虑网络带宽的问题。我们采用了zip压缩技术来将三维场景数据压缩后传输。到本地后再解压缩打开。
(3)实现方法描述。利用了第三方的zip文件的读写函数。
(4)功能实现结果。给定网络发布参数如图6-32所示。
实现结果如图6-33所示。
图6-33 网络发布效果
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。