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

 

你可能感兴趣的:(ArcEngine)