轉自點選打開連結
一、擷取ServerStyle庫中的符号
Style符号庫在ArcGIS Engine開發中對應的是ServerStyle符号庫,可以通過專門的轉換程式把ArcGIS Desktop Style符号庫轉換為ArcGIS Engine所能夠使用的ServerStyle符号庫。
用于擷取ServerStyle符号庫中的符号主要涉及到以下:
接口名稱 | 功能描述 |
IStyleGallery | 用于管理Style Gallery |
IStyleGalleryStorage | 管理Style Gallery中的符号庫檔案 |
IStyleGalleryClass | 控制符号庫中Style Gallery Class |
IEnumStyleGalleryItem | 枚舉一組Style Gallery items |
IStyleGalleryItem | 定義Style Galle ry itme |
擷取ESRI符号庫中名稱為Rose的符号的流程:
1.首先建構一個ServerStyleGallery對象
2.其次使用IStyleGalleryStorage接口的AddFile方法加載ServerStyle檔案
3.周遊ServerGallery中的Class,如果是FillSymbol使用IStyleGallery的GetItems方法傳回一個可枚舉的包含一系列StyleGalleryItem的EnumStyleGalleryItem對象。
4.周遊EnumServerStyleGalleryItme枚舉對象中的StylegalleryItme如果名稱是Rose即可擷取ESRI符号庫中名稱為Rose的StylegalleryItme,然後通過IStyleGalleryItem的Item屬性即可轉換為ISymbol。
///<summary>
///擷取符号庫中符号
///</summary>
///<param name="sServerStylePath">符号庫全路徑名稱</param>
///<param name="sGalleryClassName">GalleryClass名稱</param>
///<param name="symbolName">符号名稱</param>
///<returns>符号</returns>
private ISymbol GetSymbol(string sServerStylePath, string sGalleryClassName, string symbolName)
{
try
{
//ServerStyleGallery對象
IStyleGallery pStyleGaller = new ServerStyleGalleryClass();
IStyleGalleryStorage pStyleGalleryStorage = pStyleGaller as IStyleGalleryStorage;
IEnumStyleGalleryItem pEnumSyleGalleryItem=null;
IStyleGalleryItem pStyleGallerItem = null;
IStyleGalleryClass pStyleGalleryClass = null;
//使用IStyleGalleryStorage接口的AddFile方法加載ServerStyle檔案
pStyleGalleryStorage.AddFile(sServerStylePath);
//周遊ServerGallery中的Class
for (int i = 0; i < pStyleGaller.ClassCount; i++)
{
pStyleGalleryClass = pStyleGaller.get_Class(i);
if (pStyleGalleryClass.Name != sGalleryClassName)
continue;
//擷取EnumStyleGalleryItem對象
pEnumSyleGalleryItem = pStyleGaller.get_Items(sGalleryClassName, sServerStylePath, "");
pEnumSyleGalleryItem.Reset();
//周遊pEnumSyleGalleryItem
pStyleGallerItem = pEnumSyleGalleryItem.Next();
while (pStyleGallerItem != null)
{
if (pStyleGallerItem.Name == symbolName)
{
//擷取符号
ISymbol pSymbol = pStyleGallerItem.Item as ISymbol;
System.Runtime.InteropServices.Marshal.ReleaseComObject(pEnumSyleGalleryItem);
System.Runtime.InteropServices.Marshal.ReleaseComObject(pStyleGalleryClass);
return pSymbol;
}
pStyleGallerItem = pEnumSyleGalleryItem.Next();
}
}
System.Runtime.InteropServices.Marshal.ReleaseComObject(pEnumSyleGalleryItem);
System.Runtime.InteropServices.Marshal.ReleaseComObject(pStyleGalleryClass);
return null;
}
catch (Exception Err)
{
MessageBox.Show(Err.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return null;
}
}
二、進行唯一值符号化
1.準備點資料,添加屬性字段“類别”;
2.并為要素“類别”屬性值分别設定為“Hospital2”,“School 1”,“Airport”三種屬性值。
3.實作唯一值符号化功能
///<summary>
///設定要素圖層唯一值符号化
///</summary>
///<param name="pFeatureLayer"></param>
private void UniqueValueRenderFlyr(IFeatureLayer pFeatureLayer)
{
try
{
//建立UniqueValueRendererClass對象
IUniqueValueRenderer pUVRender = new UniqueValueRendererClass();
List<string> pFieldValues= new List<string>();
pFieldValues.Add("Hospital 2");
pFieldValues.Add("School 1");
pFieldValues.Add("Airport");
for(int i=0;i<pFieldValues.Count;i++)
{
ISymbol pSymbol= new SimpleMarkerSymbolClass();
pSymbol =GetSymbol(@"C:Program FilesArcGISStylesESRI.ServerStyle","Marker Symbols",pFieldValues(i));
//添加唯一值符号化字段值和相對應的符号
pUVRender.AddValue(pFieldValues,pFieldValues,pSymbol);
}
//設定唯一值符号化的字段個數和字段名
pUVRender.FieldCount = 1;
pUVRender.set_Field(0, "類别");
IGeoFeatureLayer pGFeatureLyr = pFeatureLayer as IGeoFeatureLayer;
//設定IGeofeatureLayer的Renderer屬性
pGFeatureLyr.Renderer = pUVRender as IFeatureRenderer;
}
catch (Exception Err)
{
MessageBox.Show(Err.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void button1_Click(object sender, EventArgs e)
{
IFeatureLayer pFeatureLayer = this.axMapControl1.get_Layer(0) as IFeatureLayer;
UniqueValueRenderFlyr(pFeatureLayer);
this.axMapControl1.Refresh();
}