`
rocye
  • 浏览: 119922 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

arcengine实现在SceneControl中画线

阅读更多

前两天好不容易搞好了Map与Scene的二三维联动,以为将二维中的线连动到三维中变成3D样式的管子很简单,又卡了。再一次狂乱的在Esri论坛上找答案,有这样的贴子提到如果用SceneControl加载一个sxd文件,然后在上面画线是可以的,便是如何才能让加载shp文件的SceneControl也能画线呢,有很多人都碰到过这个问题。上面有一个贴子结贴后最佳答案是这样说的:

直接 IGraphicsContainer3D gc3d = new GraphicsLayer3DClass(); 在gc3d上画就OK了。

 

但是说实话,对于新手的我,我真不知道看了这句话,我应该么样去改我的代码。下面贴出摘自网上的一段在SceneControl控件上监听mouseDown事件连续画线的代码,我在这上面纠结了很久。

 

 

private void axSceneControl1_OnMouseDown(object sender, ESRI.ArcGIS.Controls.ISceneControlEvents_OnMouseDownEvent e)
        {
            IPoint pt = null;
            ISceneGraph pSG = axSceneControl1.SceneGraph;
            ISceneViewer pSW = pSG.ActiveViewer;
            object a;
            object b;
            pSG.Locate(pSW, e.x, e.y, esriScenePickMode.esriScenePickAll, true, out pt, out a, out b);
            if (pt == null) return;
            ptCol.Add(pt);
            int i = ptCol.Count;
            if (i < 1) return;

            IRgbColor pRgbColor = new RgbColorClass();
            pRgbColor.Blue = 255;
            pRgbColor.Green = 0;
            pRgbColor.Red = 0;
            ISimpleLine3DSymbol pSimpleLine3DSymbol = new SimpleLine3DSymbolClass();
            pSimpleLine3DSymbol.Style = esriSimple3DLineStyle.esriS3DLSTube;
            ILineSymbol pLineSymbol = pSimpleLine3DSymbol as ILineSymbol;
            pLineSymbol.Color = pRgbColor;
            pLineSymbol.Width = 10;
            //ILineElement pLineElement = new LineElementClass();
            //pLineElement.Symbol = pLineSymbol;

            //产生线段对象 line
            ILine pLine = new LineClass();
            IPoint fromPt = ptCol[i - 1];
            IPoint toPt = ptCol[i - 2];
            pLine.PutCoords(fromPt, toPt);

            //将线段对象添加到多义线对象polyline
            object Missing1 = Type.Missing;
            object Missing2 = Type.Missing;
            ISegment pSegment = pLine as ISegment;
            m_polyline.AddSegment(pSegment, ref Missing1, ref Missing2);

            //让Z值生效
            IZAware Zaware = m_polyline as IZAware;
            Zaware.ZAware = true;

            IGeometry geometry = (IGeometry)m_polyline;

            //更新到Graphics窗口
            IGraphicsContainer3D pGCon3D = axSceneControl1.Scene.BasicGraphicsLayer as IGraphicsContainer3D;
            IElement pElement = new LineElementClass();
            pElement.Geometry = geometry;

            ILineElement pLineElement = pElement as ILineElement;
            pLineElement.Symbol = pLineSymbol;

            pGCon3D.DeleteAllElements();
            pGCon3D.AddElement(pElement);
            axSceneControl1.Scene.SceneGraph.RefreshViewers();
        }

 

 是的,这段代码如果 axSceneControl1 加载的是.sxd文件确实可以画。且是画出的就是管子样式的线。那么么样改一下就能让加载.shp文件的axSceneControl1 也可以画呢。看代码:

 

 

public Form1()
        {
            InitializeComponent();

            _axesGraphicsContainer3D = new GraphicsLayer3DClass();
            ILayer layer = _axesGraphicsContainer3D as ILayer;
            layer.Name = "XXX";

            this.axSceneControl1.Scene.AddLayer(_axesGraphicsContainer3D as ILayer, true);
        }


private void axSceneControl1_OnMouseDown(object sender, ESRI.ArcGIS.Controls.ISceneControlEvents_OnMouseDownEvent e)
        {
            IPoint pt = null;
            ISceneGraph pSG = axSceneControl1.SceneGraph;
            ISceneViewer pSW = pSG.ActiveViewer;
            object a;
            object b;
            pSG.Locate(pSW, e.x, e.y, esriScenePickMode.esriScenePickAll, true, out pt, out a, out b);
            if (pt == null) return;
            ptCol.Add(pt);
            int i = ptCol.Count;
            if (i < 1) return;

            IRgbColor pRgbColor = new RgbColorClass();
            pRgbColor.Blue = 255;
            pRgbColor.Green = 0;
            pRgbColor.Red = 0;
            ISimpleLine3DSymbol pSimpleLine3DSymbol = new SimpleLine3DSymbolClass();
            pSimpleLine3DSymbol.Style = esriSimple3DLineStyle.esriS3DLSTube;
            ILineSymbol pLineSymbol = pSimpleLine3DSymbol as ILineSymbol;
            pLineSymbol.Color = pRgbColor;
            pLineSymbol.Width = 10;
            //ILineElement pLineElement = new LineElementClass();
            //pLineElement.Symbol = pLineSymbol;

            //产生线段对象 line
            ILine pLine = new LineClass();
            IPoint fromPt = ptCol[i - 1];
            IPoint toPt = ptCol[i - 2];
            pLine.PutCoords(fromPt, toPt);

            //将线段对象添加到多义线对象polyline
            object Missing1 = Type.Missing;
            object Missing2 = Type.Missing;
            ISegment pSegment = pLine as ISegment;
            m_polyline.AddSegment(pSegment, ref Missing1, ref Missing2);

            //让Z值生效
            IZAware Zaware = m_polyline as IZAware;
            Zaware.ZAware = true;

            IGeometry geometry = (IGeometry)m_polyline;

            //更新到Graphics窗口
    IGraphicsContainer3D pGCon3D = this._axesGraphicsContainer3D; //这一行代码要改 IGraphicsContainer3D pGCon3D = axSceneControl1.Scene.BasicGraphicsLayer as IGraphicsContainer3D;
            IElement pElement = new LineElementClass();
            pElement.Geometry = geometry;

            ILineElement pLineElement = pElement as ILineElement;
            pLineElement.Symbol = pLineSymbol;

            pGCon3D.DeleteAllElements();
            pGCon3D.AddElement(pElement);
            axSceneControl1.Scene.SceneGraph.RefreshViewers();
        }
 

 

O了,这样,你用SceneControl加载一个中国地图的shp文件进来,再在上面点击鼠标几下试下,就能看到效果了。

分享到:
评论
1 楼 陈不二 2014-11-27  
IGraphicsContainer3D gc3d = new GraphicsLayer3DClass();
需要强制转换吗?楼主大神也你的代码
            _axesGraphicsContainer3D = new GraphicsLayer3DClass();
中也没有注明_axesGraphicsContainer3D的类型

相关推荐

    SceneControl中画线

    在给定的描述中,我们关注的是如何在SceneControl中实现画线的功能,这对于构建交互式的三维GIS应用尤其关键。下面我们将深入探讨这个主题。 首先,画线的核心在于创建和管理图形元素。在ArcEngine中,我们可以使用...

    ArcEngine开发实例

    在ArcEngine中,SceneControl控件允许开发者创建、加载和管理三维场景,包含地形、建筑物、飞行路径等多种元素。通过Scene对象,可以实现视角控制、光照设置、添加三维图层等功能,同时支持三维空间分析,如视域分析...

    ArcEngine加载地图服务Demo

    3. **添加MapControl或SceneControl**: 这两个控件是ArcEngine中的可视化组件,用于在应用程序界面中展示地图。MapControl用于2D视图,而SceneControl用于3D视图。 4. **加载地图服务**: 使用`IMapServer`接口与...

    arcengine开发框架

    开发者可以通过AoEdit进行数据预处理,以便在ArcEngine应用中使用。 总的来说,ArcEngine开发框架为专业GIS开发人员提供了一套全面的工具,以构建高效、功能丰富的GIS应用。无论是地图的展示、数据的编辑,还是复杂...

    ArcEngine三维开发

    在IT行业中,ArcEngine是一款由Esri公司推出的强大的地理信息系统(GIS)开发平台,它提供了丰富的API和工具,使得开发者能够构建自己的桌面、Web以及移动应用程序,尤其在三维GIS领域有着广泛的应用。本文将深入...

    基于ArcEngine的类office界面风格的三维显示与分析

    自定义设计炫丽的工具按钮(实现ArcSence中常用按钮功能),利用ArcEngine提供的SceneControl和相应的接口实现三维数据加载、显示、浏览、分析等功能,如坡度分析、通视分析剖面图绘制、自动生成等高线等。

    基于ArcEngine的组件式地理信息系统设计

    在实际开发中,开发者需要深入了解ArcEngine API,掌握地图对象模型、图层管理、数据访问、空间分析等技术,才能有效地构建组件式GIS系统。此外,还需要熟悉VB编程,理解事件驱动编程和面向对象编程的概念,以编写出...

    Arcengine显示图层属性

    在ArcEngine中,调用封装好的图层属性对话框是一种常见的操作,主要用于编辑和查看地图图层的各种属性。下面将详细介绍如何通过ArcEngine API来实现这一功能。 #### 三、代码解析 ```csharp if (layer != null) { ...

    ArcScene+AE+点击画线.pdf

    ArcEngine包括一系列组件和服务,可以集成到不同的应用程序中,从而实现地图展示、空间分析等功能。在本案例中,AE与ArcScene结合使用,实现了更为复杂的功能。 ### 点击画线功能解析 点击画线功能是指用户可以...

    在arcengine中使用Opengl

    尽管 SceneControl 和 GlobeControl 的底层是基于 OpenGL 实现的,但在 ArcEngine 中直接使用 OpenGL 需要注意一些事项。不同于传统的 WinForm 应用程序,我们不需要手动初始化 OpenGL 上下文(如 InitGLContext())...

    GIS二次开发:第四讲 ArcEngine的控件.ppt

    GIS 二次开发:ArcEngine 的控件 ...在本文中,我们详细介绍了 ArcEngine 的控件,包括 MapControl、PageLayoutControl、ToolBarControl、TocControl、GlobeControl、SceneControl 和 License 控件等。

    ArcEngine学习资料

    ArcEngine中的事件机制使得应用程序可以响应用户的交互行为,如点击地图、图层加载完成等,这极大地增强了程序的交互性。 10. **部署与发布** 开发完成后,需要将应用程序打包并部署。ArcGIS Engine提供了部署...

    VC6.0+Arcengine9.0开发应用程序框架制作

    - 在后续步骤中选择“ActiveX Controls”,以便能够在项目中使用 ArcEngine 提供的 ActiveX 控件。 - 在第六步中,指定 CAoEXView 类作为 CFormView 的子类。这一步骤对于集成 ArcEngine 控件至关重要。 - 完成...

    ArcEngine1.zip

    在ArcEngine中,我们可以通过创建Map、MapControl和SceneControl对象来构建地图界面,使用FeatureClass和Table对象处理矢量和栅格数据,利用Spatial Analyst进行高级的空间分析。此外,还要熟悉ArcGIS的数据格式,如...

    ArcEngine地图基本操作的实现学习课程.pptx

    在ArcEngine中,控件不仅可以作为嵌入式组件放入设计环境中,还可以通过属性页进行详细配置,同时每个控件都有其对应的ArcObjects,方便调用常用属性和方法。此外,控件还响应用户的键盘和鼠标交互,触发一系列事件...

    Scenecontrol中加入shape

    在IT行业中,场景控制(Scenecontrol)通常是指在游戏开发、3D建模或虚拟现实应用中对场景元素进行管理的技术。"Shape"在这里可能指的是几何形状,如立方体、球体、圆柱体等,它们是构建3D模型的基本元素。当我们...

    ArcEngine地图基本操作的实现PPT学习教案.pptx

    【ArcEngine地图基本操作的实现】是针对GIS(地理信息系统)开发的重要内容,主要涉及到ArcEngine提供的各种控件以及它们在地图应用中的使用。ArcEngine是Esri公司开发的一个强大的GIS开发平台,它允许开发人员构建...

    ArcEngine开发讲义.rar

    《ArcEngine开发讲义》是一份详尽的GIS(地理信息系统)开发教程,主要针对ArcEngine的使用和开发进行深入讲解。ArcEngine是Esri公司提供的一个强大的开发平台,允许开发者构建基于桌面、Web和移动设备的GIS应用程序...

    ArcEngine地图基本操作的实现学习教案.pptx

    【ArcEngine地图基本操作的实现】是针对GIS(地理信息系统)开发的学习教程,主要讲解如何利用ArcEngine控件进行地图应用的开发。ArcEngine是由Esri公司提供的一个强大的开发平台,它提供了丰富的控件和API,使得...

Global site tag (gtag.js) - Google Analytics