前两天好不容易搞好了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文件进来,再在上面点击鼠标几下试下,就能看到效果了。
分享到:
相关推荐
在给定的描述中,我们关注的是如何在SceneControl中实现画线的功能,这对于构建交互式的三维GIS应用尤其关键。下面我们将深入探讨这个主题。 首先,画线的核心在于创建和管理图形元素。在ArcEngine中,我们可以使用...
在ArcEngine中,SceneControl控件允许开发者创建、加载和管理三维场景,包含地形、建筑物、飞行路径等多种元素。通过Scene对象,可以实现视角控制、光照设置、添加三维图层等功能,同时支持三维空间分析,如视域分析...
3. **添加MapControl或SceneControl**: 这两个控件是ArcEngine中的可视化组件,用于在应用程序界面中展示地图。MapControl用于2D视图,而SceneControl用于3D视图。 4. **加载地图服务**: 使用`IMapServer`接口与...
开发者可以通过AoEdit进行数据预处理,以便在ArcEngine应用中使用。 总的来说,ArcEngine开发框架为专业GIS开发人员提供了一套全面的工具,以构建高效、功能丰富的GIS应用。无论是地图的展示、数据的编辑,还是复杂...
在IT行业中,ArcEngine是一款由Esri公司推出的强大的地理信息系统(GIS)开发平台,它提供了丰富的API和工具,使得开发者能够构建自己的桌面、Web以及移动应用程序,尤其在三维GIS领域有着广泛的应用。本文将深入...
自定义设计炫丽的工具按钮(实现ArcSence中常用按钮功能),利用ArcEngine提供的SceneControl和相应的接口实现三维数据加载、显示、浏览、分析等功能,如坡度分析、通视分析剖面图绘制、自动生成等高线等。
在实际开发中,开发者需要深入了解ArcEngine API,掌握地图对象模型、图层管理、数据访问、空间分析等技术,才能有效地构建组件式GIS系统。此外,还需要熟悉VB编程,理解事件驱动编程和面向对象编程的概念,以编写出...
在ArcEngine中,调用封装好的图层属性对话框是一种常见的操作,主要用于编辑和查看地图图层的各种属性。下面将详细介绍如何通过ArcEngine API来实现这一功能。 #### 三、代码解析 ```csharp if (layer != null) { ...
ArcEngine包括一系列组件和服务,可以集成到不同的应用程序中,从而实现地图展示、空间分析等功能。在本案例中,AE与ArcScene结合使用,实现了更为复杂的功能。 ### 点击画线功能解析 点击画线功能是指用户可以...
尽管 SceneControl 和 GlobeControl 的底层是基于 OpenGL 实现的,但在 ArcEngine 中直接使用 OpenGL 需要注意一些事项。不同于传统的 WinForm 应用程序,我们不需要手动初始化 OpenGL 上下文(如 InitGLContext())...
GIS 二次开发:ArcEngine 的控件 ...在本文中,我们详细介绍了 ArcEngine 的控件,包括 MapControl、PageLayoutControl、ToolBarControl、TocControl、GlobeControl、SceneControl 和 License 控件等。
ArcEngine中的事件机制使得应用程序可以响应用户的交互行为,如点击地图、图层加载完成等,这极大地增强了程序的交互性。 10. **部署与发布** 开发完成后,需要将应用程序打包并部署。ArcGIS Engine提供了部署...
- 在后续步骤中选择“ActiveX Controls”,以便能够在项目中使用 ArcEngine 提供的 ActiveX 控件。 - 在第六步中,指定 CAoEXView 类作为 CFormView 的子类。这一步骤对于集成 ArcEngine 控件至关重要。 - 完成...
在ArcEngine中,我们可以通过创建Map、MapControl和SceneControl对象来构建地图界面,使用FeatureClass和Table对象处理矢量和栅格数据,利用Spatial Analyst进行高级的空间分析。此外,还要熟悉ArcGIS的数据格式,如...
在ArcEngine中,控件不仅可以作为嵌入式组件放入设计环境中,还可以通过属性页进行详细配置,同时每个控件都有其对应的ArcObjects,方便调用常用属性和方法。此外,控件还响应用户的键盘和鼠标交互,触发一系列事件...
在IT行业中,场景控制(Scenecontrol)通常是指在游戏开发、3D建模或虚拟现实应用中对场景元素进行管理的技术。"Shape"在这里可能指的是几何形状,如立方体、球体、圆柱体等,它们是构建3D模型的基本元素。当我们...
【ArcEngine地图基本操作的实现】是针对GIS(地理信息系统)开发的重要内容,主要涉及到ArcEngine提供的各种控件以及它们在地图应用中的使用。ArcEngine是Esri公司开发的一个强大的GIS开发平台,它允许开发人员构建...
《ArcEngine开发讲义》是一份详尽的GIS(地理信息系统)开发教程,主要针对ArcEngine的使用和开发进行深入讲解。ArcEngine是Esri公司提供的一个强大的开发平台,允许开发者构建基于桌面、Web和移动设备的GIS应用程序...
【ArcEngine地图基本操作的实现】是针对GIS(地理信息系统)开发的学习教程,主要讲解如何利用ArcEngine控件进行地图应用的开发。ArcEngine是由Esri公司提供的一个强大的开发平台,它提供了丰富的控件和API,使得...