1中国矿业大学2012级地信1班实验报告课程名称GIS设计与开发上机时间2015年6月18日学生姓名田雨蒙学号07122976任课教师张海荣中国矿业大学环境与测绘学院成绩1目录实验目的------------------------------------------------2实验内容------------------------------------------------2实验要求------------------------------------------------2实验步骤------------------------------------------------21、使用控件创建第一个桌面应用程序-----------------------------22、地图打开与保存--------------------------------------------133、缩放与漫游------------------------------------------------错误!未定义书签。64、属性查询--------------------------------------------------错误!未定义书签。75、空间查询--------------------------------------------------186、建立地理空间数据库----------------------------------------19实验代码-----------------------------------------------22实验小结-----------------------------------------------282实验目的熟悉VisualStudio开发环境,掌握ArcGISEngine的组件式开发方式,掌握GIS基本功能的开发方法。实验内容以ArcObjectsfor.NET为开发包,用C#高级程序设计语言二次开发一个包含GIS基本操作的应用程序,实现地图文档的打开、保存、地图缩放/漫游,属性查询,空间查询,建立并访问地理空间数据库,TOC控件的右键菜单,添加shape数据,栅格数据等。实验要求1、完成代码的编写工作,通过对示例代码的学习,把这些分散的代码相互粘合起来,形成一个能实现常用GIS功能的应用程序。学会VisualStudio2010代码常用调试方法,学会QueryInterface。2、了解利用ComGIS进行应用型地理信息系统建设工作的基本思路。3、独立实验,认真、按时完成实验报告。代码编写过程中,同时思考以下问题:(1)数据源如何被加载访问的?ArcGIS数据组织方式?(2)ArcGISEngine开发中所涉及的面向对象知识中诸如类,继承,对象,接口等如何表达的?实验步骤1、使用控件创建第一个桌面应用程序①在开始菜单中找到MicrosoftVisualStudio2010(简称VS),打开新建一个Windows窗体应用程序(文件--新建--项目--Windows窗体应用程34②在VS的工具箱中找到和ArcGISEngine相关的控件。其中,AxMapControl就是Map地图控件,AxTOCControl是目录控件,AxToolbarControl是GIS工具栏控件,AxPageLayouControl是布局地图控件,AxSceneControl是Scene三维场景控件,axGlobeControl是Globe控件,AxLicenseControl是许可控件,AxSymbologyControl是符号选择器。5③然后添加TOC,Map,Toolbar控件。许可控件是首选的,否则无法使用。点击窗体的标题栏处选中窗体,拖动窗体至合适的大小。拖动工具箱容器里的Panel控件至窗体(默认Name为panel1),右键属性调整Dock为Top;拖动分栏控件SplitContainer至panel1下面,调整Dock属性为Fill。添加完这几个控件后,VS会自动为我们添加一些引用。打开菜单栏中视图-错误列表,可以看到虽然没有错误,但是有一堆警告。根据警告,找到引用中对应的组件名称,右击-属性,把嵌入互操作类型由True改为False。重复,直至全部修改完毕。67④在工程项目目录的引用点击鼠标右键,在弹出菜单中选择添加引用。在添加引用对话框中找到ArcGISEngine开发包安装的路径,在DotNet文件夹下面双击要引用的组件即可。8⑤添加地图文档(Map控件-右键-属性)⑥Toolbar控件和TOC控件与Map控件的关联(设置Buddy属性)。Toolbar控件和TOC控件需要一个伙伴控件协同工作,因此都有一个Buddy属性。伙伴控件可以是MapControl,PageLayoutControl,SceneControl或者globeControl控件。91011⑦添加工具命令(Toolbar控件-右键-属性-Items选项)⑧在VS空白处右键单击在弹出菜单里选择“标准”工具条,将其加载到工具栏。点击启动调试按钮,运行我们的应用程序,发现下面的错误。12⑨运行结果132、地图打开与保存①从工具箱中的菜单和工具栏把MenuStrip工具条拖到panel1里,新建文件菜单,在子菜单里新建“打开mxd”项,修改属性Name为OpenMxd,。②在属性对话框中单击事件按钮,找到OpenMxd的Click,在蓝色区域双击,便建立了OpenMxd的Click事件的委托处理函数。添加如图所示代码。14③运行程序,查看结果。提示:在添加代码时,错误列表若有错误,按提示添加相关类的引用以及修改嵌入互操作类型。④与打开mxd类似,新建保存菜单,在保存菜单的单击事件的委托处理函数中添加代码:15⑤运行程序,查看结果163、缩放与漫游①在菜单栏添加放大菜单,命名为ZoomIn,双击添加鼠标单击处理委托。同理,添加缩小,漫游,全图菜单,分别命名为ZoomOut,Pan,Extent。②添加axMapControl1的OnMouseDown事件处理函数。③添加代码如下。说明:flag是用来标记当前操作;174、属性查询①在菜单栏中添加属性查询,Name修改为AttributeQuery,双击添加Click事件处理函数AttributeQuery_Click。②在工程项目myFirstGISProgramme右击,添加Windows窗体,Name改为AttributeQueryResult,Text改为属性查询结果,从工具箱的Data项添加datagridview,设置Dock为Fill。在类和AttributeQuery_Click中添加代码添加代码如下。18③运行查看结果5、空间查询①在菜单栏空间查询里新建点选,矩形选取等子菜单项,双击添加Click处理函数,设置flag标记当前操作。②在axMapControl1_OnMouseDown里添加主要代码如下:③运行查看结果19六、建立地理空间数据库①打开ArcCatalog,新建文件夹连接到要创建PersonalGeodatabase的文件夹下面,新建PersonalGeodatabase,并重命名。②导入shape数据,在GP导入数据成功后,一个个人空间数据库就建好了。20③在工程项目中添加ESRI.ArcGIS.DataSourceGDB,ESRI.ArcGIS.Geodatabase,ESRI.ArcGIS.Display的引用。④在菜单栏添加打开mdb数据库的菜单,在Click事件处理委托函数中添加代码21⑤运行查看结果22实验代码usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.IO;usingESRI.ArcGIS.Carto;usingESRI.ArcGIS.Analyst3D;usingESRI.ArcGIS.Controls;usingESRI.ArcGIS.Display;usingESRI.ArcGIS.esriSystem;usingESRI.ArcGIS.Geometry;usingESRI.ArcGIS.GlobeCore;usingESRI.ArcGIS.Output;usingESRI.ArcGIS.SystemUI;usingESRI.ArcGIS.DataSourcesGDB;namespacemySecondGISProgramme{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}privatevoidOpenMxd_Click(objectsender,EventArgse){OpenFileDialogopenFileDialog=newOpenFileDialog();openFileDialog.Title=打䨰开amxd文?档̦Ì;openFileDialog.Multiselect=false;openFileDialog.Filter=*.mxd|*.mxd;openFileDialog.RestoreDirectory=true;if(openFileDialog.ShowDialog()==DialogResult.OK){try{IMapDocumentmapDocument=newMapDocumentClass();boolisPasswordProtected=23mapDocument.get_IsPasswordProtected(openFileDialog.FileName);if(!isPasswordProtected){axMapControl1.LoadMxFile(openFileDialog.FileName,0,string.Empty);}}catch{MessageBox.Show(打䨰开a地Ì?图ª?文?档̦Ì失º¡ì败㨹!ê?+openFileDialog.FileName);}}}privatevoidSaveMxd_Click(objectsender,EventArgse){if(axMapControl1.Map.LayerCount=0){}else{IMxdContentsmxdContents=axMapControl1.MapasIMxdContents;IMapDocumentmapDocument=newMapDocumentClass();mapDocument.Open(axMapControl1.DocumentFilename,);IActiveViewactiveView=axMapControl1.MapasIActiveView;mapDocument.ReplaceContents(mxdContents);if(mapDocument.get_IsReadOnly(mapDocument.DocumentFilename)==true){MessageBox.Show(本À?地Ì?图ª?文?档̦Ì是º?只?读¨¢的Ì?,ê?不?能¨¹保À¡ê存ä?!ê?);}else{try{mapDocument.Save(true,true);MessageBox.Show(地Ì?图ª?文?档̦Ì保À¡ê存ä?成¨¦功|!ê?);}catch{}24}}}intflag;privatevoidaxMapControl1_OnMouseDown(objectsender,ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvente){IE