秦坤AE实验报告.docx
《秦坤AE实验报告.docx》由会员分享,可在线阅读,更多相关《秦坤AE实验报告.docx(29页珍藏版)》请在冰豆网上搜索。
秦坤AE实验报告
学生实验报告
实验类型:
地理信息系统集成与开发
专业班级:
地信12-1班
学号:
2012300597
学生:
坤
指导教师:
明松老师
2015年11月10日
实验成绩评定表
指导老师评语:
成绩:
指导老师:
年月日
理工大学实验报告
实验课程名称:
地理信息系统集成与开发
开课院系及实验室:
测绘学院GIS设计室2015年11月10日
院系
测绘学院
专业班级
地信12-1班
姓名
坤
成绩
实验项目名称
地理信息系统集成与开发
指导教师
明松老师
实验一:
ArcEngine控件及核心类库的认识及Mapcontrol控件的使用和地图的显示与地图缩放以及TOCcontrol、toolbarcontrol控件使用
一.实验目的:
学习C#+ArcEngine组件开发;熟悉各种组件功能。
使用C#2010版本结合GIS组件ArcEngine10能熟练运用各种组件的开发功能。
二.实验容:
1、开发环境部署。
在开发ArcEngine程序之前,需要首先部署完成开发环境。
本课程选择C#语言为例,C#的集成开发环境选择VisualStudio2010,对ArcEngine开发环境的搭建需要遵循下面的步骤顺序进行:
安装VisualStudio2010
安装ArcGISEngineRuntime
安装ArcEngineDeveloperKit
过程截图如下:
2、ESRICONTROLS类库及Mapcontrol控件认识
(1)Control类库包含MapControl,PageLayoutControl,TOCControl,ToolbarControl,GlobeControl,SceneControl,LicenseControl,SymbologyControl等
(2)常用的类库包括:
SystemUILibrary;SystemLibrary;CartoLibrary;ControlsLibrary;
DisplayLibrary;GeoDatabaseLibrary;GeometryLibrary。
通过联机帮助,了解每个类库的概况
1)打开类库参考,查看对象模型图
启动ENGINE帮助,打开ArcObjectslibraryreference\esriControls打开对象模型图
OMD截图
OMDclassdiagramkey截图
2)从图中认识对象模型图中的三个类:
抽象类,组件类,普通类。
(从矩形框的形状识别)。
3)从对象模型图中,学习mapcontrol控件的接口及接口支持的方法。
OMD中的Mapcontrol组件类截图:
4)Mapcontrol控件的使用(C#环境)【每一步的截图及代码】
a)运行VS2010,启动VS2010集成开发环境。
b)新建一个ARCENGINE项目,如图所示,并命名为”第一个AE+C#程序”。
c)双击解决方案中的MainForm.cs
d)查看设计界面
e)查看运行效果
f)返回设计状态,在axTOCControl1控件上右击,选择属性(页)。
查看其与
axMapControl1控件的绑定情况
g)点击解决方案中的“查看代码”,了解命名空间的使用。
h)查看代码中的using:
(使用命名空间)。
尝试把其中的usingESRI.ArcGIS.Carto;
注释掉(如下图注释情况)。
然后运行,查看结果。
i)使用类库定位工具,定位该接口所在的类库。
j)将工具条控件与地图控件绑定,并为工具条控件添加更多的按钮。
5)运行,并加载数据,查看运行结果。
三、认识总结
了解了如何使用这些控件进行相应作业的过程,为以后的实验做下铺垫。
实验主要进行相关软件的安装以及相关控件的认识,在这个过程中我学会了相关软件的安装以及相关控件的认识,第一个实验是简单的安装与认识软件里面的基本控件,因为开始接触这门软件。
在安装过程中耗费了不少时间,好在后面都安装好了。
学习过程中遇到不少问题,好在老师的悉心指导和同学的帮助,最后完成实验。
实验二C#+ArcEngine程序设计入门:
地图浏览与图层控制
一、实验目的与要求:
电子地图的加载、缩放和漫游等浏览功能是空间数据可视化最基本的要求。
本次实验通过指导学生如何编写代码与MapControl控件交互实现基本的地图浏览功能。
实现方式有两种:
1.使用ESRI提供的封装好的现成组件类,编写简单的代码即可;2.自己写代码实现;需要理解地图浏览的编程思路。
通过两种实现方式,进一步了解Map控件的使用方法和组件式GIS集成与开发的思路和流程。
二、实验容:
1)启动VS2010集成开发环境,新建一个VC#项目:
Windows窗体应用程序。
2)在窗体上依次添加:
工具栏控件(toolStrip1)、分栏容器控件(splitContainer1)、容表控件(axTOCControl1)、地图控件(MapControl1)、开发许可控件(axLicenseControl1)。
3)设置容表控件和地图控件的DOCK属性为FILL,以充满整个区域。
4)为工具栏控件添加7个按钮(BUTTON),依次将其文本改为:
加载数据,放大,缩小,漫游,全图,缩小,放大,并设置相应图标。
将其NAME属性改为:
CmdZoomIn,CmdZoonOut,ToolPan,CmdFullextent,ToolZoomOut,ToolZoomIn
5)设计过程中的界面依次如下:
6)工具栏按钮包括:
CommandButtonandToolButton。
7)在FORM1窗体类中,添加一个方法EjectAllButton,用于维护ToolButton按钮的弹起状态。
代码如下:
privatevoidEjectAllButton()//弹起所有工具按钮的方法。
{
ToolPan.Checked=false;
ToolZoomOut.Checked=false;
ToolZoomIn.Checked=false;
ToolDrawLine.Checked=false;
ToolDrawPoint.Checked=false;
ToolDrawPolygon.Checked=false;
ToolSelectionByRectangle.Checked=false;
ToolInformationByPoint.Checked=false;
}
8)将三个工具按钮的checkonclick属性改为:
True。
9)在三个工具按钮的Click事件中,调用方法:
EjectAllButton,并将三个工具按钮的clicked属性设置为TRUE。
10)在按钮的点击事件和地图的鼠标按下事件中添加代码,实现对应功能。
代码如下:
privatevoidaxMapControl1_OnMouseDown(objectsender,IMapControlEvents2_OnMouseDownEvente)
{
IGeometrypgeo=null;
switch(DButton)
{
//如下按下了漫游按钮,则
caseDownButton.pan:
this.axMapControl1.Pan();
break;
//如下按下了绘点按钮,则
caseDownButton.drawpoint:
IPointpp=newPointClass();
pp.X=e.mapX;
pp.Y=e.mapY;
pgeo=ppasIGeometry;
DrawMapShape(pgeo);
break;
//如下按下了绘线按钮,则
caseDownButton.drawline:
pgeo=this.axMapControl1.TrackLine();
DrawMapShape(pgeo);
break;
//如下按下了绘多边形按钮,则
caseDownButton.drawpolgyon:
pgeo=this.axMapControl1.TrackPolygon();
DrawMapShape(pgeo);
break;
//如下按下了放大按钮,则
caseDownButton.zoomin:
this.axMapControl1.Extent=this.axMapControl1.TrackRectangle();
break;
//如下按下了缩小按钮,则
caseDownButton.zoomout:
//根据所画矩形与地图控件可见围的比例,进行缩放
IEnvelopePenv=this.axMapControl1.Extent;
IEnvelopePenv2=this.axMapControl1.TrackRectangle();
doubleRate1=Penv.Width/Penv2.Width;
doubleRate2=Penv.Height/Penv2.Height;
Penv.Expand(Rate1,Rate2,true);
this.axMapControl1.Extent=Penv;
break;
caseDownButton.selectbyrectangle:
IEnvelopepenv=this.axMapControl1.TrackRectangle();
pgeo=penvasIGeometry;
select_features_on_map(pgeo);
ISelectionpselectionset=this.axMapControl1.Map.FeatureSelection;
IEnumFeaturepenumfeature=pselectionsetasIEnumFeature;
penumfeature.Reset();
IFeaturepfeature=penumfeature.Next();
esriGeometryTypeesrigeometrytype;
while(pfeature!
=null)
{
esrigeometrytype=pfeature.Shape.GeometryType;
this.axMapControl1.FlashShape(pfeature.Shape,2,20,
GetSymbol(GetColor(255,20,20),esrigeometrytype));
pfeature=penumfeature.Next();
}
this.axMapControl1.Refresh();
break;
caseDownButton.queryinformationbypoint:
{
#regionselectbypoint
//frm2.Hide();
//构造用于点选的矩形
IPointppoint=this.axMapControl1.ToMapPoint(e.x,e.y);
ppoint.X=e.mapX;
ppoint.Y=e.mapY;
IEnvelopeppenv=this.axMapControl1.Extent;
doubleratio=(ppenv.Width+ppenv.Height)/2;
ppenv.Width=ratio/50;
ppenv.Height=ratio/50;
ppenv.CenterAt(ppoint);
pgeo=ppenvasIGeometry;
//定义一个空间过滤器
IQueryFilterpqueryfilter=null;
ISpatialFilterpspatialfilter=newSpatialFilterClass();
pspatialfilter.Geometry=pgeo;
pspatialfilter.GeometryField="shape";
pspatialfilter.SpatialRel=esriSpatialRelEnum.esriSpatialRelIntersects;
pqueryfilter=pspatialfilterasIQueryFilter;
//定义变量
UIDpuid=newUIDClass();
puid.Value="{40A9E885-5533-11d0-98BE-00805F7CED21}";
IFeatureLayerpfeaturelyr=null;
IFeatureSelectionpfeaturesel=null;
ISelectionSetpselset=null;
IFeatureCursorpfcursor=null;
ICursorpcursor=null;
IFeaturepfeture=null;
esriGeometryTypeesrigeotype;
//将查询的信息输出到FORM2上
//弹出FORM2
if(frm2.formatpresent==false)
{
frm2=newForm2();
frm2.Show();
}
frm2.Show();
//清空FORM2的LISTBOX
frm2.clearlistbox();
//读取地图中的所有特征层
IEnumLayerpenumlyr=this.axMapControl1.Map.get_Layers(puid,true);
//使用用于点选的矩形把与其将相交的要素加入选择集,
penumlyr.Reset();
pfeaturelyr=penumlyr.Next()asIFeatureLayer;
while(pfeaturelyr!
=null)
{
pfeaturesel=pfeaturelyrasIFeatureSelection;
pfeaturesel.SelectFeatures(pqueryfilter,esriSelectionResultEnum.esriSelectionResultNew,false);
pfeaturesel.SelectionColor=GetColor(0,200,100);
//闪烁所有选中的要素
if(pfeaturelyr.Visible==true)
{
pselset=pfeaturesel.SelectionSet;
pselset.Search(null,true,outpcursor);
pfcursor=pcursorasIFeatureCursor;
//将特征层和游标作为参数传给FORM2
frm2.getselfeaturescursor(pfcursor);
pfeture=pfcursor.NextFeature();
esrigeotype=pfeaturelyr.FeatureClass.ShapeType;
while(pfeture!
=null)
{
//闪烁选中的特征
this.axMapControl1.FlashShape(pfeture.Shape,2,50,GetSymbol(GetColor(255,20,20),esrigeotype));
pfeture=pfcursor.NextFeature();
}
}
pfeaturelyr=penumlyr.Next()asIFeatureLayer;
}
this.axMapControl1.Refresh();
break;
#endregion
}
default:
break;
}
}
11)运行结果
三、存在问题
1)此程序涉及到命名按钮和工具按钮。
它们执行功能的方式不同,编写代码时,要注意。
命令按钮执行功能是立即执行,所以代码写在其click事件中。
工具按钮执行功能分两步,所以它对应的功能代码分别写在按钮的click事件中和地图控件的mousedown事件中。
2)区别缩放功能哪些是调用封装好的类哪些是自己编写的代码。
3)在该小程序中,使用到Ienvelope,Icommand,CurrentTool,必须引用它们所在的类库。
4)关于EjectAllButton方法,功能是在点击一个按钮时,把其它的按钮弹起。
四、认识总结
这个实验主要是对Button等控件的认识,认识到工具按钮和命名按钮的区别,否则在使用时会出现一定错误,在代码的实现上也有很大区别,需认清楚之后,在今后的学习上也应注意。
前面实验一对AE的控件有简单的认识,在编写程序时还是有很多问题需要注意,命名按钮和工具按钮由于执行功能的方式不同,编写代码时也不同。
在今后学习和工作中学到对待相似的问题也不定处理方式一样。
实验三C#+ArcEngine程序设计入门:
地图绘图
一、实验目的与要求:
地图绘图是GIS基本功能。
本次实验通过指导学生如何编写代码实现在MapControl控件绘图的功能。
此绘图功能只是在地图控件上把图形绘出来,并不保存,随着地图的刷新而消失。
如果要所绘图形在地图上不原地图刷新而消失,可以使用addelement方法,把所绘图形作为一个元素而显示在地图上。
本实验主要使用特定的符号,绘制点、线、面图形。
关于图形的符号修改,请参见图形可视化实验。
要求:
独立完成实验,手动键入代码,积极思考。
理解引入枚举变量的作用,理解switch方法的使用。
二、实验容:
1)打开实验二的VC#项目。
在其基础上,为工具栏再添加绘图按钮,实现绘图功能。
2)在原有工具栏基础上,为工具栏控件再添加3个按钮(BUTTON),依次将其文本属性改为:
绘点、绘线、绘面。
并设置相应图标。
将其NAME属性改为:
ToolDrawPoint,ToolDrawLine,ToolDrawPolygon。
3)设计的界面如下:
4)更新FORM1窗体类中的方法EjectAllButton,用于维护新添加的ToolButton按钮的弹起状态。
代码如下:
publicenumDownButton//用于记录哪个工具按钮被按下。
{
no=0,
drawline=1,
drawpoint=2,
drawpolgyon=3,
pan=4,
zoomin=5,
zoomout=6,
selectbyrectangle=7,
queryinformationbypoint=8,
queryattributes=9
}
5)将新增的三个工具按钮的checkonclick属性改为:
True。
6)在新增的三个工具按钮的Click事件中,调用方法:
EjectAllButton,并写代码将新增三个工具按钮的clicked属性设置为TRUE。
7)在命名空间中,定义一个枚举变量类型(对比:
整型INT是系统定义的)
8)在FORM1类中,使用前面定义的枚举类型,定义一个枚举类型的变量:
Dbutton
9)在工具按钮的click事件中,使用枚举变量记录,按下了哪一个按钮。
10)为窗体类编写一个绘图方法,以供调用。
11)在地图的mousedown事件中编写代码,调用绘图方法,实现绘图功能,代码如下
//如下按下了绘点按钮,则
caseDownButton.drawpoint:
IPointpp=newPointClass();
pp.X=e.mapX;
pp.Y=e.mapY;
pgeo=ppasIGeometry;
DrawMapShape(pgeo);
break;
//如下按下了绘线按钮,则
caseDownButton.drawline:
pgeo=this.axMapControl1.TrackLine();
DrawMapShape(pgeo);
break;
//如下按下了绘多边形按钮,则
caseDownButton.drawpolgyon:
pgeo=this.axMapControl1.TrackPolygon();
DrawMapShape(pgeo);
break;
12)运行,查看绘图效果,如下图
三、存在问题
1)首先理解为什么要使用枚举变量,如何定义枚举类型
2)理解工具按键实现其功能的代码分布在于按钮点击事件和地图的mousedown事件两处。
理解它们如何协调工作。
3)掌握为类添加方法的步骤。
4)理解VC#的事件响应机制。
四、认识总结
这次实验虽然比较曲折,但经过反复查阅资料修改最终完成了实验。
在这个实验中,知道了枚举变量,如何定义枚举类型。
知道了如何编写代码实现在MapControl控件绘图的功能,不论今后工作中是否能用得上,一门新软件的学习对自己终生受益。
通过前面的实验,目前对AE这个软件已经相对来说比较熟悉,这个实验我了解了枚举变量的意思以及如何定义枚举类型,以及用MapControl控件实现地图的绘图功能。
实验四C#+ArcEngine程序设计入门:
地图查询与地图要素选择
一、实验目的:
地图查询是GIS基本功能,几乎任何一个GIS系统都具有查询功能。
而地图要素的选择是执行其它操作的前提,所以要素选择功能也是基本功能。
本次实验通过指导学生如何编写代码实现基于MapControl控件的地图查询功能和要素选择功能。
本实验以矩形拉框选择和点击选择为例,同学们可以自己动手实现其他查询方法。
本实验主要使用了ISelectionSet接口的Search方法、IFeatureSelection接口的SelectFeatures方法以及IMAP接口的SelectByShape方法。
本实验编写了获得颜色方法:
GetColor方法,获得符号方法:
GetSymbol方法以及选择要素方法:
select_features_on_map。
属性查询也是GIS的基本功能,同学们可以模仿ARCMAP中的属性查询,本实验中给出了窗体间相互传递数据的方法,依据此方法同学们可以自己给予实现。
要求:
独立完成实验,手动键入代码,积极思考。
理解并掌握本实验中使用的主要接口
和方法。
理解并掌握窗体间传递数据的方法。
学会为类添加属性和方法,并掌握如何调用。
二、实验容:
1、打开实验三的VC#项目。
在其基础上,为工具栏再