ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:502.54KB ,
资源ID:6840532      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6840532.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(实习指导书第八章ArcGIS Engine三维开发.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

实习指导书第八章ArcGIS Engine三维开发.docx

1、实习指导书第八章ArcGIS Engine三维开发第八章 ArcGIS Engine的三维开发8.1 ArcGIS三维分析及其控件简介8.1.1 ArcGIS三维分析简介ArcGIS三维分析提供了对表面数据有效的可视化和分析。使用三维分析,可以从多个角度来浏览表面数据,查询表面,从表面上一选定的位置来确定什么对象可见,以及通过叠加栅格和矢量数据来创建一幅逼真的透视图。三维分析(3D Analyst)添加了两个专用的三维可视化应用程序:ArcScene和ArcGlobe,它们扩展了ArcGIS Desktop的功能,并且扩展了ArcCatalog和ArcMap的三维功能。ArcScene允许用户

2、制作具有透视效果的场景,在这个场景中可以对地理信息系统数据进行浏览和交互。用户可以在表面上叠加栅格和矢量数据,并从矢量数据源创建线、面和体。用户也可以使用ArcScene中的三维分析工具创建和分析表面。ArcGlobe提供在标准计算机硬件上对巨型三维栅格、地形和矢量数据集进行实时漫游和缩放,在此过程中基本不会感觉到速度上的问题。这主要是依靠一种新引入的索引和快速检索数据的方法实现的。利用三维分析扩展ArcCatalog,从而实现对三维数据的管理并且创建具有三维视觉属性的图层。用户可以在ArcCatalog中使用与ArcScene中相同的浏览工具预览三维场景和数据。利用三维分析扩展ArcMap,

3、从而可以由GIS数据生成新的表面,以及分析表面、查询表面某一位置的属性值和分析表面不同位置的可见性。用户还可以计算表面面积和表面之上或者表面之下的体积,并沿表面上的三维线生成剖面。8.2 ArcGIS三维显示简介ArcGIS Desktop中,可用于三维场景展示的程序为ArcGlobe和ArcScene,由于两者的差别,在三维场景展示中适用的情况有所不同。由于Engine与Desktop底层技术都是基于AO的,因此该比较结果在功能性和整体效率方面同样适用与GlobeControl和SceneControl。ArcScene简介:ArcScene是一个适合于展示三维透视场景的平台,可以在三维场景

4、中漫游并与三维矢量与栅格数据进行交互。ArcScene是基于OpenGL的,支持TIN数据显示。显示场景时,ArcScene会将所有数据加载到场景中,矢量数据以矢量形式显示,栅格数据默认会降低分辨率来显示以提高效率。图1 ArcScene界面ArcGlobe简介:ArcGlobe是ArcGIS9.0之后出现的新产品,设计用于展示大数据量的场景,支持对栅格和矢量数据无缝的显示。ArcGlobe基于全球视野,所有数据均投影到全球立方投影(World Cube Projection)下,并对数据进行分级分块显示。为提高显示效率,ArcGlobe按需将数据缓存到本地,矢量数据可以进行栅格化。图2 Ar

5、cGlobe界面ArcGlobe和ArcScene的主要区别:(1)投影坐标系统的不同:ArcGlobe将所有数据投影到球体表面上,使场景显示更接近现实世界。适合于全市,全省,全国甚至全球大范围内的数据展示。ArcScene将所有数据投影到当前场景所定义的空间参考中,默认情况下,场景的空间参考由所加入的第一个图层空间参考决定。ArcScene中场景表现为平面投影,适合于小范围内精细场景刻画。(2)缓存与内存管理机制的不同:ArcGlobe和ArcScene最重要的区别在于此。ArcGlobe设计用于海量数据展示,所以为提高显示效率而进行数据缓存是很必要的。ArcGlobe将数据分块并按级别建立

6、缓存和索引,才使得即使在ArcGlobe中显示海量数据仍可以高速的展示与漫游。ArcScene会将所有数据读入场景中完全显示,因此会占用大量显存,物理内存和虚拟内存,这也是ArcScene适于小数据量小场景精细展示的原因之一。(3)分析功能的不同:ArcGlobe可以极好的展示大数据的场景,同时提供高速的漫游。但ArcScene对传统的三维分析功能支持的更好。例如Desktop中3D Analyst工具条在ArcScene中被很好的支持,并支持Tin模型的显示。ArcGlobe不支持Tin的显示,但支持其作为高程数据加入场景。ArcGlobe支持Terrain数据集但ArcScene不支持。(

7、4)显示差别ArcGlobe中用户可以选择是否将矢量数据栅格化后显示,该功能对注记数据的显示也有很大帮助。用户可以选择将注记(Annotation)附着显示于地球表面或像广告牌一样面向当前用户。ArcScene中不支持注记(Annotation)数据的显示。在ArcGlobe中矢量数据栅格化后可以大幅提高显示效率,我们在ArcGlobe 场景建设中采取“能够栅格化的矢量数据尽量栅格化”的策略也来自于此。1. ArcGIS 三维系统的设计该系统分为四个模块,分别是文件的操作、场景的浏览、点查询和矢量文件生成TIN。下面分别对这四个模块做详细介绍,其参考代码请参阅“例子程序”中的Chapter8。

8、1 2 2.1 文件操作该模块包括打开工程文件(打开sxd文件)、打开栅格文件(打开Raster文件)和保存图片文件。所用到的控件有:SceneControl控件(用于显示打开的工程文件和栅格文件)、Button控件、OpenFileDialog控件、SaveFileDialog控件、TabControl控件(页面布局控件)、TOCControl控件(用于显示图层)。其布局如下:图3 文件操作的界面布局(红线内的)表1 控件的名称和类型对照表控件类型Text属性控件名称备注SceneControl无mSceneControl显示数据TOCControl无mTOCControl 显示图层Butt

9、on打开sxd文件OpenSxdFile打开工程的文件Button打开Raster文件OpenRasterFile打开栅格的文件Button保存图片文件SaveImage抓图TabControl两个页面分别为“基本操作”和“图层”tabControl1分为两个页面,“基本操作”和“图层”除了上述表所列出的属性需要设置,另外还要将TOCControl的Buddy属性设置为mSceneControl,其方法如下:(1) 选中TOCControl控件,右击弹出菜单并选择“属性”。(2) 弹出对话框,选择General页面,并找到Buddy复选框,选择mSceneControl,如下图。图4 设置TO

10、CControl控件的Buddy属性将控件的属性设置完毕之后,为三个Button控件添加Click事件,并添加以下处理代码:OpenSxdFile按钮控件的Click事件代码:/*/ /* 打开sxd文件按钮按下事件 */ /*/ /打开sxd工程文件 private void OpenSxdFile_Click(object sender, EventArgs e) /文件过滤 mOpenFileDialog.Filter = sxd文件|*.sxd; /打开文件对话框打开事件 if (mOpenFileDialog.ShowDialog() = DialogResult.OK) /从打开对

11、话框中得到打开文件的全路径,并将该路径传入到mSceneControl中 mSceneControl.LoadSxFile(mOpenFileDialog.FileName); OpenRasterFile按钮控件的Click事件代码:/*/ /* 打开Raster文件按钮按下事件 */ /*/ /向工程中添加栅格数据 private void OpenRasterFile_Click(object sender, EventArgs e) string sFileName = null; /新建栅格图层 IRasterLayer pRasterLayer = null; pRasterLay

12、er = new RasterLayerClass(); /取消文件过滤 mOpenFileDialog.Filter = 所有文件|*.*; /打开文件对话框打开事件 if (mOpenFileDialog.ShowDialog() = DialogResult.OK) /从打开对话框中得到打开文件的全路径 sFileName = mOpenFileDialog.FileName; /创建栅格图层 pRasterLayer.CreateFromFilePath(sFileName); /将图层加入到控件中 mSceneControl.Scene.AddLayer(pRasterLayer,t

13、rue); /将当前视点跳转到栅格图层 ICamera pCamera = mSceneControl.Scene.SceneGraph.ActiveViewer.Camera; /得到范围 IEnvelope pEenvelop = pRasterLayer.VisibleExtent; /添加z轴上的范围 pEenvelop.ZMin = mSceneControl.Scene.Extent.ZMin; pEenvelop.ZMax = mSceneControl.Scene.Extent.ZMax; /设置相机 pCamera.SetDefaultsMBB(pEenvelop); mSc

14、eneControl.Refresh(); SaveImage按钮控件的Click事件代码: /*/ /* 保存图片文件按钮按下事件 */ /*/ /抓图,将场景保存成图片文件 private void SaveImage_Click(object sender, EventArgs e) string sFileName = ; /保存对话框的标题 mSaveFileDialog.Title = 保存图片; /保存对话框过滤器 mSaveFileDialog.Filter = BMP图片|*.bmp|JPG图片|*.jpg; /图片的高度和宽度 int Width = mSceneContr

15、ol.Width; int Height = mSceneControl.Height; if( mSaveFileDialog.ShowDialog() = DialogResult.OK) sFileName = mSaveFileDialog.FileName; if(mSaveFileDialog.FilterIndex = 1)/保存成BMP格式的文件 mSceneControl.SceneViewer.GetSnapshot(Width, Height, esri3DOutputImageType.BMP, sFileName); else/保存成JPG格式的文件 mSceneCo

16、ntrol.SceneViewer.GetSnapshot(Width, Height, esri3DOutputImageType.JPEG, sFileName); MessageBox.Show(保存图片成功!); mSceneControl.Refresh(); 2.2 场景浏览有两种方法定制场景的浏览,第一种方法是利用arcgis的向导,定制常用的浏览方法,如漫游、放大、缩小等等,该方法简单,并且不需要编写代码,第二种方法是通过添加代码的方法更改场景的CurrentTool属性,从而实现场景浏览的功能,下面对以上两种方法一一介绍:第一种方法:第一步:添加ToolbarControl控

17、件,该控件位于“工具箱”中的“ArcGIS Windows Forms”选项中,把它的名字设置为 ”mToolbarControl”,将“Dock”属性设置为“Top”,并将其Buddy属性设置为mSceneControl,设置方法与mTOCControl控件相同。第二步:进入“mToolbarControl”属性对话框中的“items”页面,并单击“Add”按钮。弹出Control Commands对话框,在Control Commands对话框中选中“Category”列表框中的“Scene”选项,在“Commands”列表中就会出现与“Scene”关联的命令,双击命令就可以将该命令加入到

18、“mToolbarControl”工具条中,如下图:图5 mToolbarControl属性对话框图6 Control Commands对话框第二种方法:第一步,加入C#工具条(ToolStrip控件),并将其“Dock”属性设置为“Top”,第二步,在工具条中加入按钮,并为按钮添加事件,并写入事件处理程序,其代码如下:/*/ /* 工具条“ZoomIn”按钮按下事件 */ /*/ /将场景的缩放 private void ZoomIn_Click(object sender, EventArgs e) /创建命令 ICommand pCommand = new ControlsSceneZo

19、omInTool(); pCommand.OnCreate(mSceneControl.Object); /将当前工具设置为缩放工具 mSceneControl.CurrentTool = pCommand as ITool; pCommand = null; /刷新 mSceneControl.Refresh(); 本例仅以缩放为例,其他浏览工具与此相同。SceneControl控件中常用的浏览功能如下:类名功能ControlsSceneFlyTool (Controls)飞行ControlsSceneFullExtentCommand (Controls)全景视图ControlsScene

20、NavigateTool (Controls)导航ControlsSceneOpenDocCommand (Controls)打开文档ControlsScenePanTool (Controls)漫游ControlsSceneZoomInTool (Controls)放大ControlsSceneZoomOutTool (Controls)缩小2.3 点查询功能点查询是通过鼠标点击事件来获取要素的方法,该功能是三维系统最常见的方法,arcgis中提供的LocateMultiple可以很方便的实现点查询功能,以下对点查询功能做详细的介绍:第一步,在主窗口中添加一个CheckBox控件,并命名为m

21、PointSearch,如图7所示,该控件控制是否进行点查询操作。图7 添加CheckBox控件第二步,新建一个Windows窗口,命名为ResultForm,并将Text属性改为“查询结果”ResultForm窗口中有一个TreeView控件,该控件以树状形式显示了查询的结果,如图8所示:图8 ResultForm窗口布局第三步,为MainFrom添加私有成员函数private ResultForm mResultForm,并初始化。为mSceneControl控件添加鼠标按下事件OnMouseDown,并加入如下代码: /*/ /* mSceneControl的OnMouseDown事件

22、*/ /*/ /处理点查询 private void OnMouseDown(object sender, ISceneControlEvents_OnMouseDownEvent e) if(mPointSearch.Checked)/check按钮处于打勾状态 /查询 mSceneControl.SceneGraph.LocateMultiple(mSceneControl.SceneGraph.ActiveViewer, e.x, e.y, esriScenePickMode.esriScenePickAll, false, out mHit3DSet); mHit3DSet.OnePe

23、rLayer(); if (mHit3DSet = null)/没有选中对象 MessageBox.Show(没有选中对象); else /显示在ResultForm控件中。mHit3DSet为查询结果集合 mResultForm.Show(); mResultForm.refeshView(mHit3DSet); mSceneControl.Refresh(); 第四步,在ResultForm中显示结果结合,其代码如下:/显示结果集合 public void refeshView(IHit3DSet pHit3Dset) /用tree控件显示查询结果 mTreeView.BeginUpdat

24、e(); /清空tree控件的内容 mTreeView.Nodes.Clear(); IHit3D pHit3D; int i; /遍历结果集 for (i = 0; i pHit3Dset.Hits.Count; i+) pHit3D = pHit3Dset.Hits.get_Element(i) as IHit3D; if(pHit3D.Owner is ILayer) ILayer pLayer = pHit3D.Owner as ILayer; /将图层的名称和坐标显示在树节点中 TreeNode node = mTreeView.Nodes.Add(pLayer.Name); nod

25、e.Nodes.Add(X= + pHit3D.Point.X.ToString(); node.Nodes.Add(Y= + pHit3D.Point.Y.ToString(); node.Nodes.Add(Z= + pHit3D.Point.Z.ToString(); /将该图层中的所有元素显示在该树节点的子节点 if(pHit3D.Object != null) if (pHit3D.Object is IFeature) IFeature pFeature = pHit3D.Object as IFeature; int j; /显示Feature中的内容 for (j = 0; j

26、 pFeature.Fields.FieldCount; j+) node.Nodes.Add(pFeature.Fields.get_Field(j).Name + : + pFeature.get_Value(j).ToString(); mTreeView.EndUpdate(); 2.4 矢量文件生成TIN本例主要是利用大量的矢量文件生成不规则三界网TIN,并显示到mSceneControl控件中.其控件布局如下图所示:图9 矢量文件构造Tin界面布局(红线框内)表2 控件的名称和类型对照表控件类型Text属性控件名称备注ComboBox无mLayerCombox选择图层ComboBo

27、x无mFeildCombox选择与图层对应的字段ComboBox无mTINType选择生成Tin文件的类型Button刷新图层RefreshLayer将当前工程的图层显示到mLayerCombox中去Button构建TINConstructTin创建TIN另外,由于生成Tin文件的类型是固定的,不需要从场景中获得,所以mTINType复选框下拉菜单的内容也是固定的,可以通过修改ComboBox控件的Items属性来设定下拉菜单的内容,如图10。本文主要介绍以下“点”、“直线”、“光滑线”三种构建TIN的类型,其他的类型请参阅arcgis帮助文档。 图10 设定mTINType复选框下拉菜单的内容为RefreshLayer按钮添加Click事件,其代码如下: /*/ /* RefreshLayer按钮Click事件 */ /*/ /刷新图层 private void RefreshLayer_Click(object sender, EventArgs e) mLayerCombox.Items.Clear(); /得到当前场景中所有图层 int nCount = mSceneControl.Scene.LayerCount; if (nCou

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1