AE开发实验报告

更新时间:2023-11-21 22:27:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验p2.2 使用控件创建第一个桌面应用程序 一.实验目的

1)掌握使用控件创建桌面应用程序的主要流程;

2)掌握mapcontrol控件、toc控件、toobar控件的特性及其与arcmap中的对应关系; 3)编写代码实现加载 mxd 文档、添加 shape 文件、鹰眼放大等功能; 4)掌握arcgis developer help查询接口帮助的方法。 二.实验内容

1)使用控件创建桌面应用程序的主要流程; 2)代码加载 mxd 文档 3)添加 shape 文件 4)鹰眼功能 三.实验步骤

3.1使用控件创建桌面应用程序

1)新建一个windows窗体应用程序(文件--新建--项目--windos窗体应用程序 )

2)设置项目保存位置及项目名称,在点了确定之后,在vs的工具箱中找到到和arcgis engine相关的控件

其中,axmapcontrol就是map地图控件,axpagelayoucontrol是布局地图控件,axtoccontrol是目录控件,axtoolbarcontrol是gis工具栏控件,axscenecontrol是scene三维场景控件,axglobecontrol 是globe 控件,axlicensecontrol 是许可控件,axsymbologycontrol控件,axarcreadercontrol 是arcreader 控件,axarcreaderglobecontrol 是arcreaderglobe 控件。axlicensecontrol是许可控件,一般gis系统中都必须添加,否则无法使用。

3)然后添加toc、map、toolbar、license 控件。license(许可)控件是首选的,否则其他控件无法使用,具体布局如下图所示

4)设置工程初始化时自动添加地图文档(map控件-右键-属性) 5) 设置buddy属性,使toolbar控件和toc控件与map控件的关联

6)在toolbar中进行设置(toolbar控件-右键-属性) 7)添加工具命令

在toolbar control上右键—属性在items选项卡中添加几个工具命令

添加结果如下:

8)运行我们的应用程序,发现下面的错误

出现这个问题的原因是因为arcgis 10 发生了变化,将 “esri.arcgis.runtimemanager.bind(esri.arcgis.productcode.engine)”语句添加到使用ao对象的前面,如放在main函数中,如下图所示:

9)上面工作完成之后,按f5键运行程序,运行成功之后出现以下界面

尝试使用工具栏上的工具,如打开文档、保存文档等命令,测试toolbar控件是否与

map控件相关联。

至此,我们的没有编写任何语句,只是使用一些arcengine控件,就可以搭建一个简单的arcgis桌面应用程序。

3.2 编程实现加载 mxd 文档 用代码添加mxd文档,用到axmapcontrol.loadmxfile(sfilepath),我们只要将mxd文档的路径传给这个方法即可。我们添加一个按钮,把text属性改为“加载mxd文档”,如下图所示:

编写“打开mxd文档”按钮的单击事件代码,如下图所示: 单击f5运行程序,效果如下:

单击“加载mxd文档”按钮,打开一个mxd 文档

效果如下:

3.3编程实现添加 shape 文件

类似实现“打开mxd文档”操作,在主窗体中添加一个“添加shape文件”按钮

编写“添加shape文件”按钮单击事件代码:

编写上述代码中涉及到的“openshapefile”函数,实现shapefile文件路径和文件名的提取并通过数组形式返回值

单击f5,运行程序

单击“添加shape文件”按钮,尝试添加一个shapefile文件。

3.4 编程实现鹰眼功能 分析:鹰眼图的操作主要由以下几个动作,当在一个控件中移动一幅图的时候另一控件中的图也发生变化,当在主控件中重新加载一幅图的时候,另外一个控件的图也发生相应的变化,同时我们在鸟瞰的控件中加入一红色边框,注意这个其实是一个面,只是填充的颜色是透明的而已。通过分析我们知道,我们要添加两个mapcontrol控件,名字分别是axmapcontrol1和axmapcontrol2,其中axmapcontrol1为主图,而axmapcontrol1为鸟瞰图。 1)在主窗体上添加一个axmapcontrol控件,作为鹰眼功能的鸟瞰图。

2)编写主图axmapcontrol1中axmapcontrol1_onfullextentupdated响应事件代码,实现当主图中显示的范围改变时,鸟瞰图中相应的出现一个红色的矩形框,表

示主图中的显示范围

3)编写主图axmapcontrol1中axmapcontrol1_onmapreplaced事件响应代码,实现当主图范围改变时,鸟瞰图的范围相应的发生改变。

对于鸟瞰图axmapcontrol2控件,我们需编写axmapcontrol2的onmousemove和onmousedown中分别添加以下代码,实现鸟瞰图对主图的控制。

单击f5,运行效果如下图所示:

四.课堂任务

4.1增加一状态栏,当地图放大缩小后显示图幅范围坐标值。 1)在主窗体中添加一个statusstrip(状态栏)控件。

2)右击statusstrip1控件,在弹出的菜单中单击选择“edit items”,如下图所示: 3)在弹出的“items collection editor”对话框总单击add按钮,添加三个状态项目成员,并把“toolstripstatuslablel1“text属性改为“当前图幅信息”,如下图所示:

4)在主图(axmapcontrol1)axmapcontrol1_onfullextentupdated事件中添加如下代码,实现当主图的图幅范围改变时,状态也相应的显示出当前图幅的信息。

按f5运行程序,效果如下所示:

五.实验小结

实验p2.3 访问地图范围及属性表 一.实验目的

1)掌握ienvelope、igraphicscontainer、 iactiveview、ilayer等接口; 2)掌握datagridview、下拉菜单等界面控件; 3)指定颜色、指定线型、面符号等绘制矩形框; 4)修改代码错误;

5)读取属性表字段名称、记录内容等; 二.实验内容

编程实现显示属性表的信息。 三.实验步骤

3.1编程实现显示属性表的信息

1)在主窗体上添加一个“contextmenustrip“(上下文)控件。

右击“contextmenustrip1“控件,选择”edit items“

在弹出的“items collection editor“对话框中,单击add按钮,添加一个打开属性表菜单

2)右击工程名称,在弹出的菜单中选择添加新项 在弹出的“add new item”对话框中选择“windows form”,并把“name”改为属性表。

在”属性表”窗体中添加一个“datagridview”控件,并通过点击“datagridview”控件右上角的三角图标,为“datagridview”添加一条属性列。

编写axtoccontrol1控件右击响应事件代码,实现当在axtoccontrol1控件上右击时,弹出打开属性表菜单。

首先定义两个全局变量,如下图所示:

其次编写axtoccontrol1控件右击响应事件代码,如下所示: 编写“打开属性表“单击事件代码,实现当单击“打开属性表“菜单时,弹出相应feature

属性表

在属性表窗体中定义一个全局变量pfeaturelayer,实现主窗体与属性窗体之间的值传递

修改属性表窗体的构造函数,实现属性表窗体的初始化

编写“public void itable2dtable()“函数,实现往”dtgridview“控件上添加相应要素的属性记录

编写上述代码中涉及到的“public static string parsefieldtype(esrifieldtype fieldtype) “函数,实现相应字段的类型转换

在“属性表“窗体的构造函数中引用” public void itable2dtable() 对函数的调用

按f5运行程序,程序运行效果如下所示: “函数,实现 四.课堂任务 优化程序:

1)打开文件中,将文件路径指定到程序运行的当前目录;

在这里,我们只需把“openshpfile.initialdirectory”的值改为 “environment.currentdirectory.tostring()”即可,如下图所示:

运行效果如下所示:

2)当打开文件对话框,操作为取消后,程序出错,请修改该错误;

在这里我们可以这样修改,把“public string[] openshapefile()”函数中代码,直接搬到“添加shape文件”按钮单击事件代码中,并稍作改动,如下图所示:

这样,我们就避免了当操作位取消时,程序运行出错的状况。 3、编写代码实现,统计属性表的字段数目和记录数目

在属性表窗体中添加两干个label控件、两个textbox控件和一个button控件,布局如下图所示:

编写“查询”按钮单击事件响应代码,实现在响应的textbox控件中显示特定的内容,如下图所示:

按f5运行程序,效果如下图所示:

五.实验小结

p2.4 命令、工具与命令条 一.实验目的

1)掌握命令、工具、工具控件的异同; 2)掌握用代码将命令宿主到控件上; 3)掌握自定义命令按钮的编写;

4)掌握脱离toolbarcontrol控件的命令和工具; 5)掌握地图视图和布局视图的同步;

二.实验内容

2.1 将一个命令宿主到 toolbarcontrol 控件上; 2.2 自定义命令按钮;

2.3 脱离 toolbarcontrol 控件的命令和工具 2.4 布局视图与地图视图同步; 三.实验步骤

3.1 将一个命令宿主到 toolbarcontrol 控件上;

1)在主窗体中添加一个button控件,将其text属性设置为“将一个命令宿主到 toolbarcontrol 控件“,如下图所示:

编写“将一个命令宿主到 toolbarcontrol 控件“按钮单击事件代码,如下图所示:

按f5运行程序,效果如下:

选择和命令对象协作的控件

新增一个全局变量 “pmapcontrol“

展开重载类方法,对其进行修改,使其能对hook进行判断

按f5运行程序,效果如下图所示:

3.3 脱离 toolbarcontrol 控件的命令和工具 添加一个menustrip(菜单)控件。

添加一个菜单项,命名为“添加数据“

编写“添加数据“菜单单击事件代码

按f5运行程序,运行效果如下图所示: 3.4 布局视图与地图视图同步; 分析:要实现这两个控件的联动,我们首先回顾下情景,两个控件的联动不仅是简单切换,在时候还因该保留各自上一些状态比如说当我们在mapcontrol 上有一个放大操作时,当我们没将这取消而切换到上有一个放大操作时,当我们没将这取消而切换到pagelayout 控件, 在pagelayout 控件上做 了一些操作后,又切换到mapcontrol 控件,我们应该还能进行放大操作而不用重新使用方法缩小工具。 通过分析我们可以得到下面几点:

当切换两个控件的时候,地图的同步各自控件上激活的工具或者命令的保留 当存在toc控件和toolbar控件的时候,切换了地图控件和布局控件,那么这两个控件的伙伴控件也应发生变化。

具体实现步骤如下:

1)在form中添加tabcontrol控件,分别将地图控件和布局控件放置到里面,如下图所示:

2)为了保持地图视图和布局视图的同步,新增类

3.3根据几何条件查询对象 3.3.1 点查询

1) 创建“根据几何条件查询“菜单

2)编写“根据几何条件查询”单击事件响应代码,实现查询条件的切换

在主窗体上添加两个radiobutton控件,并把name属性分别设置为pointradiobutton和polygonradiobutton,用来控制几何查询的查询模式:

定义一个全局变量doqueryindex,用来表示当前要执行的查询模式:点击查询还是拉框查询。如果值为1表示点击查询,如果值为2表示拉框查询,默认其值为0,不执行任何操作。该变量定义如下

点击范围可以通过axmapcontrol的onmousedown()事件来执行,在

axmapcontrol中按下鼠标即可获得点击位置,通过查询该位置的数据对象即可,编写axmapcontrol的onmousedown()事件响应代码,如下图所示:

运行程序,点查询效果如下:

3.3.2 多边形查询

分析:查询首先还是要绘制面的几何图形,然后通过ifeatureclass或 ifeaturelayer的search()方法来执行查询,其方式和点击查询完全相同,只是绘制几何图形的方式不同。

采用拉框范围查询方式,在axmapcontrol控件的onmousedown()事件中记录鼠标点击位置,同时在onmousedown()事件中绘制这样一个面区域。

1)全局变量定义:在全局中定义变量pointcollection,其为ipointcollection对象,它用于保存每次axmapcontrol控件的onmousedown()事件中点击的鼠标位置,如下图所示: 2)定义绘制面函数:由于在点击鼠标的同时,还要显示已经绘制的面的范围以便用户更好的选择查询区域,所以需要定义一个绘制面的函数drawpolygon(),其代码如下: 3)记录面的边界点:由于每次在axmapcontrol上点击鼠标表示该为面创建一个边界点,所以在onmousedown()事件中要添加该点到变量pointcollection中去,同时绘制已经形成的面。故在axmapcontrol1的onmousedown()事件中继续添加如下代码:

4)运行程序:多边形查询效果如下所示: 3.4空间查询并创建table

1)在主菜单上添加添加“空间查询和创建表”菜单

2)编写“空间查询和创建表”单击事件响应代码

3)编写上述代码中所涉及的search类(详细代码见源程序) 运行程序,效果如下图所示:

空间查询及创建表 在arcmap中查看查询结果

四.课后任务

4.1 参照3.4使用其他的空间运算条件,对空间关系进行查询并输出表。 五.实验小结

实验p2.9 空间分析 一.实验目的

1.1理解并掌握和空间分析相关的接口;

1.2编程实现矢量图层叠加分析功能(intersect); 1.3编程实现空间包含统计功能(统计面要素内部点的个数); 1.4编程实现空间临近分析功能(输出邻接矩阵); 1.5编程实现空间缓冲功能;

二.实验内容2.1 输出两个矢量图层的交集(intersect); 2.2 包含统计(统计面要素内部点的个数) 2.3 临近分析(输出邻接矩阵) 2.4 缓冲显示; 三.实验步骤

3.1输出两个矢量图层的交集(intersect); 1)在主窗口上创建“相交运算(intersect)”菜单

2)编写“相交运算(intersect)”单击事件响应代码:

3)编写上述代码中所涉及的getfeatureclass和intersect函数。其中: getfeatureclass函数:获取e盘的矢量数据图层; intersect函数:根据指定文件路径和文件名输出求交结果。

4)添加引用“using esri.arcgis.datasourcesfile“,使系统能识别 ”shapefileworkspacefactoryclass“

5)运行程序,效果如下:

3.2包含统计(统计面要素内部点的个数) 1)在主窗体上添加“包含统计“菜单

2)编写“包含统计”菜单单击事件响应代码(详见源程序) 3)编写上述代码中所涉及的createtable函数(详见源代码)

4)运行程序,包含统计演示效果如下: 运行效果

arcmap中查看效果

3.3临近分析(输出邻接矩阵)

1) 在主窗口中创建“邻接矩阵”菜单

2)编写“邻接矩阵”单击事件代码(详见源代码)

3)编写上述代码中涉及的createweighttable函数(详见源代码)

4)运行程序,效果如下:

包含矩阵示意图

运算结果 3.4缓冲显示;

1)在主窗口中创建“缓冲显示”菜单

2)声明全局变量dobuffer ,并设置其初始值为0; 3)编写“缓冲显示”菜单单击事件代码(详见源程序)

运行程序,缓冲显示效果如下图所示:

受影响要素 四.课后任务

4.1改写3.1求交叠置(intersect)代码,实现其他任意一种矢量图层叠置功能。如求和叠置(union)、擦除叠置(erase)、同一性叠(identity) 、更新叠置(update) 、异或叠置(symdiff)等。

4.2改写3.2代码实现下列除contains以外的任意一种空间关系检查功能,并创建相关数据对代码正确性进行检验。

4.3参照3.4缓冲显示效果,对数据图层做缓冲分析

4.4实现itopologicaloperator接口的其他任意功能,并创建相关数据对代码正确性进行检验。 五.实验小结

实验p2.10 符号化 一.实验目的 二.实验内容

2.1编程实现图层的单一值符号化; 2.2编程实现图层的唯一值符号化; 三.实验步骤

3.1 唯一值符号化

1)创建“唯一值符号化”菜单

2)编写“唯一值符号化“菜单单击事件代码

3)编写上述代码中所涉及的“singlesymbolcmd”实现命令代码(详见源程序)

4)添加一个窗体,命名为“uniquevaluessymbol“

5)为“uniquevaluessymbol“窗体添加相应的控件,布局如下图所示:

仿照第四步,在该工程中再添加一个窗体,命名为“colorrampform “,该窗体主要用来选取相关的颜色。

给该窗体添加相应的控件,布局如下图所示: 按f5运行程序,效果如下所示:

四.课后任务

4.1 使用代码移植功能,从“chap.06--空间数据的可视化表达“源程序中移植专题图制作相关代码。

4.1.1 分类符号化代码移植1)在主窗体中创建“分类符号化“菜单 复制” chap.06--空间数据的可视化表达”中分类符号化单击事件响应代码本根据实际情况做相应的改变

右击工程名称,选择“添加已存在的项目“

在添加已存在的项目中,选择“classbreaksrenderersymbolcmd “项目 修改“classbreaksrenderersymbolcmd “项目命名空间为” ae开发_zhm “

同样的方法,再引入“classbreaksrenderersymbol “窗体项目 修改“classbreaksrenderersymbol “窗体项目的命名空间

引入“getsymbolbycontrol “窗体项目 修改其命名空间为“ae开发_zhm “

运行程序,效果如下所示: 五.实验小结

实验p2.11 面向对象编程相关内容 一.实验目的

1.1掌握面向对象编程中的重要概念;

1.2理解与类的相关概念及使用(分部类、抽象类、密封类、构造函数、析构函数); 1.3理解c#中的访问修饰符及正确使用;

1.4了解面向对象编程的重要特征(继承、多态、接口)及在实际中的应用。 二.实验内容

2.1使用c#语句定义一个电话类phone; 2.2定义一个类并使用类的成员变量; 2.3使用类的构造函数与析构函数; 2.4编程实现类的继承。

2.5编程实现类接口的实现。三.实验步骤 3.1定义一个电话类phone

1)新建一个控制台应用程序,命名为“面向对象相关内容-zhm”

单击工程名称,选择add,选择 class

在弹出的添加新项对话框中,给新类命名为phone 在phone类的大括号的主体部分中为类定义两个成员变量

至此,一个简单的类的定义已经完成,该类只有简单的变量,没有相应的方法 3.2使用类的成员变量

1)在3.1phone类的基础上为phone类添加一些变量和方法,如下图所示:

代码解析:其中,“private string brand”是一个私有成员变量,用来表示电话的品牌;“public string brand”是“brand”字段的属性,可以使用其get属性获得一个特定的值,也可以使用set属性定义一个特定的值;public void dial()是一个无参数的方法,用于表示打电话的功能;public void dial(string number)是一个有有参数的方法,可以设置电话号码;public static void emergencycall()是一个静态的方法,可以不进行实例化而直接使用,表示拨打紧急电话。

2)在program.cs的main方法中输入以下代码以实现类成员的调用

代码解析:phone.emergencycall()是一个静态成员方法,所以可以直接对其调用,其他方法可以的调用必须先进行相应的实例化,如phonenumber方法、dial方法等等。 3)运行程序,结果如下所示:

3.3使用类的构造函数与析构函数; 1)新建一个类,命名为point

2)在point类中加入相应的成员变量及方法,如下所示:

代码解析:其中int x、inty是point类的属性项,public point()是无参数构造函数,public point(int val_x, int val_y)是有参构造函数,~point()是析构函数。 3)在program.cs的main方法中输入以下代码以使用point类的成员 按f5运行程序,效果如下所示:

3.4定义基类person,然后派生student子类,学会继承的使用 1)定义基类person

2)在基类person中加入一些成员变量及相应的方法 代码解析:其中,public person(string name, int age, string gender)是构造函数、public void display()是父类共有的方法、其他的都是对应的属性项。 3)定义子类student,继承于基类person。

3)向子类student中添加相应的成员变量

代码解析:其中,public student(string name, int age, string gender):base(name,age,gender)构造函数是调用父类的构造函数,public void study()是自己独有的方法。

4)在program.cs中的main方法中添加如下代码,实现对类的使用

代码解析:其中,objstudent.study()是调用子类方法,objstudent.display ()是访问父类方法。

运行程序,结果如下所示:

3.5编程实现类接口的实现。

1)声明接口ipoint描述一个点的坐标 2)为该接口定义相关的成员变量

3)从接口ipoint派生一个类point1,实现ipoint接口 4)为point1类添加相应的成员变量,如下图所示:

5)在program.cs中输入代码测试接口。

运行程序,效果如下所示:

四.课后任务 五.实验小结

本文来源:https://www.bwwdw.com/article/jnrv.html

Top