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

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中是工具条。

 

posted @ 2013-06-03 23:34  铁手三郎  阅读(1032)  评论(0编辑  收藏  举报