ArcGIS Engine二次开发——提高篇1缩略图(鹰眼)鹰眼功能是GIS的主要功能之一,当地图范围很大时,它可以很好的为用户指明当前地图的范围。
在本小节中我们将学习如何制作这种鹰眼。
1.1添加控件新建一个C#.Net项目,项目名称为OverView,将Form1的名字设置为MainForm,并添加ToolbarControl 、两个MapControl和LicenceControl等四个控件。
布局如下图所示。
左边的axMapControl1用于地图数据显示和操作,右边axMapControl2用于鹰眼显示。
图 1 界面布局在ToolbarControl 加载添加数据按钮和地图浏览的功能按钮,如下图所示,并将ToolbarControl的伙伴控件设为axMapControl1。
图2添加按钮1.2代码添加及解释鹰眼用来显示主窗体当前视图范围在全景视图中的位置,在ArcMap中使用一个线框在鹰眼视图中标识。
当主视图中的视图范围改变时,鹰眼中的线框随之改变,当拖动鹰眼视图中的红线框时,主视图中的视图范围也随之改变。
下面开始实现鹰眼功能,添加、、三个引用。
首先在axMapControl1中视图范围改变时鹰眼窗体要做出对应的响应,即绘制线框并显示,在OnExtentUpdated事件中添加代码如下:private void axMapControl1_OnExtentUpdated(object sender, e){et项目,项目名称为Buffer,将Form1的名字设置为MainForm,并添加ToolbarControl 、MapControl、TOCControl、LicenceControl和Button等五个控件。
并将ToolbarControl 、TOCControl的伙伴控件设为MapControl,Button控件的Name属性设定为btnBuffer,Text属性设定为“缓冲区分析”。
控件布局效果如下图所示。
图3控件布局效果在ToolbarControl 加载添加数据按钮和地图浏览的功能按钮,如下图所示。
图4添加按钮1.2.1代码添加及解释首先添加如下四个命名空间的引用。
在使用Geoprocessor工具实现缓冲区分析时,需要首先定义一个Geoprocessor对象,因为命名空间“也包含Geoprocessor类,为了避免混淆,我们使用命名空间来定义Geoprocessor,然后设置Geoprocessor中的环境参数,这里我们使用默认参数。
然后定义一个操作类Buffer,并设置参数,生成缓冲区的参数包含原始图层,缓冲半径和输出路径,最后使用已定义的Geoprocessor对象执行即可。
双击“生成缓存区”按钮,添加代码如下:private void btnBuffer_Click(object sender, EventArgs e){hp)|*.shp";hp" != {("输出路径错误!");return;}et项目,项目名称为OverLay,将Form1的名字设置为MainForm,并添加ToolbarControl 、MapControl、TOCControl、LicenceControl和Button等五个控件。
并将ToolbarControl 、TOCControl的伙伴控件设为MapControl,Button控件的Name属性设定为btnIntersect,Text属性设定为“叠置求交”。
控件布局效果如下图所示。
图5控件布局效果在ToolbarControl 加载添加数据按钮和地图浏览的功能按钮,如下图所示。
图6添加按钮1.2.2代码添加及解释首先添加如下引用:using与缓冲区分析的实现类似,在使用Geoprocessor工具实现叠置分析时,需要首先定义一个Geoprocessor对象,因为命名空间“也包含Geoprocessor类,为了避免混淆,我们使用命名空间来定义Geoprocessor,然后设置Geoprocessor中的环境参数,这里我们使用默认参数。
然后定义一个操作类,这里为Intersect,然后设置其操作参数,这里我们仅设置输入的要素,最后使用已定义的Geoprocessor对象执行即可。
双击“生成缓存区”按钮,添加代码如下:private void btnIntersect_Click(object sender, EventArgs e){hp)|*.shp";= "选择第一个要素";hp)|*.shp";= "选择第二个要素";hp)|*.shp";hp";;string strName = (index);Union et项目,项目名称为OverLay,将Form1的名字设置为MainForm,Text 属性设为“地图编辑”,并添加ToolbarControl 、MapControl、TOCControl、LicenceControl、四个Button、两个ComboBox、两个Label和一个GroupBox等控件。
将ToolbarControl 、TOCControl的伙伴控件设为MapControl,ToolbarControl 加载添加数据按钮和地图浏览的功能按钮。
控件布局效果如下图所示。
图7界面效果控件属性设置如下:表1控件属性设置1.3添加引用和代码ArcEngine中的地图编辑使用IWorkspaceEdit接口来进行编辑状态的管理,在需要对指定的工作空间进行编辑时,首先使用IWorkspaceEdit获取该工作空间的数据,然后使用StartEditing方法开始编辑状态,StartEditOperation方法打开具体编辑的操作,编辑完成后,使用StopEditOperation方法关闭编辑操作,使用StopEditing方法关闭编辑状态,完成编辑。
在本例中,我们实现了新的点线面要素的创建和移动的功能,涉及到了比较复杂的鼠标与地图间的交互,这个功能的实现中,IDisplayFeedback是一个十分关键的接口,它具有涉及创建要素,移动要素、编辑节点等31个实现类,能够实现鼠标与地图交互中的事件的追踪,返回新的几何对象。
本例的实现,我们首先来添加一个编辑类,将涉及到的编辑的相关方法抽象到这个类中。
在项目中添加“Edit”类。
添加如下引用。
using定义如下成员变量。
private bool mIsEditing; orkspace;mWorkspaceEdit = pWorkspace as IWorkspaceEdit;if (mWorkspaceEdit == null)return;creenDisplay;pNewLineFeedback = mDisplayFeedback as INewLineFeedback;creenDisplay;pNewPolygonFeedback = mDisplayFeedback as INewPolygonFeedback;creenDisplay;et项目,项目名称为MapRender,将Form1的名字设置为MainForm,并添加ToolbarControl 、MapControl、TOCControl、LicenceControl和Button等五个控件。
并将ToolbarControl 、TOCControl的伙伴控件设为MapControl。
控件布局效果如下图所示。
图8控件布局效果在ToolbarControl 加载添加数据按钮和地图浏览的功能按钮,如下图所示。
图9工具栏设置效果添加Buttom按钮的属性设置如下:表4控件属性设置1.4代码添加及解释该工程需要添加如下引用:usingusingusingusingusing在axMapControl1控件中添加图层,如图所示:图10添加初始化图层1. 简单着色代码添加添加btnSimpIeRenderer按钮的Click事件代码:private void btnSimpIeRenderer_Click(object sender, EventArgs e){IMap pMap = ;分级着色代码添加在前面代码的基础上添加如下引用:usingusing然后添加btnCIassBreakRenderer按钮的Click事件代码:private void btnCIassBreakRenderer_Click(object sender, EventArgs e) {IGeoFeatureLayer pGeoFeatureL;ITable pTable;IClassifyGEN pClassify;ITableHistogram pTableHistogram;IBasicHistogram pHistogram;object dataFrequency;object dataValues;double[] Classes;int ClassesCount;IClassBreaksRenderer pClassBreaksRenderer;IHsvColor pFromColor;IHsvColor pToColor;IAlgorithmicColorRamp pAlgorithmicCR;IEnumColors pEnumColors;bool ok;IColor pColor;ISimpleFillSymbol pSimpleFillS;int lbreakIndex;string strPopField = "POP1990";int numDesiredClasses = 5;IMap pMap = ;= 0;pGeoFeatureL = (IGeoFeatureLayer)(0);ET中必须使用IClassifyGEN这个借口定义的对象才能实现分级。
3. 唯一值着色代码添加添加btnUniqueValueRenderer按钮的Click事件代码:private void btnUniqueValueRenderer_Click(object sender, EventArgs e) {IGeoFeatureLayer m_pGeoFeatureL;IUniqueValueRenderer pUniqueValueR;IFillSymbol pFillSymbol;IColor pNextUniqueColor;IEnumColors pEnumRamp;ITable pTable;int lfieldNumber;IRow pNextRow;IRowBuffer pNextRowBuffer;ICursor pCursor;IQueryFilter pQueryFilter;string codeValue;IRandomColorRamp pColorRamp;string strNameField = "State_Name";IMap pMap = ;= 0;m_pGeoFeatureL = (IGeoFeatureLayer)(0);pUniqueValueR = new UniqueValueRendererClass();pTable = (ITable)m_pGeoFeatureL;lfieldNumber = (strNameField);if (lfieldNumber == -1){("未能找到字段 " + strNameField);return;}唯一值着色代码添加在前面代码的基础上添加引用using stdole;然后添加btnSymbolRenderer按钮的Click事件代码:private void btnSymbolRenderer_Click(object sender, EventArgs e) {IGeoFeatureLayer pGeoFeatureLayer;IFeatureLayer pFeatureLayer;IProportionalSymbolRenderer pProportionalSymbolR;ITable pTable;IQueryFilter pQueryFilter;ICursor pCursor;IFillSymbol pFillSymbol;ICharacterMarkerSymbol pCharaterMarkerS;IDataStatistics pDataStatistics;IStatisticsResults pStatisticsResult;pFontDisp;IRotationRenderer pRotationRenderer;IMap pMap = ;= 0;pFeatureLayer = (IGeoFeatureLayer)(0);pGeoFeatureLayer = (IGeoFeatureLayer)pFeatureLayer;pTable = (ITable)pGeoFeatureLayer;pQueryFilter = new QueryFilterClass();("");pCursor = (pQueryFilter, true);质量图着色代码添加这里以柱状图为例,先添加引用如下:然后添加btnChartRenderer按钮的Click事件代码:private void btnChartRenderer_Click(object sender, EventArgs e){IGeoFeatureLayer pGeoFeatureL;IFeatureLayer pFeatureLayer;ITable pTable;ICursor pCursor;IQueryFilter pQueryFilter;IRowBuffer pRowBuffer;int numFields = 2;int[] fieldIndecies = new int[numFields];int lfieldIndex;double dmaxValue;bool firstValue;double dfieldValue;IChartRenderer pChartRenderer;IRendererFields pRendererFields;IFillSymbol pFillSymbol;IMarkerSymbol pMarkerSymbol;ISymbolArray pSymbolArray;IChartSymbol pChartSymbol;简单着色代码添加添加btnDotDensityRenderer按钮的Click事件代码:private void btnDotDensityRenderer_Click(object sender, EventArgs e) {IGeoFeatureLayer pGeoFeatureL;IDotDensityRenderer pDotDensityRenderer;IDotDensityFillSymbol pDotDensityFillS;IRendererFields pRendererFields;ISymbolArray pSymbolArray;ISimpleMarkerSymbol pSimpleMarkerS;string strPopField = "POP1990";IMap pMap = ;pGeoFeatureL = (IGeoFeatureLayer)(0);pDotDensityRenderer = new DotDensityRendererClass();pRendererFields = (IRendererFields)pDotDensityRenderer;//添加点密度着色的字段名(strPopField, strPopField);pDotDensityFillS = new DotDensityFillSymbolClass();//设置着色符号的大小和颜色= 4;IRgbColor color = new RgbColorClass();= 0;= 0;= 0;= color;//设置着色符号的背景颜色= 239;= 228;= 190;= color;pSymbolArray = (ISymbolArray)pDotDensityFillS;//设置点符号样式pSimpleMarkerS = new SimpleMarkerSymbolClass();= ;= 4;= 128;= 128;= 255;= color;((ISymbol)pSimpleMarkerS);= pDotDensityFillS;//设置一个点代表的值= 200000;//创建图例();= (IFeatureRenderer)pDotDensityRenderer;null, null);}着色的效果如下图所示:图11根据POP1990字段的点密度着色图效果1.5小结地图专题图制作是GIS中数据显示和分析的重要环节,涉及到的对象和接口也比较多,上面实例只是简单的实现了五种专题图的显示。