1、Arcgis Engine二次开发实验报告GIS二次开发实验报告学 号: * * * * 班 级: 1423101 专 业: 地理信息系统 任课老师: 李小龙 二零一七年六月十二日1实验一:AOI书签开发1.1实验目的掌握AOI书签程序开发1.2实验内容实现AOI书签的创建实现AOI书签的调用1.3实验步骤与结果实验思路、关键代码(全面注释)、运行结果截图实验思路:空间书签是用户定义创建的标志某个特定地理位置的快捷方式,创建好书签后能够很方便的找到某个地理位置。在本实验中我们需要创建的是AOI书签,即用户所关心的一个范围,通过调用该书签,用户可以马上找到书签所指范围。实现本实验主要包括以下几个
2、方面:1.添加控件和类库引用:添加创建书签控件、保存和调用书签控件,添加Geometry类库2.添加“创建书签”函数:创建书签,保存当前感兴趣范围,将书签名加入组合框,以便调用3.添加“书签名称设置”窗体:获取书签名,传递给主窗体4.添加两个事件响应函数:“创建书签”菜单项的点击事件,作用是打开“书签名称设置”窗体;“确认”按钮的点击事件,作用是调用创建书签函数5.实现与调用书签:添加组合框的事件响应函数,作用是当组合框中选项改变时,地图将刷新显示出书签所记录的范围。实现创建书签的流程图如下:关键代码:1.添加控件和类库引用using ESRI.ArcGIS.Geometry;2.添加“创建书
3、签”函数public void CreateBookmark(string sBookmarkName) /参数名为书签名 /通过IAOIBookmark接口创建一个变量,用于保存当前地图的范围 IAOIBookmark aoiBookmark = new AOIBookmarkClass(); /判断如果变量不为空的话,将当前地图的属性赋给变量,变量名为书签名 if (aoiBookmark != null) aoiBookmark.Location = axMapControl1.ActiveView.Extent; aoiBookmark.Name = sBookmarkName; /通
4、过IMapBookmarks接口访问当前地图,在地图中加入新建书签 IMapBookmarks bookmarks = axMapControl1.Map as IMapBookmarks; if (bookmarks != null) bookmarks.AddBookmark(aoiBookmark); /将新建书签名加入组合框,以便调用 cbBookmarkList.Items.Add(aoiBookmark.Name); 3.添加“书签名称设置”窗体/定义一个主窗体变量,用于保存主窗体对象 public MainForm m_frmMain; /用于传入主窗体对象 public Adm
5、itBookmarkName(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.实现与调用书签/“创建书签”按钮的“点击”事件响
6、应函数 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
7、.Map as IMapBookmarks; IEnumSpatialBookmark enumSpatialBookmark = bookmarks.Bookmarks; /对地图所包含的书签进行遍历,获取与组合框所选项名称相符的书签 enumSpatialBookmark.Reset(); ISpatialBookmark spatialBookmark = enumSpatialBookmark.Next(); while (spatialBookmark != null) if (cbBookmarkList.SelectedItem.ToString() = spatialBookm
8、ark.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实验步骤与结果实验思路:本实
9、验要实现的功能是地理数据列表显示,是用.NET Framework提供的数据格网视图控件显示指定图层的属性数据,操作对象为“Continents”图层中各个洲的名称数据。实验包含以下几部分:1.添加控件:“空间数据”菜单项和“访问图层数据”下拉菜单项2.添加“数据展示台”窗体:用于显示访问图层的名称数据3.添加数据操作类,为该类导入相关引用和类库:用于管理当前项目中涉及数据操作的相关功能4.为数据操作类添加相应函数:主要是两个获取函数,一个是获取图层函数,目的是获取各图层;一个是获取“Continents”图层,并读取该图层中各个洲的名称,以DataTable类型返回5.添加事件响应函数:添加
10、“访问图层数据”菜单项点击函数,显示数据展示台窗体实验实现的流程图如下:关键代码: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.
11、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(Cont
12、inents); 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; /
13、新建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(); dataColu
14、mn.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.
15、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(各大洲洲名, dataOpera
16、tor.GetContinentsNames(); dataBoard.Show(); 实验结果:2实验三:地图渲染3.1 实验目的了解地图符号的分类与可视化过程掌握地图符号的渲染方法3.2 实验内容编写“地图编制”类,添加成员函数实现获取地图渲染器信息功能实现地图的简单符号渲染3.3 实验步骤结果实验思路:地图渲染是指用不同的颜色和符号对地图进行可视化。特征渲染器有八类,本实验是采用简单渲染器,即对整个图层要素用同一种方式进行渲染,操作对象是“World Cities”图层。由于要用到数据操作类函数,所以实验在实验二的基础上进行。实验分为以下几个部分:1.添加主窗体控件和导入类库:地图表现菜
17、单项和两个下拉菜单项简单渲染器和获取渲染器信息。2.添加地图编制类并为其导入部分类库:该类用于管理当前项目中涉及地图整饰、修改和展示的相关功能3.添加类成员函数:包括三个,分别是获取指定图层的渲染器类型信息函数、获取指定图层的符号信息函数、统一设置指定图层渲染参数函数4.添加事件响应函数:简单渲染图层菜单项的点击事件响应函数、获取渲染器信息点击事件响应函数实现流程如下:关键代码:1.添加控件using ESRI.ArcGIS.Display;2.添加地图编制类using ESRI.ArcGIS.Carto;using ESRI.ArcGIS.Geodatabase;using ESRI.Arc
18、GIS.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
19、 IGeoFeatureLayer; IFeatureRenderer featureRenderer = geoFeatureLayer.Renderer; /判断该图层渲染器是否为备选渲染器类型之一,匹配成功则返回类型信息 if (featureRenderer is ISimpleRenderer) return SimpleRenderer; else if (featureRenderer is IUniqueValueRenderer) return UniqueValueRenderer; else if (featureRenderer is IDotDensityRender
20、er) 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
21、 IClassBreaksRenderer) return ClassBreaksRenderer; else if (featureRenderer is IBivariateRenderer) return BivariateRenderer; /如果匹配失败,返回提示 return 未知或渲染器获取失败; /添加静态成员函数,获取指定图层的符号信息 public static ISymbol GetSymbolFromLayer(ILayer layer) /判断图层是否获取成功 if (layer = null) return null; /访问图层,获取图层中的第一个要素,判断是否成
22、功 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; IFeature
23、Renderer featureRenderer = geoFeatureLayer.Renderer; if (featureRenderer = null) return null; /访问图层要素对应的符号信息,作为函数信息返回 ISymbol symbol = featureRenderer.get_SymbolByFeature(feature); return symbol; /添加静态成员函数,设置指定图层符号的颜色,并进行简单渲染 public static bool RenderSimply(ILayer layer, IColor color) /判断图层和颜色是否获取成功
24、 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 = nul
25、l) return false; /获取指定图层要素类的几何形状信息,并匹配,设置不同类型符号的颜色 esriGeometryType geoType = featureClass.ShapeType; switch (geoType) case esriGeometryType.esriGeometryPoint: IMarkerSymbol markerSymbol = symbol as IMarkerSymbol; markerSymbol.Color = color; break; case esriGeometryType.esriGeometryMultipoint: IMark
26、erSymbol 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 =
27、 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)
28、 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 DataOpe
29、rator(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.R
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1