《GIS程序设计》实习报告姓名学号指导教师专业地理信息系统所在院系理学院地球科学系二0一四年六月二十三日2目录实习一创建与调用AOI书签………………………………………3实习二地理数据列表显示…………………………………………18实习三对地图进行简单图层渲染…………………………………32实习四地图的页面布局及打印……………………………………41实习五地图的制图文件输出………………………………………47实习六创建一个Shape文件………………………………………54实习七地理要素的编辑……………………………………………62实习八空间关系查询………………………………………………67实习九缓冲区分析…………………………………………………73实习十地图要素的数据统计………………………………………793实习一创建与调用AOI书签一、实习目的1.通过简单的实习操作,熟悉在VisualStudio10环境下运行ArcGISEngine;2.掌握对地图的简单操作处理,即空间书签的创建;3.能够通过代码实现书签的功能,并进行合理的调用;4.能够在思想掌握上述操作的基础上进行功能性拓展。二、实习概况与要求地图是一幅庞大的图幅,我们不可能且条件也不允许我们在进行局部具体操作时通篇考虑全图的信息,当然特殊全局需求分析除外,因此我们就需要一种手段来实现局部地图的显示、操作与输出,也就是所谓的空间书签,通过它可以进行快速的定位,并指向我们所需要的版块。书签分为AOI书签与特征书签。前者记录用户所关心的一个范围;后者则记录用户所关注的一个特征。本次实习主要进行第一种书签的操作。用户可以通过地图的IMapBookmark接口,可以访问其空间书签,并进行增加与筛减。所有的空间书签对象都实现了ISpatialBookmark接口,它定义了各种书签所有的公共功能。ZoomTo函数通过IActiveView::Extent改变地图的显示范围。因此,我们实习的内容便是在原有给定功能的基础上进行合理的开发,并通过代码实现相应的功能。正确的创建空间书签并根据需求进行合理的调用与索引,在此基础上考虑更好的实现其功能并进行适当的改进与整合,也即功能的拓展与应用。三、实现思路与过程(一)添加控件和类库引用图1创建项目工程4图2MapControl属性进行选择操作地图文件图3初始运行结果正常显示图4菜单栏添加新的MenuItem5图5具体参数属性设置如下图所示图6菜单栏再次新建ComboBox图7具体属性设置如下6其中,miCreateBookmark用于稍后调用“创建书签”窗体。cbBookmarkList用于保存已创建的书签,并在选中某书签名时,改变当前地图视图到特定书签视图。图8为项目添加引用图9选择具体的类库引用并添加同时需要在主窗体中添加该类库的引用。具体语句为:在添加后我们注意到,Path类的调用出现问题,需要做出具体类库引用的修改,具体修改是:7在Path前添加系统类库的引用,如下:(二)添加“创建书签”函数在菜单栏中创建的“创建书签”项目,需要对其功能进行具体的实现。即通过具体的接口进行地图视图的范围选择,并进行访问。同时需要将原有的书签添加到组合框中,以便后续的调用使用。具体的代码实现如下:(三)添加“书签名称设置”窗体进行窗体添加时,需要在项目菜单下选择Windows窗体选项。该窗体用于获取用户定义的当前书签的名称,并向主窗体传递。图11窗体的新建与重命名8图12窗体的显示可以根据需要进行具体参数的设置图13添加文本框与按钮如视图双击上述按钮的“确认”键转至代码区,添加一个主窗体类型的成员变量m_frmMain,并新建一个以主窗体类型对象为参数的构造函数,用于调用主窗体的相关成员。具体代码实现如下视图所示。9(四)实现创建书签与调用书签功能添加如下代码进行激活点击事件,使得窗体能够正常运行。为组合框cbBookmarkList生成“选择索引更改”事件相应函数。图14创建书签点击事件10图15书签列表框的选择索引变更事件添加代码,当组合框中被选中项改变时,地图将依据对应书签改变显示范围。四、核心代码(一)“创建书签”函数作为创建书签函数的声明。其参数sBookmarkName代表内容为输入的书签名,类型为字符串string。11此语句通过系统自带的接口IAOIBookmark创建一个变量aoiBookmark,其类型为IAOIBookmark,用于保存当前地图的范围。因为接口IAOIBookmark可以对如何AOI书签进行操作控制。通过IMapBookmarks接口访问当前地图,并向地图中加入新书签。将新建书签加入组合框中,用于之后调用该对应书签。(二)“书签名称设置”函数用于传入主窗体对象。“确认”按钮的点击事件响应函数,用于创建书签。(三)创建书签与调用书签“创建书签”按钮的点击事件响应函数,用于运行“确认书签名称”的按钮。访问地图所包含的书签,并获取书签序列。12对所包含的书签进行遍历,获取与组合框所选项名称相符的书签。五、运行效果如下图所示,首先要保证初始视图的完整,并在此基础上,选择在不同地图范围内创建书签,并尝试更改组合框的选择项,查看当前视图会否更改。如下图所示,当创建书签“上海”时,并选择特定区域。再次创建“东京”书签,并选择特定区域。我们可以在菜单栏的项目下拉单中选择已经创建的书签,可以发现视图会根据选择的书签漂移至指定书签视图。可以实现即时跳转。如此,即表明该空间书签的创建是成功的。图16最初显示地图信息13图17创建书签上海图18创建书签东京14图19选择下拉单的上海便成功转换当前视图六、功能拓展(思考题)当我们创建书签时,变换不同地图区域设定时,若命名相同的话,则无论现在哪个下拉单的书签都会不选择地显示第一个空间书签所对应的视图。所以,此书签的功能设定是不完善的,需要改进的。所以我们需要考虑空间书签重名的问题,并进行相应的显示。(一)空间书签重名的预防方法一:实现此功能,需要另外定义一个布尔类型变量b用于判断该书签名是否已存在。若存在则进行相关提示,并关闭该框体。若不存在同样进行相应的提示,并进行后续操作。具体的实现代码如下:其运行的结果如下图显示内容。15图20首次创建书签“天津”成功的显示信息图21第二次进行同名书签创建时提示信息16方法二:可以首先通过所有书签名的遍历,查看是否有与即将输入书签重名的内容。如果有则返回false,并作出相关提示。如果没有则允许继续进行后续的操作。具体代码如下:图22首次创建书签“上海”成功的显示信息17图21第二次进行同名书签创建时提示信息即当正常运行程序时出现恶意操作时,应该予以制止并提示相应的错误信息,才能够使得软件更加具有可操作性。才能满足用户在使用时,可以得知错误之处,提供时间与空间及时调整。18实习二地理数据列表显示一、实习目的1.通过简单的实习操作,增加对于地图不同图层组合的理解;2.掌握对地图增加控件并显示信息的简单操作处理,以显示相关地理数据;3.创建表视图的对话框,用于显示相关信息显示的操作,并通过列表控件进行显示处理等操作;4.在上述内容基础上进行拓展开发,如多图层信息任意要素所有字段的综合显示,以及数据类型转换的自定义实现等。二、实习概况与要求我们所看到的地图更像是一项庞大的工程,其包含着不同属性信息的多重图层,以使得地图可以包含更多内容的信息,即增加地图的载负能力。对于空间数据,在ArcGIS进行相应的读写操作,需要我们了解其数据内在组成以及可适用文件信息。ArcGIS可以读取多种空间数据,包括矢量、栅格以及Tin。它同样可以将空间数据与属性数据一起进行读取分析处理,使其集成在一个坐标系环境下进行操作;其可以读取的格式包括Coverage、Shape-file和CAD文件,以及基于文件和数据库的Geodatabase数据,和ArcXML。我们实习的内容便是在原有给定功能的基础上进行合理的开发,并通过代码实现相应的功能。正确的添加相应需求的控件,并根据需求进行合理的调用与信息显示。在此基础上考虑更好的实现其功能并进行适当的改进与整合,也即功能的拓展与应用。如任意要素类所有字段信息的列表显示或者自定义窗口的“数据格式转换”交互界面,实现数据类型的转换。三、实现思路与过程(一)添加控件在程序的主窗体中,首先创建“空间数据”菜单项,并可以将其根据命名规则命名为miSpaceData。并在其基础上设立下拉菜单,添加一个下拉菜单项。文本属性设定为“访问图层数据”,控件名称命名为miAccessData。以便用于稍后“数据展示台”窗体。图1数据访问菜单项19(二)添加“数据展示台”窗体在当前项目添加一个新的窗体类DataBoard.cs,用于根据用户不同的要求,展示相应的数据信息。图2添加当前项目的窗体选项图3添加窗体并命名添加后可以对该窗体的部分属性进行设置,使得其更好的显示。在此修订之后,需要向该窗体添加两个控件:一个文本框,用于显示当前显示数据的名称,控件名称为tbDataName;还有一个数据网格视图(DataGridView),修改只读为true。20图4添加控件后的操作台显示在此基础上,需要新建一个以String类型对象和DataTable类型对象为参数的构造函数,用于设置展示的数据表名和数据源。具体代码信息如下:(三)添加“数据操作”类图5添加类选项21如图所示,在当前项目下进行添加类DataOperator.cs,用于管理当前项目中涉及数据操作的相关功能。图6添加该类需要导入相关类库Geodatabase和DataSourcesFile,并添加引用。图7添加引用类库具体引用代码如下。22向类添加实现IMap接口的成员变量m_map,保存当前的地图对象,并新建一个以IMap接口对象为参数的构造函数,将当前地图对象传入类内,以添加创建好的Shape文件和要素。具体实现内容如下:(四)添加“获取地图图层”功能函数向类DataOperator中添加成员函数GetLayerByName,通过指定图层获取对应图层对象。具体代码如下:添加成员函数GetContinentsNames,获取地图中“Continents”图层,读取各个大洲的名称,并以DataTable类型返回。具体代码如下:23(五)实现创建地理数据列表功能为主窗体的“访问图层数据”菜单项生成“点击”事件响应函数,并添加代码运行“数据展示台”窗体,以展示各洲名称。具体代码实现如下:24四、核心代码(一)通过指定图层名获取对应图层对象要获取某一特定的图层内容的属性信息,我们需要根据需求选择该图层,也即需要对该地图的所有图层名称进行遍历查看是否存在与已知一致的图层。(二)获取图层并读取洲名首先,我们需要获取“Continents”图层,并需要通过特定的接口进行访问。并进行相应的判断。25如上述代码,显示对特定图层对象进行获取与保存时,需要通过不同的类型对象包括DataTable与DataColumn,存储在相对应的列集合中。当进行具体的引用时,需要考虑其属性表中各信息的所在字段。五、运行效果图8运行初始结果正常图9选择菜单栏的下拉选项26图10最终的运行显示结果从运行结果来看,基本功能是能够实现的。下拉菜单项正常显示,功能衔接完善。最终的结果输出显示均无误差。六、功能拓展(思考题)我们看到最终显示的结果只不过是指定要素中字段信息的列表显示,我们可以探讨拓展展到任意要素所有字段信息的列表显示。以更好的实现其属性列表的功能。拓展过程可以参考“GetContinentsNames”图层字段的信息显示,套用到其他信息的列表输出。(一)任意要素字段列表用ArcMap打开本实习所用的文档,查看Continent图层属性信息,以便用于稍后的显示输出。具体信息如下所示:图11查看Continent图层属性27我们知道,在输出名称时采用的方法是,就关联在DataTable的下一个DataRow将要素在序号和名称字段上的值赋予DataRow的对应列中。同理,同样感觉相互对应的列的信息,进行其他要素的输出。具体实现如下:再进行输出格式的匹配