




已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ArcGIS Engine的三维开发第八章 ArcGIS Engine的三维开发8.1 ArcGIS三维分析及其控件简介8.1.1 ArcGIS三维分析简介ArcGIS三维分析提供了对表面数据有效的可视化和分析。使用三维分析,可以从多个角度来浏览表面数据,查询表面,从表面上一选定的位置来确定什么对象可见,以及通过叠加栅格和矢量数据来创建一幅逼真的透视图。三维分析(3D Analyst)添加了两个专用的三维可视化应用程序:ArcScene和ArcGlobe,它们扩展了ArcGIS Desktop的功能,并且扩展了ArcCatalog和ArcMap的三维功能。ArcScene允许用户制作具有透视效果的场景,在这个场景中可以对地理信息系统数据进行浏览和交互。用户可以在表面上叠加栅格和矢量数据,并从矢量数据源创建线、面和体。用户也可以使用ArcScene中的三维分析工具创建和分析表面。ArcGlobe提供在标准计算机硬件上对巨型三维栅格、地形和矢量数据集进行实时漫游和缩放,在此过程中基本不会感觉到速度上的问题。这主要是依靠一种新引入的索引和快速检索数据的方法实现的。利用三维分析扩展ArcCatalog,从而实现对三维数据的管理并且创建具有三维视觉属性的图层。用户可以在ArcCatalog中使用与ArcScene中相同的浏览工具预览三维场景和数据。利用三维分析扩展ArcMap,从而可以由GIS数据生成新的表面,以及分析表面、查询表面某一位置的属性值和分析表面不同位置的可见性。用户还可以计算表面面积和表面之上或者表面之下的体积,并沿表面上的三维线生成剖面。8.2 ArcGIS三维显示简介ArcGIS Desktop中,可用于三维场景展示的程序为ArcGlobe和ArcScene,由于两者的差别,在三维场景展示中适用的情况有所不同。由于Engine与Desktop底层技术都是基于AO的,因此该比较结果在功能性和整体效率方面同样适用与GlobeControl和SceneControl。ArcScene简介:ArcScene是一个适合于展示三维透视场景的平台,可以在三维场景中漫游并与三维矢量与栅格数据进行交互。ArcScene是基于OpenGL的,支持TIN数据显示。显示场景时,ArcScene会将所有数据加载到场景中,矢量数据以矢量形式显示,栅格数据默认会降低分辨率来显示以提高效率。图1 ArcScene界面ArcGlobe简介:ArcGlobe是ArcGIS9.0之后出现的新产品,设计用于展示大数据量的场景,支持对栅格和矢量数据无缝的显示。ArcGlobe基于全球视野,所有数据均投影到全球立方投影(World Cube Projection)下,并对数据进行分级分块显示。为提高显示效率,ArcGlobe按需将数据缓存到本地,矢量数据可以进行栅格化。图2 ArcGlobe界面ArcGlobe和ArcScene的主要区别:(1)投影坐标系统的不同:ArcGlobe将所有数据投影到球体表面上,使场景显示更接近现实世界。适合于全市,全省,全国甚至全球大范围内的数据展示。ArcScene将所有数据投影到当前场景所定义的空间参考中,默认情况下,场景的空间参考由所加入的第一个图层空间参考决定。ArcScene中场景表现为平面投影,适合于小范围内精细场景刻画。(2)缓存与内存管理机制的不同:ArcGlobe和ArcScene最重要的区别在于此。ArcGlobe设计用于海量数据展示,所以为提高显示效率而进行数据缓存是很必要的。ArcGlobe将数据分块并按级别建立缓存和索引,才使得即使在ArcGlobe中显示海量数据仍可以高速的展示与漫游。ArcScene会将所有数据读入场景中完全显示,因此会占用大量显存,物理内存和虚拟内存,这也是ArcScene适于小数据量小场景精细展示的原因之一。(3)分析功能的不同:ArcGlobe可以极好的展示大数据的场景,同时提供高速的漫游。但ArcScene对传统的三维分析功能支持的更好。例如Desktop中3D Analyst工具条在ArcScene中被很好的支持,并支持Tin模型的显示。ArcGlobe不支持Tin的显示,但支持其作为高程数据加入场景。ArcGlobe支持Terrain数据集但ArcScene不支持。(4)显示差别ArcGlobe中用户可以选择是否将矢量数据栅格化后显示,该功能对注记数据的显示也有很大帮助。用户可以选择将注记(Annotation)附着显示于地球表面或像广告牌一样面向当前用户。ArcScene中不支持注记(Annotation)数据的显示。在ArcGlobe中矢量数据栅格化后可以大幅提高显示效率,我们在ArcGlobe 场景建设中采取“能够栅格化的矢量数据尽量栅格化”的策略也来自于此。1. ArcGIS 三维系统的设计该系统分为四个模块,分别是文件的操作、场景的浏览、点查询和矢量文件生成TIN。下面分别对这四个模块做详细介绍,其参考代码请参阅“例子程序”中的Chapter8。122.1 文件操作该模块包括打开工程文件(打开sxd文件)、打开栅格文件(打开Raster文件)和保存图片文件。所用到的控件有:SceneControl控件(用于显示打开的工程文件和栅格文件)、Button控件、OpenFileDialog控件、SaveFileDialog控件、TabControl控件(页面布局控件)、TOCControl控件(用于显示图层)。其布局如下:图3 文件操作的界面布局(红线内的)表1 控件的名称和类型对照表控件类型Text属性控件名称备注SceneControl无mSceneControl显示数据TOCControl无mTOCControl 显示图层Button打开sxd文件OpenSxdFile打开工程的文件Button打开Raster文件OpenRasterFile打开栅格的文件Button保存图片文件SaveImage抓图TabControl两个页面分别为“基本操作”和“图层”tabControl1分为两个页面,“基本操作”和“图层”除了上述表所列出的属性需要设置,另外还要将TOCControl的Buddy属性设置为mSceneControl,其方法如下:(1) 选中TOCControl控件,右击弹出菜单并选择“属性”。(2) 弹出对话框,选择General页面,并找到Buddy复选框,选择mSceneControl,如下图。图4 设置TOCControl控件的Buddy属性将控件的属性设置完毕之后,为三个Button控件添加Click事件,并添加以下处理代码:OpenSxdFile按钮控件的Click事件代码:/*/ /* 打开sxd文件按钮按下事件 */ /*/ /打开sxd工程文件 private void OpenSxdFile_Click(object sender, EventArgs e) /文件过滤 mOpenFileDialog.Filter = sxd文件|*.sxd; /打开文件对话框打开事件 if (mOpenFileDialog.ShowDialog() = DialogResult.OK) /从打开对话框中得到打开文件的全路径,并将该路径传入到mSceneControl中 mSceneControl.LoadSxFile(mOpenFileDialog.FileName); OpenRasterFile按钮控件的Click事件代码:/*/ /* 打开Raster文件按钮按下事件 */ /*/ /向工程中添加栅格数据 private void OpenRasterFile_Click(object sender, EventArgs e) string sFileName = null; /新建栅格图层 IRasterLayer pRasterLayer = null; pRasterLayer = new RasterLayerClass(); /取消文件过滤 mOpenFileDialog.Filter = 所有文件|*.*; /打开文件对话框打开事件 if (mOpenFileDialog.ShowDialog() = DialogResult.OK) /从打开对话框中得到打开文件的全路径 sFileName = mOpenFileDialog.FileName; /创建栅格图层 pRasterLayer.CreateFromFilePath(sFileName); /将图层加入到控件中 mSceneControl.Scene.AddLayer(pRasterLayer,true); /将当前视点跳转到栅格图层 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); mSceneControl.Refresh(); SaveImage按钮控件的Click事件代码: /*/ /* 保存图片文件按钮按下事件 */ /*/ /抓图,将场景保存成图片文件 private void SaveImage_Click(object sender, EventArgs e) string sFileName = ; /保存对话框的标题 mSaveFileDialog.Title = 保存图片; /保存对话框过滤器 mSaveFileDialog.Filter = BMP图片|*.bmp|JPG图片|*.jpg; /图片的高度和宽度 int Width = mSceneControl.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格式的文件 mSceneControl.SceneViewer.GetSnapshot(Width, Height, esri3DOutputImageType.JPEG, sFileName); MessageBox.Show(保存图片成功!); mSceneControl.Refresh(); 2.2 场景浏览有两种方法定制场景的浏览,第一种方法是利用arcgis的向导,定制常用的浏览方法,如漫游、放大、缩小等等,该方法简单,并且不需要编写代码,第二种方法是通过添加代码的方法更改场景的CurrentTool属性,从而实现场景浏览的功能,下面对以上两种方法一一介绍:第一种方法:第一步:添加ToolbarControl控件,该控件位于“工具箱”中的“ArcGIS Windows Forms”选项中,把它的名字设置为 ”mToolbarControl”,将“Dock”属性设置为“Top”,并将其Buddy属性设置为mSceneControl,设置方法与mTOCControl控件相同。第二步:进入“mToolbarControl”属性对话框中的“items”页面,并单击“Add”按钮。弹出Control Commands对话框,在Control Commands对话框中选中“Category”列表框中的“Scene”选项,在“Commands”列表中就会出现与“Scene”关联的命令,双击命令就可以将该命令加入到“mToolbarControl”工具条中,如下图:图5 mToolbarControl属性对话框图6 Control Commands对话框第二种方法:第一步,加入C#工具条(ToolStrip控件),并将其“Dock”属性设置为“Top”,第二步,在工具条中加入按钮,并为按钮添加事件,并写入事件处理程序,其代码如下:/*/ /* 工具条“ZoomIn”按钮按下事件 */ /*/ /将场景的缩放 private void ZoomIn_Click(object sender, EventArgs e) /创建命令 ICommand pCommand = new ControlsSceneZoomInTool(); pCommand.OnCreate(mSceneControl.Object); /将当前工具设置为缩放工具 mSceneControl.CurrentTool = pCommand as ITool; pCommand = null; /刷新 mSceneControl.Refresh(); 本例仅以缩放为例,其他浏览工具与此相同。SceneControl控件中常用的浏览功能如下:类名功能ControlsSceneFlyTool (Controls)飞行ControlsSceneFullExtentCommand (Controls)全景视图ControlsSceneNavigateTool (Controls)导航ControlsSceneOpenDocCommand (Controls)打开文档ControlsScenePanTool (Controls)漫游ControlsSceneZoomInTool (Controls)放大ControlsSceneZoomOutTool (Controls)缩小2.3 点查询功能点查询是通过鼠标点击事件来获取要素的方法,该功能是三维系统最常见的方法,arcgis中提供的LocateMultiple可以很方便的实现点查询功能,以下对点查询功能做详细的介绍:第一步,在主窗口中添加一个CheckBox控件,并命名为mPointSearch,如图7所示,该控件控制是否进行点查询操作。图7 添加CheckBox控件第二步,新建一个Windows窗口,命名为ResultForm,并将Text属性改为“查询结果”ResultForm窗口中有一个TreeView控件,该控件以树状形式显示了查询的结果,如图8所示:图8 ResultForm窗口布局第三步,为MainFrom添加私有成员函数private ResultForm mResultForm,并初始化。为mSceneControl控件添加鼠标按下事件OnMouseDown,并加入如下代码: /*/ /* mSceneControl的OnMouseDown事件 */ /*/ /处理点查询 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.OnePerLayer(); if (mHit3DSet = null)/没有选中对象 MessageBox.Show(没有选中对象); else /显示在ResultForm控件中。mHit3DSet为查询结果集合 mResultForm.Show(); mResultForm.refeshView(mHit3DSet); mSceneControl.Refresh(); 第四步,在ResultForm中显示结果结合,其代码如下:/显示结果集合 public void refeshView(IHit3DSet pHit3Dset) /用tree控件显示查询结果 mTreeView.BeginUpdate(); /清空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); node.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 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选择图层ComboBox无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 (nCount = 0)/没有图层的情况 MessageBox.Show(场景中没有图层,请加入图层); return; int i; ILayer pLayer = null; /将所有的图层的名称显示到复选框中 for (i = 0; i nCount; i+) pLayer = mSceneControl.Scene.get_Layer(i); mLayerCombox.Items.Add(pLayer.Name); /将复选框设置为选中第一项 mLayerCombox.SelectedIndex = 0; addFieldNameToCombox(mLayerCombox.ItemsmLayerCombox.SelectedIndex.ToString(); 为mLayerCombox控件添加SelectedIndexChanged事件,其代码如下:/*/ /* mLayerCombox的SelectedIndexChanged事件 */ /*/ private void OnSelectIndexChange(object sender, EventArgs e) addFieldNameToCombox(mLayerCombox.ItemsmLayerCombox.SelectedIndex.ToString(); /更加图层的名字将该图层的字段加入到combox中 private void addFieldNameToCombox(string layerName) mFeildCombox.Items.Clear(); int i; IFeatureLayer pFeatureLayer = null; IFields pField = null; int nCount = mSceneControl.Scene.LayerCount; ILayer pLayer = null; /寻找名称为layerName的FeatureLayer; for (i = 0; i nCount; i+) pLayer = mSceneControl.Scene.get_Layer(i) as IFeatureLayer; if (pLayer.Name = layerName)/找到了layerName的Featurelayer pFeatureLayer = pLayer as IFeatureLayer; break; if(pFeatureLayer != null)/判断是否找到 pField = pFeatureLayer.FeatureClass.Fields; nCount = pField.FieldCount; /将该图层中所用的字段写入到mFeildCombox中去 for (i = 0; i nCount; i+ ) mFeildCombox.Items.Add(pField.get_Field(i).Name); mFeildCombox.SelectedIndex = 0; 为ConstructTin按钮添加Click事件,其代码如下: /*/ /* ConstructTin按钮的Click事件 */ /*/ /创建Tin private void ConstructTin_Click(object sender, EventArgs e) if(mLayerCombox.Text = | mFeildCombox.Text = )/判断输入合法性 MessageBox.Show(没有相应的图层); return; ITinEdit pTin = new TinClass(); /寻找Featurelayer IFeatureLayer pFeatureLayer = mSceneControl.Scene.get_Layer(mLayerCombox.SelectedIndex) as IFeatureLayer; if(pFeatureLayer != null) IEnvelope pEnvelope = new EnvelopeClass(); IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass; IQueryFilter pQueryFilter = new QueryFilterClass(); IField pField = null; /找字段 pField = pFeatureClass.Fields.get_Field(pFeat
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年大数据分析入门教程与预测题集合初级版
- 2025年农村房屋买卖合同示例
- 安徽省池州市2025年-2026年小学六年级数学期末考试(上学期)试卷及答案
- 2025年中华饮食文化高级讲座试题集与答案
- 2023三年级语文下册 第四单元 15 小虾(新学习单)说课稿 新人教版
- 2025年国际贸易实务操作证书考试模拟题与解析
- 人教版九年级美术上册说课稿:3.1土和火的艺术
- 2025工程采购合同及相关法律法规
- 湖北省十堰市2025年-2026年小学六年级数学期中考试(上,下学期)试卷及答案
- 山西省运城市2025年-2026年小学六年级数学综合练习(上,下学期)试卷及答案
- 2025年职工职业技能竞赛(制图员赛项)参考试题库(含答案)
- 胖东来管理制度
- 学校教育用地土地租赁合同
- 乳腺癌图文课件版
- 大学意识形态安全教育
- 原材料不合格预防措施
- 高压氧护理进修汇报
- 中国神经病理性疼痛诊疗指南(2024版)解读
- 2024年微信小程序开发与代运营合同
- 2024国有企业与私营企业之间的混合所有制改革合作协议
- 【电气施工】工业厂房机电安装工程施工组织设计方案
评论
0/150
提交评论