1、AE课程设计院系:建筑与测绘工程系专业:地理信息系统小组名称:第一组成员姓名: GIS二次开发课程设计一、项目描述: 3二、项目概述: 3三、系统的总体设计: .3 3.1 系统设计目标与原则 3 3.2 系统设计路线 43.3、条件需求 4四、部分属性代码的实现 5五、心得体会 13致谢 14一、项目描述: 利用视窗控件建立应用程序的目标是演示并使你熟悉在微软Visual Studio .NETAPI 中使用标准ArcGIS 控件开发和部署GIS 应用所需的步聚。本节中使用了Visual Studio .NET 开发环境中的MapControl、 PageLayoutControl、TOCC
2、ontrol 和ToolbarControl 等视窗控件。二、项目概述: 本方案使用微软Visual Studio .NET 开发环境加以实现,并使用了ESRI interop 程序集(Interop Assemblies),它服务于被放置在.NET 窗体上的、位于.NET 窗体控件(.NET Windows Controls)中的ArcGIS 控件,这些程序集在托管的.NET 代码和非托管的COM 代码之间起了桥梁作用。对COM ArcGIS 控件(COM ArcGIS Controls)成员的引用都要经过Interop 程序集,然后到达实际的COM 对象。同样,也从COM 对象经过Inte
3、rop 程序集到达.NET 应用程序。每个ArcGIS Engine 控件具有方法、属性与事件,它们能够被控件嵌入的容器(如,.NET 窗体)访问。每个控件对象及其功能可以与其他ESRI ArcObjects 和自定义控件组合使用,创建用户化的客户应用程序。此方案是使用了C#和Visual Basic .NET 两种语言创建,但以下技术实现集中倾向于C#方案。在本方案中,使用ToolbarControl、TOCControl、PageLayoutControl 和MapControl来为应用程序提供用户界面。这些ArcGIS 控件与其他ArcObjects 和ArcGIS Engine 命令被
4、开发者一起使用,用来创建一个GIS 视窗应用。三、系统的总体设计 此方案在设计时,首先强调了ArcGIS 控件如何互相之间进行交互,其次,向开发者解释说明了ArcGIS 控件对象模型的一部分。每个.NET ArcGIS Engine 控件包含有一套能够被嵌入其内的窗口即时访问的属性页。这些属性些为控件属性和方法的选择提供了捷径,并且允许开发者不写任何代码即可创建一个应用程序。本方案并没有使用属性页,而是采用写代码的方式建立应用程序。 3.1 系统设计目标与原则 本系统根据系统工程的设计思想 ,满足实用性可靠性、可扩展性和开放性原则,组建完整的信息化应用管理平台。通过系统研发。实现在区域尺度上对
5、农业资源信息的有效组织和管理 ,并通过灵活运用功能模块 ,从而提高对区域农业资源的管理水平和利用效率。系统的功能结构分析 根据对系统的分析结果,本系统由数据层 、应用逻辑层、表现层 3层结构模式组成。系统框架图如图3-1所示 。系统数据层分 为空间数据和非空间数据两个部分空间数据划分不同层级,分别存储矢量、栅格数据,非空间数据也分类进行划分以便于管理。应用逻 辑层主要是为用户提供各种基本的地图及地图属性库操作 ,如地图的缩放、属性表操作,地理信息数据的统计功能及可视化的输入界面,让用户输入必要数据进行专业的评价 、监测 、辅助决策等。表现层由 AE 中的mapcontrol 和报表等控件来表现
6、、输出结果。 3.2 系统设计路线 图3-13.3、条件需求 要顺利地完成以下方案,你需要以下条件(对于部署的需求将在后续的部署章节涉及到):安装具有授权文件的 ArcGIS Engine 开发工具包(Developer Kit),使之能够用于开发。 安装有微软 Visual Studio .NET 2003 开发环境和软.NET Framework 3.5及其相应协议。熟悉微软 Windows 操作系统和Microsoft Visual Studio .NET 的工作知识,会用C#或Visual Basic .NET 编程语言。当然,此方案中提供了一些如何在Microsoft Visual
7、Studio .NET 中使用ArcGIS 控件的信息,但它不能替代对开发环境的培训。不需要对 ESRI 其它软件有足够的经验,但如果以前对ArcObjects 有所接触并对ArcGIS 应用(如,ArcCatalog,ArcMap)有一个基本了解,则对于开发更有利。 访问来自本方案的样例数据和代码,所需要的的控件、类、接口等: AxMapControl AxTOCControl AxPageLayoutControl AxToolbarControl ESRI.ArcG
8、IS.Carto ESRI.ArcGIS.System ESRI.ArcGIS.Display ESRI.ArcGIS.SystemU ESRI.ArcGIS.Geometry ESRI.ArcGIS.Utility esriMapControl esriTOCControl esriPageLayoutControl esriToolbarControl 四、部分属性代码的实现 下面的实现过程中提供了你成功完成方案所需所有代码
9、。假设你对于开发环境已经有了一定的知识,所以下面没有逐步地详细介绍如何用Microsoft Visual Studio .NET 开发应用。(一) 加载ArcGIS 控件在你为应用程序编写代码之前,应该先将应用程序将用到的 ArcGIS 控件和其他ArcGIS Engine 库引用装载到开发环境之中。1. 启动Visual Studio .NET,并从新建项目对话框中创建一个新的Visual C#“Windows 应用程序”项目。2. 将项目命名为“Controls”,并选择位置存取该项目。3. 在“工具箱”的“Windows 窗体”标签栏中单击右键,然后从上下文菜单中选择“添加/移除项(I)
10、”。4. 在“自定义工具箱”中选择“.NET Framework 组件”,并复选“AxMapControl”,“AxPageLayoutControl”,“AxTOCControl”和“AxToolbarControl”,单击确定按钮。这样所选择的控件将显示在工具箱的Windows 窗体标签栏中。5. 单击项目菜单,并选择“添加引用(R)”。6. 在添加引用对话框中,双击“ESRI.ArcGIS.Carto”,“ESRI.ArcGIS.Display”,“ESRI.ArcGIS.Geometry”,“ESRI.ArcGIS.System”,“ESRI.ArcGIS.SystemUI”,“ESR
11、I.ArcGIS.Utility”。单击确定。7. 在窗体上双击显示窗体代码窗口,在代码窗口的顶部增加“using”命令:using System;using System.Windows.Forms;/ ArcGIS Engine 引用using ESRI.ArcGIS.SystemUI;using ESRI.ArcGIS.Carto;using ESRI.ArcGIS.Display;using ESRI.ArcGIS.Geometry;using ESRI.ArcGIS.esriSystem;using ESRI.ArcGIS.ToolbarControl;using ESRI.ArcG
12、IS.TOCControl(二) 加载Map 文档到MapControl 与PageLayoutControl 单独的数据层或者使用ArcMap、ArcGIS 桌面应用程序产生的图形文档,能够被加载到MapControl 和PageLayoutControl 中。你可以加载样例图形文档,或者加载你自己的图形文档。后面你将增加一个浏览图形文档的对话框。1. 选择Form_Load 事件,并输入下列代码(如果你使用你自己的图形文档,要替换为正确的文件名):/ 使用相对路径向PageLayoutControl 加载一个图形文档string filename =DataArcGIS_Engine_De
13、veloper_Guidegulf of st.lawrence.mxd;if ( axPageLayoutControl1.CheckMxFile(filename) )axPageLayoutControl1.LoadMxFile(filename, );2、在设计模式显示窗体并从属性窗选择axPageLayoutControl1 控件,显示axPageLayoutControl 事件。在OnPageLayoutReplaced 事件上双击向代码窗口添加该事件的处理函数。3. 在 axPageLayoutControl1_OnPageLayoutReplaced 事件中键入以下向MapCo
14、ntrol 加载样例图形文档的代码。当文档被装载入PageLayoutControl 时OnPageLayoutReplaced 事件将会被触发。private void axPageLayoutControl1_OnPageLayoutReplaced(object sender,ESRI.ArcGIS.PageLayoutControl.IPageLayoutControlEvents_OnPageLayoutReplacedEvent e)/ 加载同样的文档到MapControlaxMapControl1.LoadMxFile(axPageLayoutControl1.DocumentF
15、ilename,null, null);/ 设置MapControl 显示范围至数据的全局范围axMapControl1.Extent = axMapControl1.FullExtent;(三)在TOCControl 中控制标签编辑 TOCControl 默认允许用户自动地切换图层的可见性并改变显示在目录表中的名称。你可以增加代码防止用户在编辑名称时输入空的字符串。1. 在Form_Load 事件的开始增加下列代码。private void Form1_Load(object sender, System.EventArgs e)/ 当缩放时禁止重绘this.SetStyle(Control
16、Styles.EnableNotifyMessage, true);/ 设置标签编辑为手动方式axTOCControl1.LabelEdit =esriTOCControlEdit.esriTOCControlManual;2. 在设计模式显示窗体并从属性窗口选择AxTOCControl1 控件,显示AxTOCControl 事件。双击OnEndLabelEdit 向代码窗口添加事件处理函数。3.在 axTOCControl1_OnEndLabelEdit 事件中添加以下代码:private void axTOCControl1_OnEndLabelEdit(object sender,ESR
17、I.ArcGIS.TOCControl.ITOCControlEvents_OnEndLabelEditEvent e)/ 禁止在编辑标签时键入空字串string newLabel = e.newLabel;if ( newLabel.Trim() = )e.canEdit = false;4. 生成并生成应用程序。编辑TOCControl 控件的地图、图层、标题或图例类的标签,在其上点击一次,然后再点一次调用标签编辑。试着用空字串替代标签。在编辑期间,你可以随时使用键盘上的ESC 键取消编辑。 (四)栅格数据处理 1、栅格数据的存储类型: 栅格数据一般可以存储为ESRI GRID(由一系列文
18、件组成),TIFF格式(包括一个TIF文件和一个AUX文件),IMAGINE Image格式 在AE中一般调用ISaveAs接口来保存栅格数据 2、栅格数据集和栅格编目的区别 一个栅格数据集由一个或者多个波段(RasterBand)的数据组成,一个波段就是一个数据矩阵。对于格网数据(DEM数据)和单波段的影像数据,表现为仅仅只有一个波段数据的栅格数据集,而对于多光谱影像数据则表现为具有多个波段的栅格数据集栅格编目(RasterCatalog)用于显示某个研究区域内各种相邻的栅格数据,这些相邻的栅格数据没有经过拼接处理合成一副大的影像图3、IRasterWorkspaceEx与IRasterWo
19、rkspace ,IRsterWorkspace2的区别 1).IRasteWorkspaceEx接口主要是用来读取GeoDatabase中的栅格数据 2) . IRasterWorkspace ,IRsterWorkspace2主要是用来读取以文件格式储在本地的栅格数据 4、加载栅格数据(以存储在本地的栅格数据文件为例)1.直接用IRasterLayer接口打开一个栅格文件并加载到地图控件IRasterLayer rasterLayer = new RasterLayerClass(); rasterLayer.CreateFromFilePath(fileName); axMapContr
20、ol1.AddLayer(rasterLayer, 0); 2. 用IRasterDataset接口打开一个栅格数据集IWorkspaceFactory workspaceFactory = new RasterWorkspaceFactory();IWorkspace workspace;workspace = workspaceFactory.OpenFromFile(inPath, 0); /inPath栅格数据存储路径if (workspace = null)Console.WriteLine(Could not open the workspace.);return;IRasterW
21、orkspace rastWork = (IRasterWorkspace)workspace;IRasterDataset rastDataset;rastDataset= rastWork.OpenRasterDataset(inName);/inName栅格文件名if (rastDataset = null)Console.WriteLine(Could not open the raster dataset.);return; 3、如何读取栅格数据的属性和遍历栅格数据栅格数据的属性包括栅格大小,行数,列数,投影信息,栅格范围等等,见下面代码(假设当前加载的栅格文件栅格值存储方式为:US
22、hort类型)IRasterProps rasterProps = (IRasterProps)clipRaster;int dHeight = rasterProps.Height;/当前栅格数据集的行数int dWidth = rasterProps.Width; /当前栅格数据集的列数double dX = rasterProps.MeanCellSize().X; /栅格的宽度double dY = rasterProps.MeanCellSize().Y; /栅格的高度IEnvelope extent=rasterProps.Extent; /当前栅格数据集的范围rstPixelTy
23、pe pixelType=rasterProps.PixelType; /当前栅格像素类型IPnt pntSize = new PntClass();pntSize.SetCoords(dX, dY);IPixelBlock pixelBlock = clipRaster.CreatePixelBlock(pntSize);IPnt pnt = new PntClass();for (int i = 0; i dHeight; i+)for (int j = 0; j dWidth; j+)pnt.SetCoords(i, j);clipRaster.Read(pnt, pixelBlock)
24、;if (pixelBlock != null)object obj = pixelBlock.GetVal(0, 0, 0);MessageBox.Show( Convert.ToUInt32(obj).ToString(); 4、如何提取指定的范围的栅格数据提取指定范围内的栅格数据通常用两种方法IRasterLayerExport(esriCarto), IExtractionOp, IExtractionOp2 (esriSpatialAnalyst),IRasterLayerExport接口提供的栅格数据提取功能有限,只能以矩形范围作为提取范围,而IExtractionOp接口提供了多
25、边形,圆,属性,矩形等几种形式作为提取栅格数据. 1).IRasterLayerExport接口IRasterLayerExport rLayerExport = new RasterLayerExportClass();rLayerExport.RasterLayer = rasterLayer;/ rasterLayer指当前加载的栅格图层rLayerExport.Extent = clipExtent;/clipExtent指提取栅格数据的范围if (proSpatialRef != null)rLayerExport.SpatialReference = proSpatialRef;/
26、 proSpatialRef当前栅格数据的投影信息IWorkspaceFactory pWF = new RasterWorkspaceFactoryClass(); tryIWorkspace pRasterWorkspace = pWF.OpenFromFile(_folder, 0);/ _folder指栅格文件保存路径IRasterDataset outGeoDataset = rLayerExport.Export(pRasterWorkspace, code, strRasterType);/调用ISaveAs接口将导出的数据集保存 Catch(Exception ex) Thro
27、w new Argumention(ex.Message);2)IExtractionOp接口(调用此接口前,应该先检查空间许可)IExtractionOp extraction = new RasterExtractionOpClass();tryIGeoDataset geoDataset = extraction.Rectangle(IGeoDataset)clipRaster, clipExtent, true);IRaster raster = geoDataset as IRaster;if (raster != null)IWorkspaceFactory WF = new Ra
28、sterWorkspaceFactoryClass();IWorkspace rasterWorkspace = WF.OpenFromFile(_folder, 0);ISaveAs saveAs = (ISaveAs)raster;saveAs.SaveAs(“Result.tif”, rasterWorkspace, TIFF); catch (Exception ex)MessageBox.Show(Ex.message); 五、心得体会通过此次课程设计,使我更加扎实的掌握了有关arcgis engine过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所
29、在,也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。过而能改,善莫大焉。在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于迎刃而解。在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上披荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得
30、到社会及他人对你的认可!我认为,在这学期的实验中,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。更重要的是,在实验课上,我们学会了很多学习的方法。而这是日后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。这对于我们的将来也有很大的帮助。以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。就像中国提倡的艰苦奋斗一样,我们都可以在实验之后变的更加成熟,会面对需要面对的事情。回顾起此课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而
31、且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,但可喜的是最终都得到了解决。 实验过程中,也对团队精神的进行了考察,让我们在合作起来更加默契,在成功后一起体会喜悦的心情。果然是团结就是力量,只有互相之间默契融洽的配合才能换来最终完美的结果。此次设计也让我明白了思路即出路,有什么不懂不明白的地方要及时请教或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识,收获颇丰。 致谢我认为,在这学期的实验中,在收获知识的同时,还收获了阅历,收获了成熟,在此过程中,我们通过查找大量资料,请教老师和同学。使我再专业知识和动手实践方面都得了到很好的提升,在此,要对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!课设的成功,少不了老师的耐心指导和同学的热心帮助,以及小组中其他成员的大力配合。没有大家的默契,也收获不了今日的成功,在课设的过程中每一个人都努力查找资料,仔细检查,认真核对,都付出了自己的努力和艰辛,在此
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1