1、山东建筑大学AE二次开发实习大作业课程设计GIS设计与实现实验报告课 程: ArcGIS二次开发院 (部): 土木工程学院专 业: 地理信息系统 班 级: 地理XXX学生姓名: XXXX学 号: XXXXX指导教师: XXX 教研室主任:XXX 院长(主任): XXX 一、实验目的1、掌握ArcGIS二次开发的流程。2、熟悉ArcEngine平台进行二次开发。3、掌握GIS专题图开发操作。二、实验要求1、使用ArcGIS Engine平台,利用C#或者Java语言,开发专题图程序2、结合编程环境和ArcGIS Engine提供的控件,按照实验指导书要求,设计程序的界面3、工具条的功能分别为:放
2、大视图、缩小视图、平移视图、前一视图、后一视图、完全视图和增加图层。这些功能可以利用ArcGIS Engine提供的内置工具实现。4、专题图菜单中包含单值专题图、等级专题图和点密度专题图三项子菜单三、实验步骤1、新建项目 启动VS2010软件,新建一个Windows Forms Application工程并命名为“XXXX”2、设计程序界面(1)、按照指导书的实验要求布置窗体,设计程序界面,向窗体中添加一个SplitContainer容器,设置其属性中的Dock值为Fill;添加一个ToolbarControl控件,设置属性值Dock为Top;添加TOCControl和MapControl设置
3、属性Dock值都为Fill.(2)、向窗体中添加menuStrip菜单并命名为“专题图”,然后设置三个子菜单分别为“单值专题图”、“等级专题图”、“点密度专题图”(3)、按照指导书要求,在工具条添加放大视图、缩小视图、平移视图、前一视图、后一视图、完全视图和增加图层。(4)、为了实现专题图功能,需要加载一副具有数值型字段的多边形图,可以使用ArcGIS Engine自带的实例地图,在安装目录途径下寻找需要的实例地图“DeveloperKit10.0javasamplesdatausausa.gdb”下的图层states。(5)、程序界面设计完成后的效果为:3、专题图功能实现3.1、单值专题图功
4、能实现(1)、鼠标双击“专题图”的子菜单“单值专题图”,编写代码如下:namespace XXXX public partial class xxxxxx : Form public XXXX InitializeComponent(); private void Form1_Load(object sender, EventArgs e) private void 单值专题图ToolStripMenuItem_Click(object sender, EventArgs e) /获取当前图层 ,并把它设置成IGeoFeatureLayer的实例 IMap pMap = axMapContro
5、l1.Map; ILayer pLayer = pMap.get_Layer(0) as IFeatureLayer; IFeatureLayer pFeatureLayer = pLayer as IFeatureLayer; IGeoFeatureLayer pGeoFeatureLayer = pLayer as IGeoFeatureLayer; /获取图层上的feature IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass; IFeatureCursor pFeatureCursor = pFeatureClass.Se
6、arch(null, false); /定义单值图渲染组件 IUniqueValueRenderer pUniqueValueRenderer = new UniqueValueRenderer(); /设置渲染字段对象 pUniqueValueRenderer.FieldCount = 1; pUniqueValueRenderer.set_Field(0, STATE_NAME); /创建填充符号 ISimpleFillSymbol PFillSymbol = new SimpleFillSymbol(); pUniqueValueRenderer.DefaultSymbol = (ISy
7、mbol)PFillSymbol; pUniqueValueRenderer.UseDefaultSymbol = false; /QI the table from the geoFeatureLayer and get the field number of ITable pTable; int fieldNumber; pTable = pGeoFeatureLayer as ITable; fieldNumber = pTable.FindField(STATE_NAME); if (fieldNumber = -1) MessageBox.Show(Cant find field c
8、alled , Message, MessageBoxButtons.OK, MessageBoxIcon.Information); /创建并设置随机色谱 IRandomColorRamp pColorRamp = new RandomColorRamp(); pColorRamp.StartHue = 0; pColorRamp.MinValue = 99; pColorRamp.MinSaturation = 15; pColorRamp.EndHue = 360; pColorRamp.MaxValue = 100; pColorRamp.MaxSaturation = 30; pCo
9、lorRamp.Size = 100; /pColorRamp.Size = pUniqueValueRenderer.ValueCount; bool ok = true; pColorRamp.CreateRamp(out ok); IEnumColors pEnumRamp; pEnumRamp = pColorRamp.Colors; /为每个值设置一个符号 int n = pFeatureClass.FeatureCount(null); for (int i = 0; i n; i+) IFeature pFeature = pFeatureCursor.NextFeature()
10、; IClone pSourceClone = PFillSymbol as IClone; ISimpleFillSymbol pSimpleFillSymbol = pSourceClone.Clone() as ISimpleFillSymbol; string pFeatureValue = pFeature.get_Value(pFeature.Fields.FindField(STATE_NAME).ToString(); pUniqueValueRenderer.AddValue(pFeatureValue, 美国州名, (ISymbol)pSimpleFillSymbol);
11、/为每个符号设置颜色 for (int i = 0; i = pUniqueValueRenderer.ValueCount - 1; i+) string xv = pUniqueValueRenderer.get_Value(i); if (xv != ) ISimpleFillSymbol pNextSymbol = (ISimpleFillSymbol)pUniqueValueRenderer.get_Symbol(xv); pNextSymbol.Color = pEnumRamp.Next(); pUniqueValueRenderer.set_Symbol(xv, (ISymbo
12、l)pNextSymbol); /将单值图渲染对象与渲染图层挂钩 pGeoFeatureLayer.Renderer = (IFeatureRenderer)pUniqueValueRenderer; pGeoFeatureLayer.DisplayField = STATE_NAME; /刷新地图和TOOCotrol IActiveView pActiveView = axMapControl1.Map as IActiveView; pActiveView.Refresh(); axTOCControl1.Update();(2)、编写完成后,按F5编译代码,会出现错误,然后根据提示添加相
13、应的引用项,操作如下:然后在全部代码开头输入如下命令:3.2、等级专题图实现(1)、鼠标双击“专题图”菜单的“等级专题图”,编写代码如下: private void 等级专题图 ToolStripMenuItem_Click(object sender, EventArgs e) IMap pMap = axMapControl1.Map; ILayer pLayer = pMap.get_Layer(0) as IFeatureLayer; IFeatureLayer pFeatureLayer = pLayer as IFeatureLayer; IGeoFeatureLayer pGeo
14、FeatureLayer = pLayer as IGeoFeatureLayer; /获取图层上的feature IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass; IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, false); IFeature pFeature = pFeatureCursor.NextFeature(); / /定义所需的接口对象和相关变量 IClassBreaksUIProperties pUIProperties; object da
15、taValues; object dataFrequency; /double cb; int breakIndex; long ClassesCount; int numClass; numClass = 10; double Classes; / /* Were going to retrieve frequency data from a population field and then classify this data*/ ITable pTable; pTable = pFeatureClass as ITable; IBasicHistogram pBasicHist = n
16、ew BasicTableHistogram(); ITableHistogram pTableHist; pTableHist = (ITableHistogram)pBasicHist; /Get values and frequencies for the population field into a table histogram object pTableHist.Field = POP2000; pTableHist.Table = pTable; pBasicHist.GetHistogram(out dataValues, out dataFrequency); IClass
17、ifyGEN pClassifyGEN = new Quantile(); pClassifyGEN.Classify(dataValues, dataFrequency, ref numClass); Classes = (double)pClassifyGEN.ClassBreaks; ClassesCount = long.Parse(Classes.GetUpperBound(0).ToString(); /Initialise a new class breaks renderer and supply the number of class breaks and the field
18、 to perform the class breaks on. IClassBreaksRenderer pClassBreaksRenderer = new ClassBreaksRenderer(); pClassBreaksRenderer.Field = POP2000; /pClassBreaksRenderer.BreakCount = ClassesCount; pClassBreaksRenderer.MinimumBreak = Classes0; pClassBreaksRenderer.SortClassesAscending = true; /设置着色对象的分级数目
19、pClassBreaksRenderer.BreakCount = int.Parse(ClassesCount.ToString(); /创建并设置随机色谱 IAlgorithmicColorRamp pColorRamp = new AlgorithmicColorRamp(); pColorRamp.Algorithm = esriColorRampAlgorithm.esriCIELabAlgorithm; IEnumColors pEnumColors; IRgbColor pColor1 = new RgbColor(); IRgbColor pColor2 = new RgbCo
20、lor(); pColor1.Red = 100; pColor1.Green = 150; pColor1.Blue = 0; pColor2.Red = 100; pColor2.Green = 0; pColor2.Blue = 0; pColorRamp.FromColor = pColor1; pColorRamp.ToColor = pColor2; pColorRamp.Size = numClass; bool ok = true; pColorRamp.CreateRamp(out ok); pEnumColors = pColorRamp.Colors; pEnumColo
21、rs.Reset();/ use this interface to set dialog properties pUIProperties = pClassBreaksRenderer as IClassBreaksUIProperties; pUIProperties.ColorRamp = Custom; ISimpleFillSymbol pSimpleMarkerSymbol = new SimpleFillSymbol(); IColor pColor; int colors = new intnumClass; / be careful, indices are differen
22、t for the diff lists for (breakIndex = 0; breakIndex ClassesCount; breakIndex+) pClassBreaksRenderer.set_Label(breakIndex, ClassesbreakIndex + - + ClassesbreakIndex + 1); pUIProperties.set_LowBreak(breakIndex, ClassesbreakIndex); pSimpleMarkerSymbol = new SimpleFillSymbol(); pColor = pEnumColors.Nex
23、t(); pSimpleMarkerSymbol.Color = pColor; colorsbreakIndex = pColor.RGB; pClassBreaksRenderer.set_Symbol(breakIndex, (ISymbol)pSimpleMarkerSymbol); pClassBreaksRenderer.set_Break(breakIndex, ClassesbreakIndex + 1); /将等级图渲染对象与渲染图层挂钩 pGeoFeatureLayer.Renderer = (IFeatureRenderer)pClassBreaksRenderer; /
24、刷新地图和TOOCotrol IActiveView pActiveView = axMapControl1.Map as IActiveView; pActiveView.Refresh(); axTOCControl1.Update(); (2)、按F5进行编译,出现问题如下解决该问题方法为,在Progrom.cs中添加如下一句代码:ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);然后重新编译错误解决。3.3、点密度专题图(1)、鼠标双击“专题图”菜单的“点密度专题图”,编写实现该功能代码如下
25、:private void 点密度专题图ToolStripMenuItem_Click_1(object sender, EventArgs e) /获取当前图层 ,并把它设置成IGeoFeatureLayer的实例 IMap pMap = axMapControl1.Map; ILayer pLayer = pMap.get_Layer(0) as IFeatureLayer; IFeatureLayer pFeatureLayer = pLayer as IFeatureLayer; IGeoFeatureLayer pGeoFeatureLayer = pLayer as IGeoFea
26、tureLayer; /获取图层上的feature IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass; IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, false); IFeature pFeature = pFeatureCursor.NextFeature(); /定义点密度图渲染组件 IDotDensityRenderer DotDensityRenderer = new DotDensityRendererClass(); /定义点密度图渲染组件对象的渲
27、染字段对象 IRendererFields flds = (IRendererFields)DotDensityRenderer; flds.AddField(POP2000, POP2000); /flds.AddField(Shape, Shape); /定义点密度图渲染得符号对象 IDotDensityFillSymbol ddSym = new DotDensityFillSymbol(); IRgbColor BackColor = new RgbColor(); BackColor.Red = 255; BackColor.Blue = 0; BackColor.Green = 2
28、55; IRgbColor SymbolColor = new RgbColor(); SymbolColor.Red = 255; SymbolColor.Blue = 0; SymbolColor.Green = 0; /点密度图渲染背景颜色 ddSym.BackgroundColor = BackColor; ddSym.DotSize = 3; ddSym.FixedPlacement = true; /ddSym.Color = SymbolColor; ILineSymbol pLineSymbol = new CartographicLineSymbol(); ddSym.Out
29、line = pLineSymbol; /定义符号数组 ISymbolArray symArray = (ISymbolArray)ddSym; /添加点密度图渲染的点符号到符号数组中去 ISimpleMarkerSymbol pMarkerSymbol = new SimpleMarkerSymbol(); pMarkerSymbol.Style = esriSimpleMarkerStyle.esriSMSCircle; pMarkerSymbol.Size = 0.3; pMarkerSymbol.Color = SymbolColor; ; symArray.AddSymbol(pMa
30、rkerSymbol as ISymbol); /设置点密度图渲染的点符号 /DotDensityRenderer.DotDensitySymbol =symArray; /获取所有记录中该字段的最大值和最小值 DataStatistics ds = new DataStatistics(); ICursor cursor = (ICursor)pFeatureLayer.FeatureClass.Search(null, false); IDataStatistics dataStatistics = new DataStatisticsClass(); dataStatistics.Field = POP2000; dataStatistics.Cursor = cursor; ESRI.ArcGIS.esriSystem.IStatisticsResults statisticsResults = dataStatistics.St
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1