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