实习指导书 第八章 ArcGISEngine三维开发_第1页
实习指导书 第八章 ArcGISEngine三维开发_第2页
实习指导书 第八章 ArcGISEngine三维开发_第3页
实习指导书 第八章 ArcGISEngine三维开发_第4页
实习指导书 第八章 ArcGISEngine三维开发_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

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

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

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

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

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

7、其作为高程数据加入场景。ArcGlobe支持Terrain数据集但ArcScene不支持。(4 )显示差别ArcGlobe中用户可以选择是否将矢量数据栅格化后显示,该功 能对注记数据的显示也有很大帮助。用户可以选择将注记 (Ann otati on)附着显示于地球表面或像广告牌一样面向当前用户。 ArcScene中不支持注记(Annotation) 数据的显示。在ArcGlobe中矢 量数据栅格化后可以大幅提咼显示效率,我们在ArcGlobe场景建设 中采取“能够栅格化的矢量数据尽量栅格化”的策略也来自于此。1. ArcGIS三维系统的设计该系统分为四个模块,分别是文件的操作、场景的浏览、点查

8、询和矢量文件生成TIN。下面分别对这四个模块做详细介绍,其参考代 码请参阅“例子程序”中的Chapter8。2.1文件操作该模块包括打开工程文件(打开sxd文件)、打开栅格文件(打 开Raster文件)和保存图片文件。所用到的控件有: Sce neCo ntrol 控件(用于显示打开的工程文件和栅格文件)、 Butt on控件、OpenFileDialog 控件、SaveFileDialog 控件、TabControl 控件(页 面布局控件)、TOCControl控件(用于显示图层)。其布局如下:图3文件操作的界面布局(红线内的)表1控件的名称和类型对照表控件类型Text属性控件名称备注See

9、n eCo ntrol无mSee neCon trol显示数据TOCC on trol无mTOCCo ntrol显示图层Button打开sxd文件Ope nSxdFile打开工程的文件Button打开Raster文件Open RasterFile打开栅格的文件Button保存图片文件Saveimage抓图TabCo ntrol两个页面分别为“基本操作”和“图层”tabCo ntroll分为两个页面,“基本操作”和“图层”除了上述表所列出的属性需要设置,另外还要将TOCControl的Buddy属性设置为mSceneControl,其方法如下:(1)选中TOCControl控件,右击弹出菜单并选

10、择“属性”。(2)弹出对话框,选择General页面,并找到Buddy复选框,选择mSce neCo ntrol ,如下图。图4设置TOCControl控件的Buddy属性将控件的属性设置完毕之后,为三个Butt on控件添加Click事件, 并添加以下处理代码:OpenSxdFile按钮控件的Click事件代码:/*/*打开sxd文件按钮按下事件*/*/打开sxd工程文件private void OpenSxdFile_Click (object sender, EventArgs e)/文件过滤 mOpenFileDialog . Filter = sxd 文件 |*.sxd;/打开文件对

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

12、 = null ;/新建栅格图层IRasterLayer pRasterLayer = null ;pRasterLayer = new RasterLayerClass ();/取消文件过滤mOpenFileDialog . Filter =所有文件 |*.*;/打开文件对话框打开事件if ( mOpenFileDialog . ShowDialog () = DialogResult . OK/从打开对话框中得到打开文件的全路径sFileName = mOpenFileDialog . FileName;/创建栅格图层pRasterLayer . CreateFromFilePath (

13、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=

14、 mSceneControl. Scene. Extent . ZMax/设置相机pCamera SetDefaultsMBB (pEenvelop ); mSceneControl . Refresh ();SaveImage按钮控件的Click事件代码:/*/*保存图片文件按钮按下事件*/*/抓图,将场景保存成图片文件private void SaveImage_Click (object sender, EventArgs e)string sFileName =;/保存对话框的标题mSaveFileDialog . Title =保存图片;/保存对话框过滤器mSaveFileDialo

15、g . 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) / 保存成 BM格式的文件 mSceneControl . SceneViewer.

16、GetSnapshot (Width , Height , esri3DOutputlmageType . BMP sFileName );else /保存成JPG格式的文件mSceneControl . SceneViewer. GetSnapshot (Width , Height ,esri3DOutputimageType . JPEG, sFileName);MessageBox Show(保存图片成功! ”);mSceneControl . Refresh ();2.2场景浏览有两种方法定制场景的浏览,第一种方法是利用arcgis的向导, 定制常用的浏览方法,如漫游、放大、缩小等等

17、,该方法简单,并且 不需要编写代码,第二种方法是通过添加代码的方法更改场景的 CurrentTool属性,从而实现场景浏览的功能,下面对以上两种方法 一一介绍:第一种方法:第一步:添加ToolbarControl控件,该控件位于“工具箱”中 的“ ArcGIS Win dows Forms ”选项中,把它的名字设置 为”mToolbarControl ”,将“ Dock ”属性设置为“ Top ”,并将其 Buddy属性设置为mSceneControl,设置方法与mTOCControl控件 相同。第二步:进入“ mToolbarControl ”属性对话框中的“ items ” 页面,并单击“

18、 Add”按钮。弹出Con trol Comma nds 对话框,在 Co ntrol Comma nds 对话框中选中“ Category ”列表框中的“ Sce ne 选项,在“ Comma nds ”列表中就会出现与“ Sce ne ”关联的命令, 双击命令就可以将该命令加入到“ mToolbarCo ntrol ”工具条中, 如下图:图5 mToolbarControl属性对话框Controls CommandsCOIL ft iCltla Toolsets M enus P alett ezCategpryCCommandsZTaaiur* SlciianGaneric rlcbJ

19、: EatpaiLdFOVGlob Inqiiiry Crap hi c El em eJit InkMILKap InquiryNap Fvi gall gJIstw*rk AnalystServicesF堂说 一断面分迁中铁二観插件棄FlyF-ulLExtentNarrowFOy心 Navi gatefjgf Ojj 昌:id o cum ent JF辺e Slec iFealures R Selec tGraphi cs .SetOb serverT urge tC&alerT ar gg t2non21Add From File,.C1qs&Use double click or dr

20、直霞 *nd drop to ald i tarrtE.图 6 Co ntrol Comma nds对话框第二种方法:第一步,加入C#工具条(ToolStrip控件),并将其“ Dock ”属性设置为“ Top ” ,第二步,在工具条中加入按钮,并为按钮添加事件,并写入事件 处理程序,其代码如下:/*/*工具条Zoomln”按钮按下事件*/*/将场景的缩放private void ZoomIn_Click (object sender, EventArgs e)/创建命令ICommand pCommand= new ControlsSceneZoomlnTool ();pCommandOnCr

21、eate (mSceneControl . Object );/将当前工具设置为缩放工具mSceneControl . CurrentTool = pCommandas ITool ;pComman= null ;/刷新mSceneControl . Refresh ();本例仅以缩放为例,其他浏览工具与此相同SeeneControl控件中常用的浏览功能如下:类名功能Con trolsSce neFlyTool (Co ntrols)飞行Con trolsSce neFullExte ntComma nd (Con trols)全景视图Con trolsSce neNavigateTool (

22、Co ntrols)导航Con trolsSce neOpe nDocComma nd (Co ntrols)打开文档Con trolsSce nePa nTool (Con trols)漫游Con trolsSce neZoo mln Tool (Con trols)放大Con trolsSce neZoomOutTool (C on trols)缩小2.3点查询功能点查询是通过鼠标点击事件来获取要素的方法,该功能是三维系 统最常见的方法,aregis中提供的LocateMultiple 可以很方便的实现 点查询功能,以下对点查询功能做详细的介绍:第一步,在主窗口中添加一个CheckBox控

23、件,并命名为 mPointSearch,如图7所示,该控件控制是否进行点查询操作。图7添加CheckBoX空件第二步,新建一个 Win dows窗口,命名为ResultForm,并将Text属性改为“查询结果” ResultForm 窗口中有一个TreeView控件,该控件以树状形式显示了查询的结果,如图 8所示:r昭理诲琴果1=旦| arwclp2915560431=4115504, 5073T459Z=-4. 54T4T3508S64&4E-13 fill UShap e: Sys t em. _U omU bj e c tId: 2ITAME:clip2j vip&ints pointX

24、=596758h 5=4115516 25Z=DFID:1176e : ystem“ ComOtJ ectAJREA:OrERIMETER.OmOIHTS#.O图8 ResultForm窗口布局第三步,为MainFrom添加私有成员函数private ResultForm mResultForm,并初始化。为mSceneControl控件添加鼠标按下事 件OnM ouseDow n,并加入如下代码:/*/*mSceneControl的 OnMouseDow事件*/*/II处理点查询private void OnMouseDow(object sender, ISceneControlEvent

25、s_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没

26、有选中对象”);else/显示在ResultForm控件中。mHit3DSet为查询结果集合mResultForm. Show();mResultForm. refeshView (mHit3DSet);mSceneControl . Refresh ();第四步,在ResultForm中显示结果结合,其代码如下:/显示结果集合public void refeshView (IHit3DSet pHit3Dset )/用tree控件显示查询结果mTreeView. BeginUpdate ();/清空tree控件的内容mTreeView. Nodes. Clear ();IHit3D pHit

27、3D;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. Adc( pLayer. Name; node. Nodes.Adc(X=+pHit3D .Point. X.ToStr

28、ing();node. Nodes.Adc(Y=+pHit3D .Point. Y.ToString();node. Nodes.Adc(Z=+pHit3D .Point.乙ToString();/将该图层中的所有元素显示在该树节点的子节点if ( pHit3D . Object != null )if ( pHit3D . Object is IFeature )IFeature pFeature = pHit3D. Object as IFeature ;int j ;/显示Feature中的内容for ( j = 0; j .LTag图10设定mTINTyp复选框下拉菜单的内容为Refr

29、eshLayer按钮添加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 =

30、null ;/将所有的图层的名称显示到复选框中for ( i = 0; i nCount; i +)pLayer = mSceneControl . Scene. get_Layer (i ); mLayerCombox Items . Adc( pLayer. Name;/将复选框设置为选中第一项mLayerCombox Selectedlndex = 0;addFieldNameToComboX mLayerComboxItems mLayerComboxSelectedlndex . ToString ();为 mLayerCombox 控件添加 Selected In dexCha n

31、ged事件,其代码如下:/*/*mLayerCombox的SelectedlndexChanged 事件*/*/private void OnSelectIndexChange (object sender, EventArgs e)addFieldNameToComboX mLayerComboxltems mLayerComboxSelectedlndex . ToString ();/更加图层的名字将该图层的字段加入到combox中private void addFieldNameToComboX string layerName)mFeildCombox. Items . Clear

32、();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) / 找至U了

33、 layerName 的 FeaturelayerpFeatureLayer = 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;m

34、FeildCombox. SelectedIndex = 0;为ConstructTin按钮添加Click事件,其代码如下:/*/*ConstructTin按钮的Click事件*/*/创建Tinprivate void ConstructTin_Click (object sender, EventArgs e)if ( mLayerComboxText = | mFeildCombox. Text = )/ 判断输入合法性MessageBox Show(没有相应的图层”);return ;ITinEdit pTin = new TinClass ();/ 寻找 FeaturelayerIFe

35、atureLayer pFeatureLayermSceneControl . Scene. get_Layer (mLayerComboxSelectedlndex ) as IFeatureLayer ;if (pFeatureLayer != null )IEnvelope pEnvelope = new EnvelopeClass ();IFeatureClasspFeatureClass = pFeatureLayer . FeatureClass ;pFeatureClassIQueryFilterIField pField/找字段pQueryFilter =null ;new QueryFilterClass ();pField.Fields . get_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论