已阅读5页,还剩42页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
. . . . .GIS二次开发实验报告学 号: 201420310115 姓 名: 李梦南 班 级: 1423101 专 业: 地理信息系统 任课老师: 李小龙 二零一七年六月十二日 学习好帮手目录1实验一:AOI书签开发11.1实验目的11.2实验内容11.3实验步骤与结果12.1实验目的52.2实验内容52.3实验步骤与结果52实验三:地图渲染93.1实验目的93.2实验内容93.3实验步骤结果93实验四:空间数据处理164.1实验目的164.2实验内容164.3实验步骤与结果164实验五:GIS分析255.1实验目的255.2实验内容255.3实验步骤与结果255实验六:栅格数据处理336.1实验目的336.2实验内容336.3实验步骤与结果336实验总结431 实验一:AOI书签开发1.1 实验目的 掌握AOI书签程序开发1.2 实验内容 实现AOI书签的创建 实现AOI书签的调用1.3 实验步骤与结果实验思路、关键代码(全面注释)、运行结果截图实验思路:空间书签是用户定义创建的标志某个特定地理位置的快捷方式,创建好书签后能够很方便的找到某个地理位置。在本实验中我们需要创建的是AOI书签,即用户所关心的一个范围,通过调用该书签,用户可以马上找到书签所指范围。实现本实验主要包括以下几个方面:1. 添加控件和类库引用:添加创建书签控件、保存和调用书签控件,添加Geometry类库2. 添加“创建书签”函数:创建书签,保存当前感兴趣范围,将书签名加入组合框,以便调用3. 添加“书签名称设置”窗体:获取书签名,传递给主窗体4. 添加两个事件响应函数:“创建书签”菜单项的点击事件,作用是打开“书签名称设置”窗体;“确认”按钮的点击事件,作用是调用创建书签函数5. 实现与调用书签:添加组合框的事件响应函数,作用是当组合框中选项改变时,地图将刷新显示出书签所记录的范围。实现创建书签的流程图如下:关键代码:1. 添加控件和类库引用using ESRI.ArcGIS.Geometry;2. 添加“创建书签”函数public void CreateBookmark(string sBookmarkName) /参数名为书签名 /通过IAOIBookmark接口创建一个变量,用于保存当前地图的范围 IAOIBookmark aoiBookmark = new AOIBookmarkClass(); /判断如果变量不为空的话,将当前地图的属性赋给变量,变量名为书签名 if (aoiBookmark != null) aoiBookmark.Location = axMapControl1.ActiveView.Extent; aoiBookmark.Name = sBookmarkName; /通过IMapBookmarks接口访问当前地图,在地图中加入新建书签 IMapBookmarks bookmarks = axMapControl1.Map as IMapBookmarks; if (bookmarks != null) bookmarks.AddBookmark(aoiBookmark); /将新建书签名加入组合框,以便调用 cbBookmarkList.Items.Add(aoiBookmark.Name); 3. 添加“书签名称设置”窗体/定义一个主窗体变量,用于保存主窗体对象 public MainForm m_frmMain; /用于传入主窗体对象 public AdmitBookmarkName(MainForm frm) InitializeComponent(); if (frm != null) m_frmMain = frm; /“确认”按钮的“点击”事件响应函数,用于创建书签 private void btAdmit_Click(object sender, EventArgs e) if (m_frmMain != null | tbBookmarName.Text = ) m_frmMain.CreateBookmark(tbBookmarName.Text); this.Close(); 4. 实现与调用书签/“创建书签”按钮的“点击”事件响应函数 private void miCreateBookmark_Click(object sender, EventArgs e) AdmitBookmarkName frmABN = new AdmitBookmarkName(this); frmABN.Show(); /组合框的事件响应函数,选择不同书签,显示不同范围 private void cbBookmarkList_SelectedIndexChanged(object sender, EventArgs e) /访问地图所包含的书签,获取书签序列 IMapBookmarks bookmarks = axMapControl1.Map as IMapBookmarks; IEnumSpatialBookmark enumSpatialBookmark = bookmarks.Bookmarks; /对地图所包含的书签进行遍历,获取与组合框所选项名称相符的书签 enumSpatialBookmark.Reset(); ISpatialBookmark spatialBookmark = enumSpatialBookmark.Next(); while (spatialBookmark != null) if (cbBookmarkList.SelectedItem.ToString() = spatialBookmark.Name) spatialBookmark.ZoomTo(IMap)axMapControl1.ActiveView); axMapControl1.ActiveView.Refresh(); break; spatialBookmark = enumSpatialBookmark.Next(); 5. 运行结果实验二:地图数据组织与访问2.1 实验目的 了解ArcGIS Engine中地图数据的组织结构 掌握ArcGIS Engine地图数据访问方法2.2 实验内容 编写“数据操作”类 利用DataGridView控件展示Continents图层的序号和名称字段2.3 实验步骤与结果实验思路:本实验要实现的功能是地理数据列表显示,是用.NET Framework提供的数据格网视图控件显示指定图层的属性数据,操作对象为“Continents”图层中各个洲的名称数据。实验包含以下几部分:1. 添加控件:“空间数据”菜单项和“访问图层数据”下拉菜单项2. 添加“数据展示台”窗体:用于显示访问图层的名称数据3. 添加数据操作类,为该类导入相关引用和类库:用于管理当前项目中涉及数据操作的相关功能4. 为数据操作类添加相应函数:主要是两个获取函数,一个是获取图层函数,目的是获取各图层;一个是获取“Continents”图层,并读取该图层中各个洲的名称,以DataTable类型返回5. 添加事件响应函数:添加“访问图层数据”菜单项点击函数,显示数据展示台窗体实验实现的流程图如下:关键代码:1. 添加“数据展示台”窗体public DataBoard(String sDataName,DataTable dataTable) /初始化窗体及控件 InitializeComponent(); /设置文本框中的文本和数据格网视图的数据源 tbDataName.Text = sDataName; dataGridView1.DataSource = dataTable; 2. 添加数据操作类using System.Data;using ESRI.ArcGIS.Carto;using ESRI.ArcGIS.Geometry;using ESRI.ArcGIS.Geodatabase;using ESRI.ArcGIS.DataSourcesFile; /定义一个变量保存当前地图对象 public IMap m_map; /用于传入当前地图对象 public DataOperator(IMap map) m_map = map; 3. 获取地图图层/添加成员函数,获取地图中各大洲名称,用表的形式返回 public DataTable GetContinentsNames() /获取Continents图层,并进行访问,判断是否成功 ILayer layer = GetLayerByName(Continents); IFeatureLayer featureLayer = layer as IFeatureLayer; if (featureLayer = null) return null; /调用IfeatureLayer的Search方法,用于遍历图层中的要素,判断是否成功 IFeature feature; IFeatureCursor featureCursor = featureLayer.Search(null, false); feature = featureCursor.NextFeature(); if (feature = null) return null; /新建DataTable类型对象 DataTable dataTable = new DataTable(); /新建DataColumn对象,保存各个州的序号和名称,并将其加入DataTable中 DataColumn dataColumn = new DataColumn(); dataColumn.ColumnName = 序号; dataColumn.DataType = System.Type.GetType(System.Int32); dataTable.Columns.Add(dataColumn); dataColumn = new DataColumn(); dataColumn.ColumnName = 名称; dataColumn.DataType = System.Type.GetType(System.String); dataTable.Columns.Add(dataColumn); /遍历图层中的所有要素,关联数据表中的下一行 /将要素的序号和名称赋给数据表中 DataRow dataRow; while (feature != null) dataRow = dataTable.NewRow(); dataRow0 = feature.get_Value(0); dataRow1 = feature.get_Value(2); dataTable.Rows.Add(dataRow); feature = featureCursor.NextFeature(); /返回数据表 return dataTable; 4. 实现创建数据列表功能/生成菜单项点击事件响应函数,并在数据展示台显示数据表 private void miAccessData_Click(object sender, EventArgs e) DataOperator dataOperator = new DataOperator(axMapControl1.Map); DataBoard dataBoard = new DataBoard(各大洲洲名, dataOperator.GetContinentsNames(); dataBoard.Show(); 实验结果:2 实验三:地图渲染3.1 实验目的 了解地图符号的分类与可视化过程 掌握地图符号的渲染方法3.2 实验内容 编写“地图编制”类,添加成员函数 实现获取地图渲染器信息功能 实现地图的简单符号渲染3.3 实验步骤结果实验思路:地图渲染是指用不同的颜色和符号对地图进行可视化。特征渲染器有八类,本实验是采用简单渲染器,即对整个图层要素用同一种方式进行渲染,操作对象是“World Cities”图层。由于要用到数据操作类函数,所以实验在实验二的基础上进行。实验分为以下几个部分:1. 添加主窗体控件和导入类库:地图表现菜单项和两个下拉菜单项简单渲染器和获取渲染器信息。2. 添加地图编制类并为其导入部分类库:该类用于管理当前项目中涉及地图整饰、修改和展示的相关功能3. 添加类成员函数:包括三个,分别是获取指定图层的渲染器类型信息函数、获取指定图层的符号信息函数、统一设置指定图层渲染参数函数4. 添加事件响应函数:简单渲染图层菜单项的点击事件响应函数、获取渲染器信息点击事件响应函数实现流程如下:关键代码:1.添加控件using ESRI.ArcGIS.Display;2.添加地图编制类using ESRI.ArcGIS.Carto;using ESRI.ArcGIS.Geodatabase;using ESRI.ArcGIS.Geometry;using ESRI.ArcGIS.Display;3.完善类的功能/添加成员函数,获取指定图层的渲染器类型信息 public static String GetRenderTypeByLayer(ILayer layer) /判断图层是否获取成功 if (layer = null) return 图层获取失败; /使用IFeatureLayer接口访问指定图层,并获取其渲染器 IFeatureLayer featureLayer = layer as IFeatureLayer; IGeoFeatureLayer geoFeatureLayer = layer as IGeoFeatureLayer; IFeatureRenderer featureRenderer = geoFeatureLayer.Renderer; /判断该图层渲染器是否为备选渲染器类型之一,匹配成功则返回类型信息 if (featureRenderer is ISimpleRenderer) return SimpleRenderer; else if (featureRenderer is IUniqueValueRenderer) return UniqueValueRenderer; else if (featureRenderer is IDotDensityRenderer) return DotDensityRenderer; else if (featureRenderer is IChartRenderer) return ChartRenderer; else if (featureRenderer is IProportionalSymbolRenderer) return ProportionalSymbolRenderer; else if (featureRenderer is IRepresentationRenderer) return RepresentationRenderer; else if (featureRenderer is IClassBreaksRenderer) return ClassBreaksRenderer; else if (featureRenderer is IBivariateRenderer) return BivariateRenderer; /如果匹配失败,返回提示 return 未知或渲染器获取失败; /添加静态成员函数,获取指定图层的符号信息 public static ISymbol GetSymbolFromLayer(ILayer layer) /判断图层是否获取成功 if (layer = null) return null; /访问图层,获取图层中的第一个要素,判断是否成功 IFeatureLayer featureLayer = layer as IFeatureLayer; IFeatureCursor featureCursor = featureLayer.Search(null, false); IFeature feature = featureCursor.NextFeature(); if (feature = null) return null; /访问指定图层,获取其渲染器,判断是否成功 IGeoFeatureLayer geoFeatureLayer = featureLayer as IGeoFeatureLayer; IFeatureRenderer featureRenderer = geoFeatureLayer.Renderer; if (featureRenderer = null) return null; /访问图层要素对应的符号信息,作为函数信息返回 ISymbol symbol = featureRenderer.get_SymbolByFeature(feature); return symbol; /添加静态成员函数,设置指定图层符号的颜色,并进行简单渲染 public static bool RenderSimply(ILayer layer, IColor color) /判断图层和颜色是否获取成功 if (layer = null | color = null) return false; /调用成员函数,获取指定图层的符号,判断是否成功 ISymbol symbol = GetSymbolFromLayer(layer); if (symbol = null) return false; /获取指定图层的要素类,判断是否成功 IFeatureLayer featureLayer = layer as IFeatureLayer; IFeatureClass featureClass = featureLayer.FeatureClass; if (featureClass = null) return false; /获取指定图层要素类的几何形状信息,并匹配,设置不同类型符号的颜色 esriGeometryType geoType = featureClass.ShapeType; switch (geoType) case esriGeometryType.esriGeometryPoint: IMarkerSymbol markerSymbol = symbol as IMarkerSymbol; markerSymbol.Color = color; break; case esriGeometryType.esriGeometryMultipoint: IMarkerSymbol markerSymbol = symbol as IMarkerSymbol; markerSymbol.Color = color; break; case esriGeometryType.esriGeometryPolyline: ISimpleLineSymbol simplelinesymbol = symbol as ISimpleLineSymbol; simplelinesymbol.Color = color; break; case esriGeometryType.esriGeometryPolygon: IFillSymbol fillSymbol = symbol as IFillSymbol; fillSymbol.Color = color; break; default: return false; /新建简单渲染器对象,设置符号,通过接口访问,判断是否成功 ISimpleRenderer simpleRenderer = new SimpleRendererClass(); simpleRenderer.Symbol = symbol; IFeatureRenderer featureRenderer = simpleRenderer as IFeatureRenderer; if (featureRenderer = null) return false; /通过接口访问指定图层,设置其渲染器 IGeoFeatureLayer geoFeatureLayer = featureLayer as IGeoFeatureLayer; geoFeatureLayer.Renderer = featureRenderer; return true; 4.实现图层简单渲染 /实现图层简单渲染 private void miRenderSimply_Click(object sender, EventArgs e) /获取World Cities图层 DataOperator dataOperator = new DataOperator(axMapControl1.Map); ILayer layer = dataOperator.GetLayerByName(World Cities); /设置颜色为红色 IRgbColor rgbColor = new RgbColorClass(); rgbColor.Red = 255; rgbColor.Green = 0; rgbColor.Blue = 0; /获取World Cities图层的符号信息,并通过接口访问设置好的颜色对象 ISymbol symbol = MapComposer.GetSymbolFromLayer(layer); IColor color = rgbColor as IColor; /实现该图层的简单渲染,判断是否成功,若成功,则刷新视图,显示渲染效果 bool bRes = MapComposer.RenderSimply(layer, color); if (bRes) axTOCControl1.ActiveView.ContentsChanged(); axMapControl1.ActiveView.Refresh(); miRenderSimply.Enabled = false; else MessageBox.Show(简单渲染图层失败!); /生成获取图层渲染器类型信息的获取 private void miGetRendererInfo_Click(object sender, EventArgs e) /获取World Cities图层 DataOperator dataOperator=new DataOperator(axMapControl1.Map); ILayer layer=dataOperator.GetLayerByName(World Cities); /消息框显示该图层的渲染器类型信息 MessageBox.Show(MapComposer.GetRenderTypeByLayer(layer); 5. 运行结果3 实验四:空间数据处理4.1 实验目的 了解创建空间数据的过程 掌握创建空间数据的方法4.2 实验内容 实现创建Shapefile文件的程序 实现新增点要素程序4.3 实验步骤与结果实验思路:本实验包含两个部分:在硬盘的指定路径下创建一个Shapefile文件;向创建的Shapefile文件中添加要素。实验仍然需要用到数据操作类,所以还是在实验二的基础上操作,对于该类的操作在之后不再赘述。实验主要包含以下几个部分:1.添加主窗体控件和类库引用:数据操作菜单项和下拉菜单项创建Shapefile菜单项。2.在数据操作类中添加成员函数:包含两个,创建Shapefile文件函数、以图层形式添加要素类函数3.添加事件响应函数:为创建Shapefile菜单项添加点击事件响应函数实现流程图如下:关键代码:1 添加控件和类库引用using ESRI.ArcGIS.Geodatabase;using ESRI.ArcGIS.DataSourcesFile;2 添加功能函数/添加创建shapefile文件功能函数 public IFeatureClass CreateShapefile( String sParentDirectory,/上级路径 String sWorkspaceName, /包含文件的文件夹名 String sFileName) /如果指定的路径和文件夹已经存在,则删除此文件夹 if(System.IO.Directory.Exists(sParentDirectory+sWorkspaceName) System.IO.Directory.Delete(sParentDirectory+sWorkspaceName,true); /通过工作空间工厂接口创建针对Shape文件的工作空间工场对象 /并通过参数创建相关工作空间,用于包含Shape文件 IWorkspaceFactory workspaceFactory=new ShapefileWorkspaceFactoryClass(); IWorkspaceName workspaceName=workspaceFactory.Create(sParentDirectory,sWorkspaceName,null,0); ESRI.ArcGIS.esriSystem.IName name=workspaceName as ESRI.ArcGIS.esriSystem.IName; /打开新建的工作空间,并通过接口访问 IWorkspace workspace=(IWorkspace)name.Open(); IFeatureWorkspace featureWorkspace=workspace as IFeatureWorkspace; /Shape文件在概念层次上是一个要素类。创建并编辑该要素类所需的字段集 IFields fields=new FieldsClass(); IFieldsEdit fieldsEdit=fields as IFieldsEdit; /创建并编辑“序号”字段 IFieldEdit fieldEdit=new FieldClass(); fieldEdit.Name_2=OID; fieldEdit.AliasName_2=序号; fieldEdit.Type_2=esriFieldType.esriFieldTypeOID; fieldsEdit.AddField(IField)fieldEdit); /创建并编辑“名称”字段 fieldEdit=new FieldClass(); fieldEdit.Name_2=Name; fieldEdit.AliasName_2=名称; fieldEdit.Type_2=esriFieldType.esriFieldTypeString; fieldsEdit.AddField(IField)fieldEdit); /创建地理定义,设置其空间参考和几何类型,为创建“形状”字段做准备 IGeometryDefEdit geoDefEdit=new GeometryDefClass(); ISpatialReference spatialReference=m_map.SpatialReference; geoDefEdit.SpatialReference_2=spatialReference; geoDefEdit.GeometryType_2=esriGeometryType.esriGeometryPoint; /创建并编辑“形状”字段 fieldEdit=new FieldClass(); String sShapeFieldName=Shape; fieldEdit.Name_2=sShapeFieldName; fieldEdit.AliasName_2=形状; fieldEdit.Type_2=esriFieldType.esriFieldTypeGeometry; fieldEdit.GeometryDef_2=geoDefEdit; fieldsEdit.AddField(IField)fieldEdit); /调用IFeatureWorkspce接口的CreateFeatureClass方法,创建要素类 /并判断是否创建成功 IFeatureClass featureClass=featureWorkspace.CreateFeatureClass(sFileName,fields,null,null,esriFeatureType.esriFTSimple,Shape,); if(featureClass=null) return null; /将创建好的要素类作为结果返回 return featureClass; public bool AddFeatureClassToMap(IFeatureClass featureClass, String sLayerName)/要素类,图层名 /判断要素类、图层名和地图对象是否为空,为空返回false if (f
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 17737.124-2026同轴通信电缆第1-124部分:电气试验方法漏泄电缆的耦合损耗试验
- T/ZGM 008-2025绿色产品评价 201×7凝胶型强碱性苯乙烯系阴离子交换树脂
- T/HNCAA 069-2025公路桥梁结构健康监测技术应用规程
- T/CIQA 67-2023“三同”产品 家用和类似用途电动洗衣机技术要求
- T/CAPSA 11202-2024生产安全事故应急响应标准文献元数据导则
- T/CSBME 090-2025车载医用X射线计算机体层摄影设备临床放射防护要求
- 2025~2026学年广东省河源市东源县人教版五年级上册数册中作业题【附答案】
- 2026学年湖南省醴陵市五年级语文期末提升竞赛挑战题(详细参考解析)详细答案和解析
- 2026学年云南省楚雄市五年级语文期末高分难点突破题(详细参考解析)详细答案和解析
- PHP初级面试题及详细答案(真实企业版)
- 砍伐树木劳工合同范本
- 掌骨骨折小课件
- 国家能源笔试试题及答案
- BMS基础知识培训课件
- 智能硬件产品设计与制造合同协议
- 配送生鲜公司管理制度
- 主轴维修合同范例
- 统编版语文五年级下册第一单元任务群整体公开课一等奖创新教学设计
- SHT+3413-2019+石油化工石油气管道阻火器选用检验及验收标准
- 内燃机车柴油机进排气系统-直流传动内燃机车柴油机进排气系统
- 软件过程文档模板(完整版)
评论
0/150
提交评论