




已阅读5页,还剩99页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
桌面GIS系统开发报告组员:钱堂慧,王淼,娄静谊李勇发,骆延青前言本系统是基于ArcGIS Engine的二次开发,以Visual Studio 2010作为开发环境,C#为开发语言,.NET为组件技术;支持个人地理数据库(.mdb)、文件地理数据库(.gdb)对空间数据进行管理;能完成基本的矢量化工作。主要的功能模块包括:各种空间数据的加载显示、图层管理;图形数据与属性数据的互查;图层符号选择;个人地理数据库、文件地理数据库和Shapefile文件的创建;图形数据和属性数据的编辑、保存等。一 开发工具简介和系统功能设计1.1 ArcGIS Engine介绍 ArcGIS Engine是一个简单的、独立于应用程序的Arc Objects编程环境,开发人员用于建立自定义应用程序的嵌入式GIS组件的一个完整类库。Arc Engine由一个软件开发包和一个可以重新分发的为ArcGIS应用程序提供平台的运行时(runtime)组成。ArcGIS Engine 功能层次:(1)基本服务:由GIS核心Arc Objects构成,如要素几何体和显示。(2)数据存储: ArcGIS Engine 可以对许多栅格和矢量格式进行存取,包括强大而灵活的地理数据库。(3)地图表达:包括用于创建和显示带有符号体系和标注功能的地图的Arc ,以及包括创建自定义应用程序的专题图功能的Arc Objects。(4)开发组件:用于快速应用程序开发的高级用户接口控件和高效开发的一个综合帮助系统。(5)运行时选项:Arc Engine 运行时可以与标准功能或其他高级功能一起部署。ArcGIS Engine类库:System类库:是Engine中最底层的类库。包含给构成ArcGIS的其他类库提供服务的组件。库中包含了大量可供开发者调用的接口。SystemUI类库:主要定义了ArcGIS系统中所使用的用户界面组件类型。Geometry类库:包含了核心几何对象,如点、线、多边形及其几何类型和定义。Display类库:包含了支持向输出装置绘制符号体系的组件,1.2 .NET FrameWork 简介C#语言编写的程序需要在.NET Framework 环境的支持下才可以运行,微软在其不断升级的Windows操作系统中逐渐嵌入了更高级版本的.NET Framework(如win7内嵌入了.NET Framework 3.5)。C#语言是微软公司专门为.NET Framework框架量身打造的首选编程语言。C#就本身而言只是一种语言,尽管它是用于生成面向.NET环境的代码,但它本身不是.NET的一部分。另外,.NET支持的一些特性,C#并不支持,而C#语言支持的另一些特性,.NET也不支持(如运算符重载)。在安装Visual Studio开发平台的同时,.NET Framework框架也被安装到本地计算机中。.NET Framework是支持生成、运行下一代应用程序和XML Web Services的内部Windows组件,它简化了在高度分布式internet环境中的应用程序开发。.NET Framework旨在实现以下目标:(1)提供一个完善的面向对象编程环境,无论代码是在本地存储执行,还是在Internet上分布,或者是在远程执行的。(2)提供一个良好的代码执行环境,使开发人员的经验在面对类型大不相同的应用程序(如基于Web的应用程序)时保持一致。(3)按照工业标准生成所有通信,以确保基于.NET Framework的代码可以与任何其他代码集成。.NET Framework包括公共语言运行库(简称CLR)、.NET Framework类库和NET程序编译原理3个核心概念。下图3-2为.NET Framework框架下程序编译过程:C#代码VB.NET代码VC+.NET代码编译器 编译器 编译器组织结构公共语言中间语言公共语言运行库机器语言01001100101011图3-2 .NET程序编译过程1.3基于.NET的ArcGIS Engine开发平台构建安装Visual Studio 2010和ArcGIS Engine 10.0,其中ArcGIS Engine Developer Kit必须安装ArcGIS License Manager和ArcGIS Engine Developer Kit for Windows的ArcGIS Engine Runtime for Windows和ArcObjects SDK for the Microsoft .NET Framework。如果想在程序中直接调用ArcMap中的符号选择器,必须安装ArcGIS Desktop。安装完成后,打开Visual Studio 2010编程环境,进行初始配置。选择C#作为默认编程语言,把应用程序用到的ArcGIS控件和其它的ArcGIS Engine库引用装载到开发环境之中。在工具箱窗的任意地方处点击右键,在弹出的菜单中点击“添加选项卡(A)”,可命名为“ArcGIS Windows Forms”,然后再在新添加的选项卡下面点击右键,在弹出的菜单中点击“选择项(I)”,弹出对话框“选择工具箱”,在.NET Framework 组件下选择ESRI提供的控件。如图1.1所示:图1.1选择工具箱选项1.4系统功能设计系统的功能目标是能完成基本的矢量化工作,这就要求实现各种空间数据的加载显示;图层控制和属性数据查看;图层符号选择;地理数据库和Shapefile文件的创建、数据导入导出;地理数据的编辑、保存等功能。功能结构如图1.2。空间地理数据库(GeoDtabase)桌面GIS系统空间数据加载显示图层控制和属性查看图层符号选择器空间数据管理新建数据库新建要素类导入要素类空间数据编辑保存查看空间数据信息图1.2系统功能结构图二 系统功能实现2.1桌面GIS系统框架主要是使用SplitContainer、TabControl、MapControl、PageLayoutControl、ToolbarControl、TOCControl、MenuStrip、StatusStrip等控件建立起基本的桌面GIS应用程序框架。最终成果预览如下:图2.1桌面GIS系统框架(1)添加控件选择工具箱中的“容器|SplitContainer”容器拖入窗体,为splitContainer1,将其属性中的Dock设置为Fill,Orientation设为Horizontal,FixedPanel设为Panel1。选择工具箱中的“菜单和工具栏”MenuStrip”,将其拖入splitContainer1的Panel1。再选择 “ArcGIS Windows Forms”, 拖入两个“ToolbarControl”和一个“菜单和工具栏|ToolStrip”控件到splitContainer1的Panel1。向splitContainer1的Panel2再拖入一个SplitContainer,为splitContainer2,将其属性中的Dock设置为Fill,Orientation设为Vertical。向splitContainer2 的Panel1 再拖入一个SplitContainer ,为splitContainer3,将其属性中的Dock设置为Fill,Orientation设为Horizontal。将TabControl控件拖入splitContainer3的Panel1,将Alignment属性设置为Bottom,Dock属性设置为Fill。点击TabPages属性右边的按钮,弹出TabPage集合编辑器,将tabPage1的Name设置为tabPageLayer,Text设置为图层,将tabPage2的Name设置为tabPageProperty,Text设置为属性。选择“图层”选项卡,拖入TOCControl控件,设置Dock属性为Fill。选择“属性”选项卡,拖入PropertyGrid控件,设置Dock属性为Fill。如下所示:图2.2 tabPage集合编辑器拖入“菜单和工具栏|StatusStrip”和TabControl控件到splitContainer2的Panel2,设置TabControl的Dock属性为Fill。并以上述类似的方法,将两个选项卡的Name和Text分别设置为:(tabPageMap、地图)(tabPageLayout,制版)。选择“地图”选项卡,拖入MapControl控件(用于主地图的显示),设置Dock属性为Fill。选择“制版”选项卡,拖入PageLayoutControl控件,设置Dock属性为Fill。最后再拖入一个MapControl控件到splitContainer3的Panel2(用于鹰眼功能),并将LicenseControl控件拖入到窗体的任意地方。(2)控件绑定通过以上步骤添加的控件还只是单独存在,而我们的程序需要各控件间协同工作,因此要进行控件绑定。分别右击ToolbarControl、TOCControl控件,将Buddy设置为axMapControl1,如下图所示。图2.3(3)添加工具此时,工具条中还没有任何工具,添加的方法是右击ToolbarControl,选择“属性|Items”,点击Add,选择Commands选项卡中的Generic,双击工具图标即可将相应工具添加到工具条。分别为axToolbarControl1和axToolbarControl2选择不同的工具。图2.4这样就基本完成了系统框架的建立。最终布局结果如图2.5:图2.5 2.2菜单栏(menuStrip1)和工具栏(toolStrip1)的添加与实现(1)添加菜单和工具在设计视图中,单击菜单栏,会出现“请在此处键入”的提示,单击提示就可以键入菜单名称,如“文件”,再单击“文件”,即可输入其下拉子菜单。添加新建( New )、打开( Open )、保存( Save )、另存为( SaveAs )、退出( Exit )这些菜单,()内为相应的Name 属性值。可以在属性面板中的Text 属性中,把菜单名设置为中英文形式,如“打开O pen ”,带下划线的O 表示此项菜单的快捷键是字母O ,设置方法是在相应字母前加上“ & ”字符,如“打开&Open ”。但这种快捷键只在打开此下拉菜单时才有效,即当你单击“文件”菜单弹出下拉菜单时,按下字母O 就可以定位到“打开”菜单。在属性面板中的Image 属性中设置菜单图标。单击Image 那一行右边的按钮,弹出如下菜单。选择“项目资源文件”,再单击导入就可以选择图标了。点击toolStrip1的Items属性添加工具按钮,如下图:图2.6最终效果如图2.7所示: 图2.7(2)实现相关菜单和工具/首先添加程序集的引用空间using System;using System.Collections;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.IO;using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.SystemUI;using ESRI.ArcGIS.Carto;using ESRI.ArcGIS.Controls;using ESRI.ArcGIS.Display;using ESRI.ArcGIS.DisplayUI;using ESRI.ArcGIS.Geometry;using ESRI.ArcGIS.Geodatabase;using ESRI.ArcGIS.GeoDatabaseUI;using ESRI.ArcGIS.GeoDatabaseExtensions;using ESRI.ArcGIS.DataSourcesFile;using ESRI.ArcGIS.DataSourcesRaster;using ESRI.ArcGIS.DataSourcesGDB;using ESRI.ArcGIS.EditingTools;using ESRI.ArcGIS.Editor;using ESRI.ArcGIS.ServerTools;using ESRI.ArcGIS.ArcMap;1)菜单(文件(File)/新建空白地图文档private void New_Click(object sender, EventArgs e) NewMapDocumentFrm newMapDocumentFrm = new NewMapDocumentFrm(); if (newMapDocumentFrm.ShowDialog()=DialogResult.OK) if (newMapDocumentFrm.SavePath = null) return; string path = newMapDocumentFrm.SavePath + untitled.mxd; MessageBox.Show(path); MapDocument pMapDocument = new MapDocumentClass(); pMapDocument.New(path); pMapDocument.Open(path, ); axMapControl1.Map = pMapDocument.get_Map(0); /newMapDocumentFrm是选择保存路径的对话框,如下图:图2.8/获取路径的代码string savePath; public string SavePath get return savePath; set savePath = value; private void btDir_Click(object sender, EventArgs e) if (this.folderBrowserDialog1.ShowDialog()=DialogResult.OK) savePath = folderBrowserDialog1.SelectedPath; tbPath.Text = savePath; private void btOK_Click(object sender, EventArgs e) this.Close(); this.Dispose(); private void btCancel_Click(object sender, EventArgs e) this.Close(); this.Dispose(); /打开地图文档(.mxd)private void Open_Click(object sender, EventArgs e) ICommand command = new ControlsOpenDocCommand(); command.OnCreate(axMapControl1.Object); command.OnClick(); /保存地图文档(.mxd) private void Save_Click(object sender, EventArgs e) if (axMapControl1.DocumentFilename != null & axMapControl1.CheckMxFile(axMapControl1.DocumentFilename) pMapDocument = new MapDocument(); pMapDocument.Open(axMapControl1.DocumentFilename, ); IMxdContents mxdContents = axMapControl1.ActiveView.FocusMap as IMxdContents; pMapDocument.ReplaceContents(mxdContents); pMapDocument.Save(true, false); MessageBox.Show(保存成功); pMapDocument.Close(); else MessageBox.Show(无效地图文档); /另存为 private void SaveAs_Click(object sender, EventArgs e) ICommand pCommand = new ControlsSaveAsDocCommand(); pCommand.OnCreate(this.axMapControl1.Object); pCommand.OnClick(); /退出 private void Exit_Click(object sender, EventArgs e) System.Windows.Forms.Application.Exit(); 2)工具栏(toolStrip1)/打开地图文档(.mxd)private void btOpenDoc_Click(object sender, EventArgs e) ICommand command = new ControlsOpenDocCommand(); command.OnCreate(axMapControl1.Object); command.OnClick(); /保存地图文档 private void btSaveDoc_Click(object sender, EventArgs e) ICommand command = new ControlsSaveAsDocCommand(); command.OnCreate(axMapControl1.Object); command.OnClick(); /添加各种空间数据private void btAddData_ButtonClick(object sender, EventArgs e) AddDataDialogFrm addDataDialogFrm = new AddDataDialogFrm(); addDataDialogFrm.ShowDialog(); currentLayerList=addDataDialogFrm.CurrentLayerList; if (currentLayerList = null) return; for (int i=0; i currentLayerList.Count;i+ ) m_Layer = currentLayerListi as ILayer; this.axMapControl1.Map.AddLayer(m_Layer); this.axMapControl1.ActiveView.Refresh(); AddDataDialogFrm是自定义的OpenFileDialog对话框,如下图:图2.9/实现代码如下:namespace GISDeve public partial class AddDataDialogFrm : Form public AddDataDialogFrm() InitializeComponent(); private void AddDataDialogFrm_Load(object sender, EventArgs e) createListViewHeader(); addcbSearchRangeItem(); private void createListViewHeader() this.listView1.Columns.Clear(); ColumnHeader ch = new ColumnHeader(); ch.Text = 文件名; ch.Width = 120; this.listView1.Columns.Add(ch); ch = new ColumnHeader(); ch.Text = 大小; ch.Width = 100; this.listView1.Columns.Add(ch); ch = new ColumnHeader(); ch.Text = 修改日期; ch.Width = 150; this.listView1.Columns.Add(ch); private void addcbSearchRangeItem() SystemDatabaseManage systemDatabaseManage = new SystemDatabaseManage(); systemDatabaseManage.Select(); DataSet ds = systemDatabaseManage.NewDataset; cbSearchRange.Items.Clear(); for (int i = 0; i 0) m_path = pPath.Substring(findex + 1); else m_path = pPath; int index = m_path.LastIndexOf(.); if (index 0) listViewItemDirectories(m_path); else listView1.Items.Clear(); string filter = m_path.Substring(index + 1); string pFilePath = m_path; string pFileName = pFilePath.Substring(pFilePath.LastIndexOf() + 1); GetGeoData getGeoData = new GetGeoData(); if (filter = mdb) getGeoData.AddMDBDataFileToListView(listView1, pFilePath, pFileName); if (filter = gdb) getGeoData.AddGDBDataFileToListView(listView1, pFilePath, pFileName); if (filter = dwg) pFilePath = pFilePath.Substring(0, pFilePath.LastIndexOf(); getGeoData.AddCADDataFileToListView(this.listView1, pFilePath, pFileName); if (filter = jpg | filter = jpeg | filter = bmp | filter = gif | filter = png | filter = tif | filter = tiff) getGeoData.AddRasterBandFileToListView(listView1, pFilePath, null); public void listViewItemDirectories(string path) this.listView1.Items.Clear(); if (path = null) return; string dir = Directory.GetDirectories(path); string files = Directory.GetFiles(path, *.*); ListViewItem listItem; /遍历文件夹 for (int i = 0; i 0) listItem.ImageIndex = 14; listView1.Items.Add(listItem); /遍历文件 for (int i = 0; i files.Length; i+) string filePath = System.IO.Path.GetDirectoryName(filesi); string fileName = System.IO.Path.GetFileName(filesi); string filter = fileName.Substring(fileName.IndexOf(.) + 1, fileName.Length - fileName.IndexOf(.) - 1); if (filter = shp) try IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactoryClass(); IWorkspace pWorkspace=pWorkspaceFactory.OpenFromFile(filePath, 0); IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace)pWorkspaceFactory.OpenFromFile(filePath, 0); IFeatureLayer pFeatureLayer = new FeatureLayerClass(); pFeatureLayer.FeatureClass = pFeatureWorkspace.OpenFeatureClass(fileName); listItem = new ListViewItem(); listItem.Text = fileName; if (pFeatureLayer.FeatureClass.ShapeType = esriGeometryType.esriGeometryPoint) listItem.ImageIndex = 8; if (pFeatureLayer.FeatureClass.ShapeType = esriGeometryType.esriGeometryLine) listItem.ImageIndex = 7; if (pFeatureLayer.FeatureClass.ShapeType = esriGeometryType.esriGeometryPolyline) listItem.ImageIndex = 7; if (pFeatureLayer.FeatureClass.ShapeType = esriGeometryType.esriGeometryPolygon) listItem.ImageIndex = 9; listView1.Items.Add(listItem); catch (System.Exception ex) listView1.Items.Clear(); if (filter = mdb) listItem = new ListViewItem(); listItem.Text = fileName; listItem.ImageIndex = 3; listView1.Items.Add(listItem); if (filter = dwg) listItem = new ListViewItem(); listItem.Text = fileName; listItem.ImageIndex = 17; listView1.Items.Add(listItem); if (filter = jpg) listItem = new ListViewItem(); listItem.Text = fileName; listItem.ImageIndex = 13; listView1.Items.Add(listItem); if (filter = gif) listItem = new ListViewItem(); listItem.Text = fileName; listItem.ImageIndex = 13; listView1.Items.Add(listItem); if (filter = tiff) listItem = new ListViewItem(); listItem.Text = fileName; listItem.ImageIndex = 13; listView1.Items.Add(listItem); if (filter = bmp) listItem = new ListViewItem(); listItem.Text = fileName; listItem.ImageIndex = 13; listView1.Items.Add(listItem); /listView1显示文件夹、mdb数据库、gdb数据库下面的shapefile数据和栅格数据集 public v
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年旅游租车合同范本下载
- 2025【自动化控制系统安装承包合同】自动化控制系统安装包括哪些内容
- 2025品牌鞋类代理合同模板
- 个人销售提成协议合同标准文本
- 中国人保财险销售合同样本
- 前期物业服务合同的终止期限二零二五年
- 猪场技术承包合同二零二五年
- 个人充电桩出租合同标准文本
- 二零二五版试用期劳动合同标准
- 二零二五版外籍人员雇佣合同
- 原发性高血压护理措施
- JT-T-1045-2016道路运输企业车辆技术管理规范
- 气候类型气温降水分布图
- 小学生飞机知识科普课件
- 交通运输有限责任公司安全生产费用提取使用制度
- 德阳巴蜀文化介绍
- 三年级下册数学课件-4.1 整体与部分 ▏沪教版 (23张PPT)
- 住 用 房 屋 租 金 计 算 表
- 7.4.2超几何分布 课件(共14张PPT)
- 晶状体相关的继发性青光眼进展课件
- DB33T 1192-2020 建筑工程施工质量验收检查用表统一标准
评论
0/150
提交评论