《GIS二次开发实验报告(共50页).docx》由会员分享,可在线阅读,更多相关《GIS二次开发实验报告(共50页).docx(50页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上GIS二次开发实验报告学 号: 姓 名: 班 级: 专 业: 指导老师: 二零一五年11月15日专心-专注-专业目录9444145 实验五:GIS分析.200006实验六:栅格数据处理.25552511 实验一:软件安装与AOI书签开发1.1 实验目的 掌握AOI书签程序开发1.2 实验内容 实现AOI书签的创建 实现AOI书签的调用1.3 实验步骤与结果 安装程序后,新建地图显示项目。在程序的主窗体上端添加添加菜单项,文本属性为创建书签,控件名为miCreateBookmark,在旁边添加组合框,控件名为cbBookmarkList。1.右击引用选择AddArcGI
2、S Reference在弹出的对话框中添加引用在主窗体(即MainForm.cs)中添加代码;(1)首先添加引用代码:using ESRI.ArcGIS.Display;using ESRI.ArcGIS.esriSystem;using ESRI.ArcGIS.Carto;using ESRI.ArcGIS.Controls;using ESRI.ArcGIS.ADF;using ESRI.ArcGIS.SystemUI;using ESRI.ArcGIS.Geometry;using ESRI.ArcGIS.Geodatabase;using ESRI.ArcGIS.DataSources
3、File;using ESRI.ArcGIS.DataSourcesRaster;(此引用代码都需添加引用后才可以使用,上述引用代码为本类中所需要的所有引用,在之后的编程中,可以不用重复引用)(2) 添加“创建书签”函数在MainForm类中添加成员函数CreateBookMark,代码如下:public void CreateBookmark(string sBookmarkName)/参数为书签名 /通过IAOIBookmark接口创建一个变量,其类型为AOIBookmark,用于保存当前地图的范围 IAOIBookmark aoiBookmark = new AOIBookmarkCla
4、ss(); if (aoiBookmark != null) aoiBookmark.Location = axMapControl1.ActiveView.Extent; aoiBookmark.Name = sBookmarkName; /通过IMaoBookmarks接口访问当前地图,并向地图中加入新建书签 IMapBookmarks bookmarks = axMapControl1.Map as IMapBookmarks; if (bookmarks != null) bookmarks.AddBookmark(aoiBookmark); /将新建书签名加入组合框中,用于之后调用对
5、应书签 cbBookmarkList.Items.Add(aoiBookmark.Name); 2. 添加“书签名成设置”窗体 (1)点击项目添加Windows窗体,该窗体命名为“AdmitBookmarkName.cs”,点击添加后,转入设计窗口。 (2)设置窗体的文本属性为“书签名称设置”,尺寸设置为“200,100”,初始位置设置为“CenterScreen” (3)添加控件,添加一个文本框,控件名为“tbBookmarkName”。一个按钮,文本属性为“确认”,控件名为“btnAdmit” (4)双击“确认”按钮,自动生成点击事件响应函数,并转至窗体代码页。3. 添加成员变量m_frm
6、Main,并为确认按钮输入代码,代码如下: /用于保存主窗体对象 public MainForm m_frmMain; /用于传入主窗体对象 public AdmitBookmarkName(MainForm frm) InitializeComponent(); if (frm != null) m_frmMain = frm; /确认按钮的“点击”事件响应函数,用于创建书签 private void btnAdmit_Click(object sender, EventArgs e) if (m_frmMain != null | tbBookmarkName.Text = ) m_frm
7、Main.CreateBookmark(tbBookmarkName.Text); this.Close(); 4. 为主窗体的“创建书签”菜单生成“点击”事件响应函数,代码如下: AdmitBookmarkName frmABN = new AdmitBookmarkName(this); frmABN.Show();5. 为组合框cb_BookmarkList生成“选择索引更改”事件响应函数,代码如下/组合框的“选择索引更改”事件响应函数,用于在改变组合框所选项时地图范围变为其对应书签所保存的范围 private void cbBookmarkList_SelectedInexChange
8、d(object sender, EventArgs e) /访问地图所包含的书签,并获取书签序列 IMapBookmarks bookmarks = axMapControl1.Map as IMapBookmarks; IEnumSpatialBookmark enumSpatialBookmark = bookmarks.Bookmarks; /对地图所包含的书签进行遍历,获取与组合框所选项名称相符的书签 enumSpatialBookmark.Reset(); ISpatialBookmark spatialBookmark = enumSpatialBookmark.Next();
9、while (spatialBookmark != null) if (cbBookmarkList.SelectedItem.ToString() = spatialBookmark.Name) spatialBookmark.ZoomTo(IMap)axMapControl1.ActiveView); axMapControl1.ActiveView.Refresh(); break; spatialBookmark = enumSpatialBookmark.Next(); 6.实验结果如下2 实验二:地图数据组织与访问2.1 实验目的 了解ArcGIS Engine中地图数据的组织结构
10、 掌握ArcGIS Engine地图数据访问方法2.2 实验内容 编写“数据操作”类 利用DataGridView控件展示Continents图层的序号和名称字段2.3 实验步骤与结果1.添加“空间数据”菜单项,在下拉菜单中添加一个菜单项文本为“访问图层数据”名称为“miAccessData”,用于稍后调用“数据展示台”窗体。2.新建窗体类,窗体文件命名为“DataBoard.cs”文本属性为“数据展示台”。添加一个文本框,控件名为“tbDataName”,一个数据网格视图,控件名为“dataGridView1”,ReadOnly=true。如图所示3.在当前窗体代码中加入以下代码 publi
11、c DataBoard(String sDataName, DataTable dataTable) /初始化窗体及控件 InitializeComponent(); /设置文本框中的文本和数据网格视图的数据源 tbDataName.Text = sDataName; dataGridView1.DataSource = dataTable; 4. 添加类,命名为“DataOPerator.cs”并导入类库引用using System.Data;using ESRI.ArcGIS.Carto;using ESRI.ArcGIS.Geometry;using ESRI.ArcGIS.Geodat
12、abase;using ESRI.ArcGIS.DataSourcesFile;5. 添加以下代码 /保存当前地图对象 public IMap m_map; /用于传入当前地图对象 public DataOperator(IMap map) m_map = map; 6. 添加“获取地图图层”功能函数。代码如下public ILayer GetLayerByName(String sLayerName) /判断图层名或地图对象是否为空。若为空,函数返回空。 if (sLayerName = | m_map = null) return null; /对地图对象中的所有图层进行遍历。若某一图层的
13、名称与指定图层名相同,则返回该图层、 for (int i = 0; i m_map.LayerCount; i+) if (m_map.get_Layer(i).Name = sLayerName) return m_map.get_Layer(i); return null; 7. 添加成员函数GetContinentsNames代码如下 public DataTable GetContinentsName() /获取“Continents”图层,利用IFeatureLayer接口访问,并判断是否成功。若失败,函数返回空 ILayer layer = GetLayerByName(Cont
14、inents); IFeatureLayer featureLayer = layer as IFeatureLayer; if (featureLayer = null) return null; /调用IFeatureLayer接口的Seach方法,获取要素指针(IFeatureCursor)接口对象,用于在之后遍历图层中的全部要素,并判断是否成功获取第一个要素,若失败,函数返回空 IFeature feature; IFeatureCursor featureCursor = featureLayer.Search(null, false); feature=featureCursor.
15、NextFeature(); if (feature=null ) return null ; /新建DataTable类型对象,用于函数返回 DataTable dataTable = new DataTable(); /新建DataColumn类型对象,分别保存各个州的序号和名称。设置完毕后,加入DataTable的列集合(Columns)中。 DataColumn dataColumn = new DataColumn(); dataColumn.ColumnName =序号; dataColumn.DataType = System.Type.GetType(System.Int32)
16、; dataTable.Columns.Add (dataColumn ); dataColumn =new DataColumn (); dataColumn.ColumnName =名称; dataColumn.DataType = System.Type.GetType(System.String); dataTable.Columns.Add(dataColumn ); /对图层中的要素进行遍历。每获取一个要素,就关联DataTable的下一个DataRow,将要素在序号和名称字段上的值赋给DataRow的对应列中。在ContInents图层属性表中,序号信息在第0个字段中,名称信息在
17、第2个字段中。相关内容可以通过ArcMap对地图文档进行查看。 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; 8. 添加“访问图层数据”菜单“点击”事件响应函数,代码如下pri
18、vate void miAccessData_Click(object sender, EventArgs e) /获取保存各个州名称的DataTable,将其作为构造函数的参数,新建“数据展示台”窗体对象 DataOperator dataOperator = new DataOperator(axMapControl1.Map); DataBoard dataBoard = new DataBoard( 各大洲洲名, dataOperator.GetContinentsName(); /运行载有数据的“数据展示台”窗体对象。 dataBoard.Show(); 9.实验结果如下3 实验三:
19、地图渲染与制图输出3.1 实验目的 了解地图符号的分类与可视化过程 掌握地图符号的渲染方法3.2 实验内容 编写“地图编制”类,添加成员函数 实现获取地图渲染器信息功能 实现地图的简单符号渲染3.3 实验步骤结果1. 添加一个主窗体菜单控件,控件名为“miCarto”,文本属性为“地图表现”,添加两个下拉菜单项文本属性分别为“简单渲染图层”和“获取渲染器信息”,控件名分别为“miRenderSimple”和“miGetRenderInfo”2. 添加类库引用3. 添加“地图编制”类命名为“MapComposer.cs”,添加类库引用。添加成员函数,代码如下;public static Stri
20、ng GetRendererTypeByLayer(ILayer layer) /判断图层是否获取成功。若失败,函数返回“图层失败” if (layer = null) return 图层获取失败; /使用IGeoFeatureLayer接口访问指定图层,并获取其渲染器。 IFeatureLayer featureLayer = layer as IFeatureLayer; IGeoFeatureLayer geoFeatureLayer = layer as IGeoFeatureLayer; IFeatureRenderer featureRenderer = geoFeatureLay
21、er.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 IChart
22、Renderer) returnChartRenderer; else if (featureRenderer is IProportionalSymbolRenderer) return ProportionalSymbolRenderer; else if (featureRenderer is IRepresentationRenderer) return RepresentationRenderer; else if (featureRenderer is IClassBreaksRenderer) return ClassBreaksRenderer; else if (featur
23、eRenderer is IBivariateRenderer) return BivariateRenderer; /若渲染器类型匹配失败,则返回“未知或渲染器获取失败”。 return 未知或渲染器获取失败; /添加静态成员函数GetRendererType,用于获取指定图层的符号信息。 public static ISymbol GetSymbolFromLayer(ILayer layer) /判断图层是否获取成功。若失败,函数返回空。 if (layer = null) return null; / 利用IFeatureLayer接口访问指定图层,获取到图层中的第一个要素,判断是否成
24、功。富哦失败,函数返回空。 IFeatureLayer featureLayer = layer as IFeatureLayer; IFeatureCursor featureCursor = featureLayer.Search(null, false); IFeature feature = featureCursor.NextFeature(); if (feature = null) return null; /利用IGeoFeatureLayer访问指定图层,获取其渲染器,并判断是否成功。否则失败,函数返回空。 IGeoFeatureLayer geoFeatureLayer =
25、 featureLayer as IGeoFeatureLayer; IFeatureRenderer featureRenderer = geoFeatureLayer.Renderer; if (featureRenderer = null) return null; /通过IFeatureRenderer接口的方法获取图层要素对应的符号信息,并作为函数结果返回。 ISymbol symbol = featureRenderer.get_SymbolByFeature(feature); return symbol; /添加静态成员函数RenderSimply,用于统一设置指定图层的颜色,
26、并进行简单渲染。 public static bool RenderSimply(ILayer layer, IColor color) /判断图层和颜色是否获取成功。若失败,函数返回false. if (layer = null | color = null) return false; /调用GetSymbolFromLayer成员函数,获取指定图层的符号,并判断是否成功。若失败,函数返回false。 ISymbol symbol = GetSymbolFromLayer(layer); if (symbol = null) return false; /获取指定图层的要素类,并判断是否成
27、功。若失败,函数返回false。 IFeatureLayer featureLayer = layer as IFeatureLayer; IFeatureClass featureClass = featureLayer.FeatureClass; if (featureClass = null) return false; /获取指定图层要素类的几何形状信息,并进行匹配。根据不同相撞,设置不同类型符号的颜色。若几何形状不属于 /Point、MultiPoint、PolyLine和Polygon,则函数返回false。 esriGeometryType geoType = featureCl
28、ass.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 esri
29、GeometryType.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; /新建简单渲染器对象,设置其符
30、号。通过IFeatureRenderer接口访问它,并判断是否成功。若失败,函数返回false。 ISimpleRenderer simpleRenderer = new SimpleRendererClass(); simpleRenderer.Symbol = symbol; IFeatureRenderer featureRenderer = simpleRenderer as IFeatureRenderer; if (featureRenderer = null) return false; /通过IGeoFeatureLayer接口访问指定图层,并设置其渲染器。函数返回ture。
31、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); ILay
32、er layer = dataoperator.GetLayerByName(World Cities); IRgbColor rgbColor = new RgbColorClass(); rgbColor.Red = 255; rgbColor.Green =0; rgbColor.Blue = 0; ISymbol symbol = MapComposer.GetSymbolFromLayer(layer); IColor color = rgbColor as IColor; bool bRes = MapComposer.RenderSimply(layer, color); if
33、(bRes) axTOCControl1.ActiveView.ContentsChanged(); axMapControl1.ActiveView.Refresh(); miRenderSimply.Enabled = false; else MessageBox.Show(简单渲染图层失败!); 5. 添加“获取渲染器信息”点击事件响应函数代 private void miGetRendererInfo_Click(object sender, EventArgs e) DataOperator dataOperator = new DataOperator(axMapControl1.Map); ILayer layer = dataOperator.GetLayerByName(World Cities);