ArcEngine 9.3 学习笔记(七):图层符号化(利用ESRI自带的符号库进行唯一值符号化:图层开发实例;设计GIS系统符号化模块注意事项)...

来自:https://blog.csdn.net/kailuan2zhong/article/details/81714083

4.8 利用ESRI自带的符号库进行唯一值符号化:图层开发实例
  目的:学会开发唯一值符号化要素图层功能
  步骤:

    1、准备点数据,添加属性字段“类别”;
    2、为要素“类别”属性值分别设置为Hospital 2 、School 1、Airport 三种属性值;
      以上两步应该是创建MXD,然后在程序中 打开MXD,点击按钮,实现下面click的功能
    3、实现唯一值符号化功能
    4、运行程序实现效果

  功能开发: 实现唯一值符号化功能 代码如下:

      1         /// <summary>
      2         /// 获取符号库中符号
      3         /// </summary>
      4         /// <param name="sServerStylePath">符号库全路径名称</param>
      5         /// <param name="sGalleryClassName">GalleryClass名称</param>
      6         /// <param name="symbolName">需要获取的符号名称</param>
      7         /// <returns>符号</returns>
      8         private ISymbol GetSymbol(string sServerStylePath, string sGalleryClassName, string symbolName)
      9         {
     10             try
     11             {
     12                 // ServerStyleGallery对象
     13                 IStyleGallery pStyleGaller = new ServerStyleGalleryClass();
     14                 IStyleGalleryStorage pStyleGalleryStorage = pStyleGaller as IStyleGalleryStorage;
     15                 IEnumStyleGalleryItem pEnumStyleGalleryItem = null;
     16                 IStyleGalleryItem pStyleGallerItem = null;
     17                 IStyleGalleryClass pStyleGalleryClass = null;
     18                 // 使用IStyleGalleryStorage接口的AddFile方法加载ServerStyle文件
     19                 pStyleGalleryStorage.AddFile(sServerStylePath);
     20                 // 遍历ServerGallery中的Class
     21                 //(因为IStyleGallery  QI到了 IStyleGalleryStorage ,IStyleGalleryStorage加载了文件后,IStyleGallery中就有内容了)
     22                 for (int i = 0; i < pStyleGaller.ClassCount; i++)
     23                 {
     24                     pStyleGalleryClass = pStyleGaller.get_Class(i);
     25                     if (pStyleGalleryClass.Name != sGalleryClassName)
     26                     {
     27                         continue;
     28                     }
     29
     30                     // 获取EnumStyleGalleryItem对象  ,联系之前Rose的代码段
     31                     pEnumStyleGalleryItem = pStyleGaller.get_Items(sGalleryClassName, sServerStylePath, "");
     32                     pEnumStyleGalleryItem.Reset();
     33
     34                     // 遍历pEnumStyleGalleryItem
     35                     pStyleGallerItem = pEnumStyleGalleryItem.Next();
     36                     while (pStyleGallerItem!=null)
     37                     {
     38                         if (pStyleGallerItem.Name == symbolName)
     39                         {
     40                             // 获取符号
     41                             ISymbol pSymbol = pStyleGallerItem.Item as ISymbol;
     42                             // 释放Com对象??
     43                             System.Runtime.InteropServices.Marshal.ReleaseComObject(pEnumStyleGalleryItem);
     44                             System.Runtime.InteropServices.Marshal.ReleaseComObject(pEnumStyleGalleryItem);
     45                             return pSymbol;
     46                         }
     47                         else
     48                         {
     49                         }
     50                         pStyleGallerItem = pEnumStyleGalleryItem.Next();
     51                     }
     52                 }
     53                 System.Runtime.InteropServices.Marshal.ReleaseComObject(pEnumStyleGalleryItem);
     54                 System.Runtime.InteropServices.Marshal.ReleaseComObject(pStyleGalleryClass);
     55                 return null;
     56             }
     57             catch (Exception)
     58             {
     59                 return null;
     60             }
     61         }
     62
     63         /// <summary>
     64         /// 设置要素图层唯一值符号化
     65         /// </summary>
     66         /// <param name="pFeatureLayer"></param>
     67         private void UniqueValueRenderFlyr(IFeatureLayer pFeatureLayer)
     68         {
     69             try
     70             {
     71                 // 创建UniqueValueRendererClass对象(存储符号,存储规则 是 符号名:字段名:符号)
     72                 IUniqueValueRenderer pUVRender = new UniqueValueRendererClass();
     73                 //创建属性字段
     74                 List<string> pFieldValues = new List<string>();
     75                 pFieldValues.Add("Hospital 2");
     76                 pFieldValues.Add("School 1");
     77                 pFieldValues.Add("Airport");
     78                 for (int i = 0; i < pFieldValues.Count; i++)
     79                 {
     80                     ISymbol pSymbol = new SimpleMarkerSymbolClass();
     81                     // 获取指定 符号库中 对应符号名的 符号
     82                     pSymbol = GetSymbol(@"c:\Program File\ArcGIS\Styles\ESRI.ServerStyle", "Marker Symbols", pFieldValues[i]);
     83                     // 添加唯一值符号化字段值和相对应的符号
     84                     pUVRender.AddValue(pFieldValues[i], pFieldValues[i], pSymbol);
     85                 }
     86                 // 设置唯一值符号化的字段个数和字段名
     87                 pUVRender.FieldCount = 1;
     88                 pUVRender.set_Field(0, "类别");
     89
     90                 IGeoFeatureLayer pGFeatureLyr = pFeatureLayer as IGeoFeatureLayer;
     91                 // 设置IGeoFeatureLayer的Renderer属性
     92                 pGFeatureLyr.Renderer = pUVRender as IFeatureRenderer;
     93             }
     94             catch (Exception)
     95             {
     96                 throw;
     97             }
     98         }
     99
    100         // click 事件
    101         private void button1_click(object sender, EventArgs e,AxMapControl axMapControl1)
    102         {
    103             IFeatureLayer pFeatureLaye = axMapControl1.get_Layer(0) as IFeatureLayer;
    104             UniqueValueRenderFlyr(pFeatureLaye);
    105             axMapControl1.Refresh();
    106         
    107         }

以下是文章中的截图,为了更好的理解以上代码功能,截取出来,放在下面:

  

  图1 : ArcGIS 中自带符号库文件

 

图2:自行创建mdx文件(注意属性表中字段设置)

 

图3:功能实现效果

4.9 设计GIS系统符号化模块

4.9.1 通过系统符号化配置表, 存储 图层符号化信息,  符号化图层
  就是在数据库中 创建配置表,写进去,什么图层使用什么符号,类似的主外键关系,类似 角色、权限关系
  例如表中字段有:图层ID ,符号化类型,符号库ID , 符号名称,符号类型
  然后使用AE提供的每种符号化类型的接口对图层进行符号化渲染

4.9.2 通过AE提供的Represatation存储要素符号化
  Representation是AG9.3 新特性,能够通过Representation制作精美、更复杂的地图操作过程,Representation 在AG中是工具条。

 
————————————————
版权声明:本文为CSDN博主「Fredok_915」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/kailuan2zhong/article/details/81714083

原文地址:https://www.cnblogs.com/gisoracle/p/15630014.html