1、前言

前面的博客介绍了在ArcEngine中如何创建各类符号,但是回顾一下ArcMap中的操作,你肯定会想:一个一个创建符号实在是太过麻烦,如果有一个符号选择器供我们使用就好了。这篇博客就来介绍一下如何创建一个如下图所示的点符号选择器。

2、符号样式文件

对于ArcEngine来说,它是不能直接使用ArcMap中的符号库的,它能使用的是一种后缀名为*.ServerStyle的文件。以我的电脑为例,我将ArcGIS安装在了C:\Program Files (x86)\目录下,则ServerStyle文件就在C:\Program Files (x86)\ArcGIS\Desktop10.2\Styles\目录下,找到"C:\Program Files (x86)\ArcGIS\Desktop10.2\Styles\zh-CN\ESRI.ServerStyle",把它复制到工程的Debug目录下即可。

3、实现代码

3.1、主界面代码

using System.Windows.Forms;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Geometry;namespace Win
{public partial class frmMain : Form{public frmMain(){InitializeComponent();axMapControl1.LoadMxFile(@"C:\Users\DSF\Desktop\data\无标题.mxd");}// axTOCControl1_OnMouseDownprivate void axTOCControl1_OnMouseDown(object sender, ESRI.ArcGIS.Controls.ITOCControlEvents_OnMouseDownEvent e){esriTOCControlItem item = esriTOCControlItem.esriTOCControlItemNone;IBasicMap pBasicMap = null;ILayer pLayer = null;object unk = null;object data = null;axTOCControl1.HitTest(e.x, e.y, ref item, ref pBasicMap, ref pLayer, ref unk, ref data);// 弹出符号选择器if (e.button == 1){if (item == esriTOCControlItem.esriTOCControlItemLegendClass){if (pLayer is IFeatureLayer){IFeatureLayer pFeatureLayer = pLayer as IFeatureLayer;if (pFeatureLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPoint){ILegendGroup pLegendGroup = unk as ILegendGroup;ILegendClass pLegendClass = pLegendGroup.get_Class((int)data);frmMarkerSymbol frm = new frmMarkerSymbol(axMapControl1.Object as IMapControlDefault, pLayer, pLegendClass);frm.ShowDialog();}}}}}}
}

3.2、符号选择器代码

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Display;
using stdole;namespace Win
{public partial class frmMarkerSymbol : Form{/// <summary>/// 地图符号对象/// </summary>private IMapControlDefault m_mapControl;private ILayer m_Layer;private ILegendClass m_LegendClass;private ISymbologyStyleClass m_SymbologyStyleClass;/// <summary>/// 符号属性集合/// </summary>private Dictionary<int, double> sizes;private Dictionary<int, double> angles;private Dictionary<int, Color> colors;/// <summary>/// 构造函数/// </summary>public frmMarkerSymbol(IMapControlDefault m_mapControl, ILayer m_Layer, ILegendClass m_LegendClass){InitializeComponent();// 初始化地图符号对象this.m_mapControl = m_mapControl;this.m_Layer = m_Layer;this.m_LegendClass = m_LegendClass;// 初始化符号属性集合this.sizes = new Dictionary<int, double>();this.angles = new Dictionary<int, double>();this.colors = new Dictionary<int, Color>();// 初始化符号控件Init();}/// <summary>/// 初始化控件/// </summary>private void Init(){axSymbologyControl1.LoadStyleFile(AppDomain.CurrentDomain.BaseDirectory + "ESRI.ServerStyle");axSymbologyControl1.StyleClass = esriSymbologyStyleClass.esriStyleClassMarkerSymbols;m_SymbologyStyleClass = axSymbologyControl1.GetStyleClass(axSymbologyControl1.StyleClass);// 添加当前符号IStyleGalleryItem pStyleGalleryItem = new ServerStyleGalleryItem();pStyleGalleryItem.Name = "当前符号";pStyleGalleryItem.Item = m_LegendClass.Symbol;m_SymbologyStyleClass.AddItem(pStyleGalleryItem, 0);// 符号属性集合for (int i = 0; i < m_SymbologyStyleClass.get_ItemCount(); i++){IStyleGalleryItem item = m_SymbologyStyleClass.GetItem(i);IMarkerSymbol pMarkerSymbol = item.Item as IMarkerSymbol;if (!sizes.ContainsKey(item.ID)){sizes.Add(item.ID, pMarkerSymbol.Size);}if (!angles.ContainsKey(item.ID)){angles.Add(item.ID, pMarkerSymbol.Angle);}if (!colors.ContainsKey(item.ID)){colors.Add(item.ID, ConvertToColor(pMarkerSymbol.Color));}}m_SymbologyStyleClass.SelectItem(0);}/// <summary>/// 双击选中符号/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void axSymbologyControl1_OnDoubleClick(object sender, ISymbologyControlEvents_OnDoubleClickEvent e){btnOk.PerformClick();}/// <summary>/// 切换符号/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void axSymbologyControl1_OnItemSelected(object sender, ISymbologyControlEvents_OnItemSelectedEvent e){IStyleGalleryItem pStyleGalleryItem = e.styleGalleryItem as IStyleGalleryItem;nudSize.Value = (decimal)sizes[pStyleGalleryItem.ID];nudAngle.Value = (decimal)angles[pStyleGalleryItem.ID];btnColor.BackColor = colors[pStyleGalleryItem.ID];// 预览IMarkerSymbol pMarkerSymbol = pStyleGalleryItem.Item as IMarkerSymbol;pMarkerSymbol.Size = sizes[pStyleGalleryItem.ID];pMarkerSymbol.Angle = angles[pStyleGalleryItem.ID];pMarkerSymbol.Color = ConvertToRgbColor(colors[pStyleGalleryItem.ID]);PriviewSymbol(pStyleGalleryItem);}/// <summary>/// 切换颜色/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnColor_Click(object sender, EventArgs e){ColorDialog colorDialog = new ColorDialog();if (colorDialog.ShowDialog() == DialogResult.OK){btnColor.BackColor = colorDialog.Color;// 预览IStyleGalleryItem pStyleGalleryItem = m_SymbologyStyleClass.GetSelectedItem();IMarkerSymbol pMarkerSymbol = pStyleGalleryItem.Item as IMarkerSymbol;pMarkerSymbol.Size = (double)nudSize.Value;pMarkerSymbol.Angle = (double)nudAngle.Value;pMarkerSymbol.Color = ConvertToRgbColor(btnColor.BackColor);PriviewSymbol(pStyleGalleryItem);}}/// <summary>/// 切换尺寸/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void nudSize_ValueChanged(object sender, EventArgs e){// 预览IStyleGalleryItem pStyleGalleryItem = m_SymbologyStyleClass.GetSelectedItem();IMarkerSymbol pMarkerSymbol = pStyleGalleryItem.Item as IMarkerSymbol;pMarkerSymbol.Size = (double)nudSize.Value;pMarkerSymbol.Angle = (double)nudAngle.Value;pMarkerSymbol.Color = ConvertToRgbColor(btnColor.BackColor);PriviewSymbol(pStyleGalleryItem);}/// <summary>/// 切换角度/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void nudAngle_ValueChanged(object sender, EventArgs e){// 预览IStyleGalleryItem pStyleGalleryItem = m_SymbologyStyleClass.GetSelectedItem();IMarkerSymbol pMarkerSymbol = pStyleGalleryItem.Item as IMarkerSymbol;pMarkerSymbol.Size = (double)nudSize.Value;pMarkerSymbol.Angle = (double)nudAngle.Value;pMarkerSymbol.Color = ConvertToRgbColor(btnColor.BackColor);PriviewSymbol(pStyleGalleryItem);}/// <summary>/// 确定/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnOk_Click(object sender, EventArgs e){IGeoFeatureLayer pGeoFeatureLayer = m_Layer as IGeoFeatureLayer;IFeatureRenderer pFeatureRenderer = pGeoFeatureLayer.Renderer;ISimpleRenderer pSimpleRenderer = pFeatureRenderer as ISimpleRenderer;pSimpleRenderer.Symbol = m_SymbologyStyleClass.GetSelectedItem().Item as ISymbol;m_mapControl.Refresh();this.Close();}/// <summary>/// 取消/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnCancel_Click(object sender, EventArgs e){this.Close();}/// <summary>/// Color转换为IColor/// </summary>/// <param name="color"></param>/// <returns></returns>private IColor ConvertToRgbColor(Color color){IColor pColor = new RgbColor();pColor.RGB = color.R + color.G * 256 + color.B * 65536;return pColor;}/// <summary>/// IColor转换为Color/// </summary>/// <param name="pColor"></param>/// <returns></returns>private Color ConvertToColor(IColor pColor){return ColorTranslator.FromOle(pColor.RGB);}/// <summary>/// 预览符号/// </summary>private void PriviewSymbol(IStyleGalleryItem pStyleGalleryItem){IPictureDisp pPictureDisp = m_SymbologyStyleClass.PreviewItem(pStyleGalleryItem, picMarkerSymbol.Width, picMarkerSymbol.Height);Image priviewImage = Image.FromHbitmap(new IntPtr(pPictureDisp.Handle));picMarkerSymbol.Image = priviewImage;}}
}

运行结果如下图所示:

ArcEngine符号化——点符号选择器相关推荐

  1. ArcEngine符号化——点符号

    1.前言 在GIS系统的开发过程中,地图符号化其实是非常重要的一块内容.ArcEngine为我们提供了很多种符号样式,现在就来介绍一下ArcEngine中的点状符号. 2.常用的点符号 2.1.简单符 ...

  2. ArcEngine符号化——文本符号

    1.前言 在ArcEngine中,文本符号主要用于设置IElement的样式,涉及到的接口为ITextSymbol,下面开始介绍. 2.实现代码 demo的主要功能为:在PageLayoutContr ...

  3. 符号化Symbol(符号)体系

    符号化Symbol(符号)体系 ArcGIS Engine9.3为开发人员提供了32种符号,主要分为三大类符号MarkerSymbol(点符号). LineSymbol(线符号)和FillSymbol ...

  4. 《ArcGIS Engine+C#实例开发教程》第七讲 图层符号选择器的实现2

    <ArcGIS Engine+C#实例开发教程>第七讲 图层符号选择器的实现2 原文:<ArcGIS Engine+C#实例开发教程>第七讲 图层符号选择器的实现2 摘要:在第 ...

  5. ArcGIS的符号选择器(Symbol Selector)为空的解决办法

    ArcGIS的符号选择器(Symbol Selector)为空的解决办法 GIS思维 最近,许多学员与群友反应了一个不大不小的问题,ArcGIS的符号选择器(Symbol Selector)一篇空白, ...

  6. 符号化Symbol(符号)体系(转载)

    转自:http://blog.sina.com.cn/s/blog_4ce8fd7c0100h4lt.html ArcGIS Engine9.3为开发人员提供了32种符号,主要分为三大类符号Marke ...

  7. [转] ArcEngine 产生专题图

    小生原文 ArcEngine 产生专题图 ArcEngine提供多个着色对象用于产生专题图,可以使用标准着色方案,也可以自定义着色方案,ArcEngine提供8中标准着色方案. 一.SimpleRen ...

  8. AE二次开发中几个功能速成归纳(符号设计器、创建要素、图形编辑、属性表编辑、缓冲区分析)...

    /** 实习课上讲进阶功能所用文档,因为赶时间从网上抄抄改改,凑合能用,记录一下以备个人后用.** -------------------------------------------------- ...

  9. ArcMap:线、面符号的制作(通用线符号的制作)超详细

    ** 实验一:虚拟铁路.自行车骑行路线符号(通用线符号的制作) ** ** 标题制作虚拟铁路符号 ** 第一步:创建符号图层 打开ArcMap 软件,单击菜单栏中的[自定义(C)]→[样式管理器(S) ...

最新文章

  1. 为什么要进行图学习?谈一谈逆势而上的图神经网络
  2. Linux的一些基本命令与MySQL索引
  3. 数据结构之链表反向打印
  4. join,列表和字典用for循环的删除,集合,深浅拷贝
  5. 漫画:为什么程序员没有女友?
  6. Highcharts+Spring饼图使用实例
  7. 如何用openweather显示html,如何显示openweathermap天气图标
  8. mediacodec编解码少帧问题
  9. config配置文件原理及使用
  10. CATIA VBA二次开发介绍
  11. html星空代码在线,怎么操作html星空特效代码
  12. linux 分区100g整数,[转载]硬盘分区 整G 整数 法(从1g到200g最精确的整数分区)(转)...
  13. 高电平和低电平之间的电平芯片会识别成什么
  14. 鲁菜泰斗同和居 日坛新店用上便民新科技
  15. 代码管理平台—svn
  16. R语言-来自Prosper的贷款数据探索
  17. H3C设备忘记密码修改办法
  18. 服务器空文件夹无法删除怎么办,空的文件夹无法删除怎么办 空的文件夹无法删除的原因【图文】...
  19. 外国用户和国内用户看待浏览器的问题
  20. linux下DNW用法

热门文章

  1. QT添加qss文件和资源文件
  2. 信息项目管理师 第8章 项目整合管理
  3. 全靠这些素材站和工具,在自媒体平台做短视频剪辑,每月有5千多
  4. Betsy 的旅行 剪枝优化
  5. movie计算机英语作文,英语四级写作范文附解析 第22篇:The Influence of Movies 电影的...
  6. SAP deliver solution 与 maintenance 的一段流水账
  7. 什么东西改善睡眠,助眠好物分享
  8. matlab字符串和变量拼接,matlab中字符串拼接方法
  9. linux下安装Jenkins(centos7,另附使用docker安装)
  10. 如何转换PDF文件?试试这3种方法