AE课程设计.docx
《AE课程设计.docx》由会员分享,可在线阅读,更多相关《AE课程设计.docx(18页珍藏版)》请在冰豆网上搜索。
AE课程设计
院系:
建筑与测绘工程系
专业:
地理信息系统
小组名称:
第一组
成员姓名:
GIS二次开发课程设计
一、项目描述:
3
二、项目概述:
3
三、系统的总体设计:
…………………………………………………………………..3
3.1系统设计目标与原则3
3.2系统设计路线4
3.3、条件需求4
四、部分属性代码的实现5
五、心得体会13
致谢14
一、项目描述:
利用视窗控件建立应用程序的目标是演示并使你熟悉在微软VisualStudio.NETAPI中使用标准ArcGIS控件开发和部署GIS应用所需的步聚。
本节中使用了VisualStudio.NET开发环境中的MapControl、PageLayoutControl、TOCControl和ToolbarControl等视窗控件。
二、项目概述:
本方案使用微软VisualStudio.NET开发环境加以实现,并使用了ESRIinterop程序集(InteropAssemblies),它服务于被放置在.NET窗体上的、位于.NET窗体控件(.NETWindowsControls)中的ArcGIS控件,这些程序集在托管的.NET代码和非托管的COM代码之间起了桥梁作用。
对COMArcGIS控件(COMArcGISControls)成员的引用都要经过Interop程序集,然后到达实际的COM对象。
同样,也从COM对象经过Interop程序集到达.NET应用程序。
每个ArcGISEngine控件具有方法、属性与事件,它们能够被控件嵌入的容器(如,.NET窗体)访问。
每个控件对象及其功能可以与其他ESRIArcObjects和自定义控件组合使用,创建用户化的客户应用程序。
此方案是使用了C#和VisualBasic.NET两种语言创建,但以下技术实现集中倾向于C#方案。
在本方案中,使用ToolbarControl、TOCControl、PageLayoutControl和MapControl来为应用程序提供用户界面。
这些ArcGIS控件与其他ArcObjects和ArcGISEngine命令被开发者一起使用,用来创建一个GIS视窗应用。
三、系统的总体设计
此方案在设计时,首先强调了ArcGIS控件如何互相之间进行交互,其次,向开发者解释说明了ArcGIS控件对象模型的一部分。
每个.NETArcGISEngine控件包含有一套能够被嵌入其内的窗口即时访问的属性页。
这些属性些为控件属性和方法的选择提供了捷径,并且允许开发者不写任何代码即可创建一个应用程序。
本方案并没有使用属性页,而是采用写代码的方式建立应用程序。
。
3.1系统设计目标与原则
本系统根据系统工程的设计思想,满足实用性可靠性、可扩展性和开放性原则,组建完整的信息化应用管理平台。
通过系统研发。
实现在区域尺度上对农业资源信息的有效组织和管理,并通过灵活运用功能模块,从而提高对区域农业资源的管理水平和利用效率。
系统的功能结构分析根据对系统的分析结果,本系统由数据层、应用逻辑层、表现层3层结构模式组成。
系统框架图如图3-1所示。
系统数据层分为空间数据和非空间数据两个部分.空间数据划分不同层级,分别存储矢量、栅格数据,非空间数据也分类进行划分以便于管理。
应用逻辑层主要是为用户提供各种基本的地图及地图属性库操作,如地图的缩放、属性表操作,地理信息数据的统计功能及可视化的输入界面,让用户输入必要数据进行专业的评价、监测、辅助决策等。
表现层由AE中的mapcontrol和报表等控件来表现、输出结果。
3.2系统设计路线
图3-1
3.3、条件需求
要顺利地完成以下方案,你需要以下条件(对于部署的需求将在后续的部署章节涉及到):
安装具有授权文件的ArcGISEngine开发工具包(DeveloperKit),使之能够用于开发。
安装有微软VisualStudio.NET2003开发环境和软.NETFramework3.5及其相应协议。
熟悉微软Windows操作系统和MicrosoftVisualStudio.NET的工作知识,会用C#或VisualBasic.NET编程语言。
当然,此方案中提供了一些如何在MicrosoftVisualStudio.NET中使用ArcGIS控件的信息,但它不能替代对开发环境的培训。
不需要对ESRI其它软件有足够的经验,但如果以前对ArcObjects有所接触并对ArcGIS应用(如,ArcCatalog,ArcMap)有一个基本了解,则对于开发更有利。
访问来自本方案的样例数据和代码,所需要的的控件、类、接口等:
AxMapControlAxTOCControl
AxPageLayoutControlAxToolbarControl
ESRI.ArcGIS.CartoESRI.ArcGIS.System
ESRI.ArcGIS.DisplayESRI.ArcGIS.SystemU
ESRI.ArcGIS.GeometryESRI.ArcGIS.Utility
esriMapControlesriTOCControl
esriPageLayoutControlesriToolbarControl
四、部分属性代码的实现
下面的实现过程中提供了你成功完成方案所需所有代码。
假设你对于开发环境已经有了一定的知识,所以下面没有逐步地详细介绍如何用MicrosoftVisualStudio.NET开发应用。
(一)加载ArcGIS控件
在你为应用程序编写代码之前,应该先将应用程序将用到的ArcGIS控件和其他ArcGISEngine库引用装载到开发环境之中。
1.启动VisualStudio.NET,并从新建项目对话框中创建一个新的VisualC#
“Windows应用程序”项目。
2.将项目命名为“Controls”,并选择位置存取该项目。
3.在“工具箱”的“Windows窗体”标签栏中单击右键,然后从上下文菜单中
选择“添加/移除项(I)…”。
4.在“自定义工具箱”中选择“.NETFramework组件”,并复选“AxMapControl”,
“AxPageLayoutControl”,“AxTOCControl”和“AxToolbarControl”,单击确定
按钮。
这样所选择的控件将显示在工具箱的Windows窗体标签栏中。
5.单击项目菜单,并选择“添加引用(R)…”。
6.在添加引用对话框中,双击“ESRI.ArcGIS.Carto”,“ESRI.ArcGIS.Display”,
“ESRI.ArcGIS.Geometry”,“ESRI.ArcGIS.System”,“ESRI.ArcGIS.SystemUI”,
“ESRI.ArcGIS.Utility”。
单击确定。
7.在窗体上双击显示窗体代码窗口,在代码窗口的顶部增加“using”命令:
usingSystem;
usingSystem.Windows.Forms;
//ArcGISEngine引用
usingESRI.ArcGIS.SystemUI;
usingESRI.ArcGIS.Carto;
usingESRI.ArcGIS.Display;
usingESRI.ArcGIS.Geometry;
usingESRI.ArcGIS.esriSystem;
usingESRI.ArcGIS.ToolbarControl;
usingESRI.ArcGIS.TOCControl
(二)加载Map文档到MapControl与PageLayoutControl
单独的数据层或者使用ArcMap、ArcGIS桌面应用程序产生的图形文档,能够被加载到MapControl和PageLayoutControl中。
你可以加载样例图形文档,或者加载你自己的图形文档。
后面你将增加一个浏览图形文档的对话框。
1.选择Form_Load事件,并输入下列代码(如果你使用你自己的图形文档,
要替换为正确的文件名):
//使用相对路径向PageLayoutControl加载一个图形文档
stringfilename=
@"\Data\\ArcGIS_Engine_Developer_Guide\\gulfofst.
lawrence.mxd";
if(axPageLayoutControl1.CheckMxFile(filename))
{
axPageLayoutControl1.LoadMxFile(filename,"");
}
2、在设计模式显示窗体并从属性窗选择axPageLayoutControl1控件,显示
axPageLayoutControl事件。
在OnPageLayoutReplaced事件上双击向代码窗
口添加该事件的处理函数。
3.在axPageLayoutControl1_OnPageLayoutReplaced事件中键入以下向
MapControl加载样例图形文档的代码。
当文档被装载入PageLayoutControl时
OnPageLayoutReplaced事件将会被触发。
privatevoidaxPageLayoutControl1_OnPageLayoutReplaced(objectsender,
ESRI.ArcGIS.PageLayoutControl.IPageLayoutControlEvents_OnPageLayoutReplacedEvente)
{
//加载同样的文档到MapControl
axMapControl1.LoadMxFile(axPageLayoutControl1.DocumentFilename,
null,null);
//设置MapControl显示范围至数据的全局范围
axMapControl1.Extent=axMapControl1.FullExtent;
}
(三)在TOCControl中控制标签编辑
TOCControl默认允许用户自动地切换图层的可见性并改变显示在目录表中的名称。
你可以增加代码防止用户在编辑名称时输入空的字符串。
1.在Form_Load事件的开始增加下列代码。
privatevoidForm1_Load(objectsender,System.EventArgse)
{
//当缩放时禁止重绘
this.SetStyle(ControlStyles.EnableNotifyMessage,true);
//设置标签编辑为手动方式
axTOCControl1.LabelEdit=
esriTOCControlEdit.esriTOCControlManual;
2.在设计模式显示窗体并从属性窗口选择AxTOCControl1控件,显示AxTOCControl事件。
双击OnEndLabelEdit向代码窗口添加事件处理函数。
3.在axTOCControl1_OnEndLabelEdit事件中添加以下代码:
privatevoidaxTOCControl1_OnEndLabelEdit(objectsender,
ESRI.ArcGIS.TOCControl.ITOCControlEvents_OnEndLabelEditEvente)
{
//禁止在编辑标签时键入空字串
stringnewLabel=e.newLabel;
if(newLabel.Trim()=="")
{
e.canEdit=false;
}
4.生成并生成应用程序。
编辑TOCControl控件的地图、图层、标题或图例
类的标签,在其上点击一次,然后再点一次调用标签编辑。
试着用空字串
替代标签。
在编辑期间,你可以随时使用键盘上的ESC键取消编辑。
(四)栅格数据处理
1、栅格数据的存储类型:
栅格数据一般可以存储为ESRIGRID(由一系列文件组成),TIFF格式(包括一个TIF文件和一个AUX文件),IMAGINEImage格式在AE中一般调用ISaveAs接口来保存栅格数据
2、栅格数据集和栅格编目的区别
一个栅格数据集由一个或者多个波段(RasterBand)的数据组成,一个波段就是一个数据矩阵。
对于格网数据(DEM数据)和单波段的影像数据,表现为仅仅只有一个波段数据的栅格数据集,而对于多光谱影像数据则表现为具有多个波段的栅格数据集栅格编目(RasterCatalog)用于显示某个研究区域内各种相邻的栅格数据,这些相邻的栅格数据没有经过拼接处理合成一副大的影像图
3、IRasterWorkspaceEx与IRasterWorkspace,IRsterWorkspace2的区别
1).IRasteWorkspaceEx接口主要是用来读取GeoDatabase中的栅格数据
2).IRasterWorkspace,IRsterWorkspace2主要是用来读取以文件格式储在本地的栅格数据
4、加载栅格数据(以存储在本地的栅格数据文件为例)
1.直接用IRasterLayer接口打开一个栅格文件并加载到地图控件
IRasterLayerrasterLayer=newRasterLayerClass();
rasterLayer.CreateFromFilePath(fileName);
axMapControl1.AddLayer(rasterLayer,0);
2.用IRasterDataset接口打开一个栅格数据集
IWorkspaceFactoryworkspaceFactory=newRasterWorkspaceFactory();
IWorkspaceworkspace;
workspace=workspaceFactory.OpenFromFile(inPath,0);//inPath栅格数据存储路径
if(workspace==null)
{
Console.WriteLine("Couldnotopentheworkspace.");
return;}
IRasterWorkspacerastWork=(IRasterWorkspace)workspace;
IRasterDatasetrastDataset;
rastDataset=rastWork.OpenRasterDataset(inName);//inName栅格文件名
if(rastDataset==null){
Console.WriteLine("Couldnotopentherasterdataset.");
return;}
3、如何读取栅格数据的属性和遍历栅格数据
栅格数据的属性包括栅格大小,行数,列数,投影信息,栅格范围等等,见下面代码
(假设当前加载的栅格文件栅格值存储方式为:
UShort类型)
IRasterPropsrasterProps=(IRasterProps)clipRaster;
intdHeight=rasterProps.Height;//当前栅格数据集的行数
intdWidth=rasterProps.Width;//当前栅格数据集的列数
doubledX=rasterProps.MeanCellSize().X;//栅格的宽度
doubledY=rasterProps.MeanCellSize().Y;//栅格的高度
IEnvelopeextent=rasterProps.Extent;//当前栅格数据集的范围
rstPixelTypepixelType=rasterProps.PixelType;//当前栅格像素类型
IPntpntSize=newPntClass();
pntSize.SetCoords(dX,dY);
IPixelBlockpixelBlock=clipRaster.CreatePixelBlock(pntSize);
IPntpnt=newPntClass();
for(inti=0;ifor(intj=0;j{
pnt.SetCoords(i,j);
clipRaster.Read(pnt,pixelBlock);
if(pixelBlock!
=null)
{
objectobj=pixelBlock.GetVal(0,0,0);
MessageBox.Show(Convert.ToUInt32(obj).ToString());
}
}
4、如何提取指定的范围的栅格数据
提取指定范围内的栅格数据通常用两种方法IRasterLayerExport(esriCarto),IExtractionOp,IExtractionOp2(esriSpatialAnalyst),IRasterLayerExport接口提供的栅格数据提取功能有限,只能以矩形范围作为提取范围,而IExtractionOp接口提供了多边形,圆,属性,矩形等几种形式作为提取栅格数据.
1).IRasterLayerExport接口
IRasterLayerExportrLayerExport=newRasterLayerExportClass();
rLayerExport.RasterLayer=rasterLayer;//rasterLayer指当前加载的栅格图层
rLayerExport.Extent=clipExtent;//clipExtent指提取栅格数据的范围
if(proSpatialRef!
=null)
rLayerExport.SpatialReference=proSpatialRef;//proSpatialRef当前栅格数据的投影信息
IWorkspaceFactorypWF=newRasterWorkspaceFactoryClass();
try{
IWorkspacepRasterWorkspace=pWF.OpenFromFile(_folder,0);//_folder指栅格文件保存路径
IRasterDatasetoutGeoDataset=rLayerExport.Export(pRasterWorkspace,code,strRasterType);
//调用ISaveAs接口将导出的数据集保存
}
Catch(Exceptionex)
{
ThrownewArgumention(ex.Message);
}
2).IExtractionOp接口(调用此接口前,应该先检查空间许可)
IExtractionOpextraction=newRasterExtractionOpClass();
try{
IGeoDatasetgeoDataset=extraction.Rectangle((IGeoDataset)clipRaster,clipExtent,true);
IRasterraster=geoDatasetasIRaster;
if(raster!
=null){
IWorkspaceFactoryWF=newRasterWorkspaceFactoryClass();
IWorkspacerasterWorkspace=WF.OpenFromFile(_folder,0);
ISaveAssaveAs=(ISaveAs)raster;
saveAs.SaveAs(“Result.tif”,rasterWorkspace,"TIFF");
}
}
catch(Exceptionex){
MessageBox..Show(Ex.message);
}
五、心得体会
通过此次课程设计,使我更加扎实的掌握了有关arcgisengine过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。
实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。
过而能改,善莫大焉。
在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。
最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。
这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于迎刃而解。
在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上披荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!
我认为,在这学期的实验中,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。
更重要的是,在实验课上,我们学会了很多学习的方法。
而这是日后最实用的,真的是受益匪浅。
要面对社会的挑战,只有不断的学习、实践,再学习、再实践。
这对于我们的将来也有很大的帮助。
以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。
就像中国提倡的艰苦奋斗一样,我们都可以在实验之后变的更加成熟,会面对需要面对的事情。
回顾起此课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,但可喜的是最终都得到了解决。
实验过程中,也对团队精神的进行了考察,让我们在合作起来更加默契,在成功后一起体会喜悦的心情。
果然是团结就是力量,只有互相之间默契融洽的配合才能换来最终完美的结果。
此次设计也让我明白了思路即出路,有什么不懂不明白的地方要及时请教或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识,收获颇丰。
致谢
我认为,在这学期的实验中,在收获知识的同时,还收获了阅历,收获了成熟,在此过程中,我们通过查找大量资料,请教老师和同学。
使我再专业知识和动手实践方面都得了到很好的提升,在此,要对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!
课设的成功,少不了老师的耐心指导和同学的热心帮助,以及小组中其他成员的大力配合。
没有大家的默契,也收获不了今日的成功,在课设的过程中每一个人都努力查找资料,仔细检查,认真核对,都付出了自己的努力和艰辛,在此