Object开发入门

最后更新时间:2020年12月25日

3.2.1 三维可视化入门范例实现

3.2.1.1 创建.NET工程

启动Micorsoft Visual Studio 2015(以下简称VS2015),选择新建项目,在项目类型中选择程序语言为C#,在模板中选择Windows应用程序,输入项目名称ShowScene3D,修改项目路径。

新建项目界面

图 3-14 新建项目界面

3.2.1.2 引入开发库

为项目添加必要的MapGIS程序集引用,这里需引用MapGIS.GeoMap.dll、MapGIS.SceneControl.dll等;引用方法步骤:右击解决方案下“ShowScene3D”下的“引用”选项卡,弹出以下窗口:

添加MapGIS组件界面图

图 3-15 添加MapGIS组件界面图

切换到“浏览”选项卡,从MapGIS平台安装后的Program文件夹下找到以上程序集,单击确定,实现程序集引用后如下所示:

添加MapGIS程序集图

图 3-16 添加MapGIS程序集图

3.2.1.3 加载场景控件

(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);

加载场景控件效果图

图 3-17 加载场景控件效果图

本示例功能还需拖入“MenuStrip”工具到设计界面,添加如图 3-17加载场景控件效果图所示的一级菜单项。

3.2.2 浏览场景

3.2.2.1 变量定义及命名空间引用

打开Form1的代码界面,添加如下命名空间引用的代码:

程序代码 3.4 命名空间引用代码

    using MapGIS.GeoMap;
    using MapGIS.Scene3D;

以及在类中添加变量定义的代码:

程序代码 3.5变量定义关键代码

    //地图文档对象
    Document doc = null;
    //地图对象
    Map map = null;
    //场景对象
    Scene scene = null;

3.2.2.2 打开场景地图文档功能

实现打开地图文档功能,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-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-19 二维矢量数据示意图

添加二维矢量数据,此处只是显示已经添加的二维矢量图层,效果如上图所示。

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-20 量算工具示意图

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;            
        }

运行之后,当场景正处于平面模式时,会转换成球面模式进行显示,效果如下图:

平面场景显示模式

图 3-21 平面场景显示模式

球面场景显示模式

图 3-22 球面场景显示模式