天天看點

IStyleGallery arcengine

轉自點選打開連結

一、擷取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();

}
           

繼續閱讀