一、前言
到这里我们的代码就已经很简单了,因为不涉及到属性表,对我而言,前期我在学习AE时,特别杵属性表,话不多少,我们来看看下面功能吧!
二、功能实现
2.1 在地图上显示北京各个区县的名称
代码实现 在主菜单【北京区县名称标注】的Click()
#region 北京区县名称标注
private void 北京区县名称标注ToolStripMenuItem_Click(object sender, EventArgs e)
{
pMap = axMapControl1.Map;
goal_Flayer(pMap);
// FeatureLaye是要素图层 IFeature 是IFeatureLayer中的一个要素
//从IFeatureLayer中得到IFeatureClass 再利用游标IFeatureCursor就可以把这些IFeature一个个遍历出来
//获得图层所有要素
IFeatureClass pFeatureClass = pFeatLayer.FeatureClass;
IFeatureCursor pFeatCursor = pFeatureClass.Search(null, true);
IFeature pFeature = pFeatCursor.NextFeature();
while (pFeature != null)
{
IFields pFields = pFeature.Fields;
//找出标注字段的索引号
int index = pFields.FindField("Name");
//得到要素的Envelope
IEnvelope pEnve = pFeature.Extent;
IPoint pPoint = new PointClass();
pPoint.PutCoords(pEnve.XMin + pEnve.Width / 2, pEnve.YMin + pEnve.Height / 2);
//新建字体对象
stdole.IFontDisp pFont;
pFont = new stdole.StdFontClass() as stdole.IFontDisp;
pFont.Name = "arial";
//产生一个文本符号
ITextSymbol pTextSymbol = new TextSymbolClass();
//设置文本符号的大小
pTextSymbol.Size = 20;
pTextSymbol.Font = pFont;
pTextSymbol.Color = GetRgbColor(255, 0, 0);
//产生一个文本对象
ITextElement pTextElement = new TextElementClass();
pTextElement.Text = pFeature.get_Value(index).ToString();
pTextElement.ScaleText = true;
pTextElement.Symbol = pTextSymbol;
IElement pElement = pTextElement as IElement;
pElement.Geometry = pPoint;
IActiveView pActiveView = pMap as IActiveView;
IGraphicsContainer pGraphicsContainer = pMap as IGraphicsContainer;
//添加元素
pGraphicsContainer.AddElement(pElement, 0);
pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
pPoint = null;
pElement = null;
pFeature = pFeatCursor.NextFeature();
}
}
#endregion
当程序运行成功时,点击主菜单【北京区县名称标注】,便自动在地图上显示北京各个区县的名称,结果如图1所示。
图1 在地图上显示北京各个区县的名称
2.2 为北京各个区县匹配一个符号
代码实现 在主菜单【北京区县符号化】的Click()
private void 北京区县符号化ToolStripMenuItem_Click(object sender, EventArgs e)
{
pMap = axMapControl1.Map;
goal_Flayer(pMap);
IGeoFeatureLayer pGeoFeatLyr = pFeatLayer as IGeoFeatureLayer;
//设置面填充符号
ISimpleFillSymbol pSimpleFillSymbol = new SimpleFillSymbolClass();
//设置面填充为垂直线填充 你也可以改成其他的 换个Style
pSimpleFillSymbol.Style = esriSimpleFillStyle.esriSFSVertical;
pSimpleFillSymbol.Color = GetRgbColor(150, 150, 150);
//更改符号样式
ISimpleRenderer pSimpleRenderer = new SimpleRendererClass();
pSimpleRenderer.Symbol = pSimpleFillSymbol as ISymbol;
pGeoFeatLyr.Renderer = pSimpleRenderer as IFeatureRenderer;
axMapControl1.Refresh();
axTOCControl1.Update();
}
当程序运行成功时,点击主菜单【北京区县符号化】,便自动为北京各个区县匹配一个符号,结果如图2所示。
图2为北京各个区县匹配一个符号
2.3 导出北京区县图层为一个新的数据
代码实现 在主菜单【区县图层转CAD】的Click()
在此我使用的是GP工具,在这里我们应该要学会如何 输出GP工具真正错误信息!!!
//使用GP工具
Geoprocessor gp = new Geoprocessor();
gp.OverwriteOutput = true;
ESRI.ArcGIS.ConversionTools.ExportCAD pExportCAD = new ESRI.ArcGIS.ConversionTools.ExportCAD();
pMap = axMapControl1.Map;
goal_Flayer(pMap);
string Path = System.IO.Directory.GetCurrentDirectory(); //获取应用程序的当前工作目录。
string shpPath = Path + "\\北京区县界.shp";
string CADpath= Path+ "\\北京区县界_ExportCAD.dwg";
pExportCAD.in_features = shpPath;
pExportCAD.Output_Type = "DWG_R2010";
pExportCAD.Output_File = CADpath;
try
{
gp.Execute(pExportCAD, null);
MessageBox.Show("您已成功转为DWG格式!"+"\r\n"+ "存储在"+ CADpath);
}
catch (Exception ex)
{
// 输出GP工具真正错误信息
for (int i = 0; i < gp.MessageCount; i++)
MessageBox.Show(ex.Message+ gp.GetMessage(i));
}
}
当程序运行成功时,点击主菜单【区县图层转CAD】,便自动弹出显示框告诉我们已经转换成功以及存储的位置,结果如图3所示。
图3 区县图层转CAD
2.4 在监测站点图层添加一个新站点
这这里我是选择设计了一个输入XY值的窗体,也很简单,但是更简单的是用ToolBarControl 的Editor工具,更easy,在真正参加比赛时还是用Editor吧,还可以写入属性表,不想加了,还可以选中用delete键删除。
选中ToolBarControl1,右键【属性】,在【Items】界面点击【Add…】,加入Feature Editing相关工具,如下图所示
运行程序,点击开始编辑,如下图
点击【Stretch tool】,便可加入站点,一切就yes Ok,如果不喜欢选中delete,哈哈哈,我最喜欢这个功能,我的用写代码完成的这个功能我就不赘述了,难道这个不香吗?哈哈哈
三 心得体会
从大二我就一直想写博客,想把我遇见的问题总结出来,哪怕没人看,我也能看看当时的我是被哪些难题绊住了,知道大三下学期,我才真正完成我的第一篇博客,第二篇,哈哈,人生的又一个第一次,感觉还是很nice的!当我独自完成这道题目时,我对参加全国大学生GIS应用比赛获得特等奖、一等奖的学生,更加敬佩!在下午三小时不仅要完成分析,还要完成开发以及文档的编写,更让我了解到人外有人,天外天,还得需要不断充实自我!加油吧!少年,最近因为期末实习、补作业,已经耽误了我的考研进度,还得务实,明天希望我元气满满!希望这篇文章可以给你们带来便利!