最后更新时间:2020年12月25日
3.2.1 三维可视化入门范例实现
启动Micorsoft Visual Studio 2015(以下简称VS2015),选择新建项目,在项目类型中选择程序语言为C#,在模板中选择Windows应用程序,输入项目名称ShowScene3D,修改项目路径。
为项目添加必要的MapGIS程序集引用,这里需引用MapGIS.GeoMap.dll、MapGIS.SceneControl.dll等;引用方法步骤:右击解决方案下“ShowScene3D”下的“引用”选项卡,弹出以下窗口:
切换到“浏览”选项卡,从MapGIS平台安装后的Program文件夹下找到以上程序集,单击确定,实现程序集引用后如下所示:
(1) 三维场景显示控件由程序集“MapGIS.SceneControl.dll”提供,三维场景显示控件的类名为SceneControl,在窗体加载事件里,实现加载三维场景显示控件;
程序代码 3.1 命名空间引用代码
using MapGIS.GeoMap; using MapGIS.Scene3D;
以及在类中添加变量定义的代码:
程序代码 3.2变量定义关键代码
//定义三维场景显示控件 SceneControl sceneCtrl = null;
程序代码 3.3 程序代码添加三维场景显示控件代码
//实例化三维场景显示控件 sceneCtrl = new SceneControl(); //设置控件显示模式 sceneCtrl.Dock = DockStyle.Fill; //添加显示控件到窗体中 this.panel1.Controls.Add(sceneCtrl);
本示例功能还需拖入“MenuStrip”工具到设计界面,添加如图 3-17加载场景控件效果图所示的一级菜单项。
3.2.2 浏览场景
打开Form1的代码界面,添加如下命名空间引用的代码:
程序代码 3.4 命名空间引用代码
using MapGIS.GeoMap; using MapGIS.Scene3D;
以及在类中添加变量定义的代码:
程序代码 3.5变量定义关键代码
//地图文档对象 Document doc = null; //地图对象 Map map = null; //场景对象 Scene scene = null;
实现打开地图文档功能,Form1视图设计窗口,添加功能菜单“浏览场景”,并为该菜单项注册单击事件处理函数;双击该“浏览场景”菜单项即可自动实现单击事件处理函数的添加,程序自动跳转到相应代码界面;在已添加的单击事件处理函数里具体添加如下代码:
程序代码 3.6 消息处理关键代码
private void 浏览场景ToolStripMenuItem_Click(object sender, EventArgs e) { //打开地图文档 doc = new Document(); if (doc.Open(@"D:\MapGIS 10\Sample\三维模型图.mapx") > 0) { //获取第一个场景 scene = doc.GetScenes().GetScene(0); if(scene!=null) { //获取第一个场景的显示模式 this.sceneCtrl.Mode = doc.GetScenes().GetScene(0).Mode; //添加场景到场景控件中 this.sceneCtrl.Append(scene); //复位窗口 this.sceneCtrl.Reset(); } } else { MessageBox.Show("地图文档打开失败!"); } }
打开场景地图文档效果图 3-18 打开场景地图文档示意图所示:
3.2.3 加载二维数据
二维数据主要包括矢量、瓦片、影像等数据,本小节主要讲述在场景控件中加载并显示二维矢量数据的功能。在Form1的菜单栏中添加“添加二维数据”菜单并添加其消息响应事件,在消息响应事件完成该功能,具体代码如下:
程序代码 3.7加载二维数据关键代码
private void 添加二维数据ToolStripMenuItem_Click(object sender, EventArgs e) { //矢量三维图层对象 Vector3DLayer layer = new Vector3DLayer(); //设置矢量图层数据Url layer.URL = "gdbp://MapGisLocal/示例数据/ds/三维示例/sfcls/景观_建筑物"; //设置图层显示名称 layer.Name = "矢量数据"; //设置图层状态 layer.State = LayerState.Visible; //取场景控件中处于激活状态的场景 Scene activeScene = this.sceneCtrl.GetScene(0); //设置场景显示模式为平面模式 this.sceneCtrl.Mode = MapGIS.Scene3D.SceneMode.LOCAL; if (activeScene != null) { //添加图层到场景对象中 int id = activeScene.Append(layer); this.sceneCtrl.UpdateScene(activeScene, id, LayerOperType.SetLayerAppend); } else { activeScene = new Scene(); activeScene.Append(layer); this.sceneCtrl.Append(activeScene); } }
添加二维矢量数据,此处只是显示已经添加的二维矢量图层,效果如上图所示。
3.2.4 三维量算
三维量算功能的前提是场景中必须包含地形数据,在执行距离量算操作前需首先添加地形数据到场景中。实现距离量算的功能,其实现步骤如下:
(1) 在Form1的菜单栏中添加“距离量算”菜单并添加其消息响应事件,在消息响应事件完成该功能,具体代码如下:
程序代码 3.8三维量算关键代码
private void 距离量算ToolStripMenuItem_Click(object sender, EventArgs e) { //启动量算工具 LengthMeasureTool lengthTool = new LengthMeasureTool(this.sceneCtrl); lengthTool.SetMeasureType(LengthMeasureType.Surface_Length,6); lengthTool.Start(); }
(2) 调试并编译工程,运行工程。
(3) 首先点击“浏览场景”菜单,按下键盘的“Z”键后,“中国地形图”添加在场景中。
(4) 点击“距离量算”菜单项,在地形表面绘制,同步显示距离量算结果,效果如图 3.13所示。
3.2.5 切换模式
三维场景包含球面模式与平面模式,可根据应用决定选择哪种模式显示。球面模式要求所有加载的数据都必须是经纬度坐标,球面模式监测范围为全球,当球面模式放大在很大时,类似于平面模式;而平面模式对数据没有特殊要求,几乎所有坐标系的数据都可以显示在平面模式下。
在前述小节中已经介绍,可直接在加载数据时,根据数据的特性,设置场景的显示模式。本小节主要实现平面模式与球面模式的切换操作。
在实现模式切换前,需先加载场景,本示例在前述章节的基础上实现。在Form1的菜单栏中添加“切换模式”菜单并添加其消息响应事件,在消息响应事件完成该功能,具体代码如程序代码 3.9所示:
程序代码 3.9切换模式关键代码
private void 切换模式ToolStripMenuItem_Click(object sender, EventArgs e) {//切换场景模式 if (this.sceneCtrl.Mode == SceneMode.LOCAL) this.sceneCtrl.Mode = SceneMode.GLOBE; else this.sceneCtrl.Mode = SceneMode.LOCAL; }
运行之后,当场景正处于平面模式时,会转换成球面模式进行显示,效果如下图: