
实习指导书.docx
19页第八章 ArcGIS Engine的三维开发8.1 ArcGIS 三维分析及其控件简介61.1 ArcGIS三维分析简介ArcGIS三维分析提供了对表面数据有效的可视化和分析使用三 维分析,可以从多个角度来浏览表面数据,查询表面,从表面上一选 定的位置来确定什么对象可见,以及通过叠加栅格和矢量数据来创建 一幅逼真的透视图三维分析(3DAnalyst)添加了两个专用的三维可视化应用程序: ArcScene和ArcGlobe,它们扩展了 ArcGIS Desktop的功能,并且扩展 了 ArcCatalog和 ArcMap 的三维功能ArcScene允许用户制作具有透视效果的场景,在这个场景中可以 对地理信息系统数据进行浏览和交互用户可以在表面上叠加栅格和 矢量数据,并从矢量数据源创建线、面和体用户也可以使用ArcScene 中的三维分析工具创建和分析表面ArcGlobe提供在标准计算机硬件上对巨型三维栅格、地形和矢量 数据集进行实时漫游和缩放,在此过程中基本不会感觉到速度上的问 题这主要是依靠一种新引入的索引和快速检索数据的方法实现的利用三维分析扩展ArcCatalog,从而实现对三维数据的管理并且 创建具有三维视觉属性的图层。
用户可以在ArcCa talog中使用与 ArcScene中相同的浏览工具预览三维场景和数据利用三维分析扩展ArcMap,从而可以由GIS数据生成新的表面, 以及分析表面、查询表面某一位置的属性值和分析表面不同位置的可 见性用户还可以计算表面面积和表面之上或者表面之下的体积,并 沿表面上的三维线生成剖面2 ArcGIS三维显示简介ArcGIS Desktop中,可用于三维场景展示的程序为ArcGlobe和 ArcScene,由于两者的差别,在三维场景展示中适用的情况有所不同 由于Engine与Desktop底层技术都是基于AO的,因此该比较结果在功 能性和整体效率方面同样适用与GlobeControl和SceneControlArcScene 简介:ArcScene是一个适合于展示三维透视场景的平台,可以在三维场 景中漫游并与三维矢量与栅格数据进行交互oArcScene是基于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) 附着显示于地球表面或像广告牌一样面向当前用户oArcScene中不支 持注记(Annotation)数据的显示在ArcGlobe中矢量数据栅格化后可 以大幅提高显示效率,我们在ArcGlobe场景建设中采取“能够栅格 化的矢量数据尽量栅格化”的策略也来自于此1. ArcGIS 三维系统的设计该系统分为四个模块,分别是文件的操作、场景的浏览、点查询 和矢量文件生成TIN下面分别对这四个模块做详细介绍,其参考代 码请参阅“例子程序”中的Chapter82.1 文件操作该模块包括打开工程文件(打开sxd文件)、打开栅格文件(打 开Raster文件)和保存图片文件。
所用到的控件有:SceneControl控件(用于显示打开的工程文件和栅格文件)、Button控件、 OpenFileDialog控件、SaveFileDialog控件、TabControl控件(页面 布局控件)、TOCControl控件(用于显示图层)其布局如下:图3 文件操作的界面布局(红线内的)表1 控件的名称和类型对照表控件类型Tex t属性控件名称备注SceneControl无mSceneControl显示数据TOCControl无mTOCControl显示图层Button打开sxd文件OpenSxdFile打开工程的文件Button打开Ras ter文件OpenRasterFile打开栅格的文件Button保存图片文件Saveimage抓图TabControl两个页面分别为“基本操作”和“图层”tabControll分为两个页面,“基本操作”和“图层”除了上述表所列出的属性需要设置,另外还要将TOCControl的Buddy属性设置为mSceneControl,其方法如下:(1)选中TOCControl控件,右击弹出菜单并选择“属性”2 )弹出对话框,选择General页面,并找到Buddy复选框,选 择mSceneControl,如下图。
图4设置TOCControl控件的Buddy属性将控件的属性设置完毕之后,为三个Button控件添加Click事件, 并添加以下处理代码:OpenSxdFile按钮控件的Click事件代码:/ *x* *x* *x* *x* *x* *x* *x* *x* // //* "打开sxd文件"按钮按下事件 *// *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* // ///打开sxd工程文件private void OpenSxdFile_Click(object sender, EventArgs e){//文件过滤mOpenFileDialog. Filter = "sxd文件 |*.sxd";//打开文件对话框打开事件if (mOpenFileDialog.ShowDialog() == DialogResult.OK){//从打开对话框中得到打开文件的全路径,并将该路径传入到mSceneContro l中 mSceneControl.LoadSxFile(mOpenFileDialog.FileName);}OpenRasterFile按钮控件的Click事件代码:/ *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* // •*?>• //* "打开Raster文件"按钮按下事件 *// *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* // ///向工程中添加栅格数据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.SetDefa。












