ArcGIS Desktop和Engine中對點要素圖層Graduated Symbols渲染的實現 Rotation Symbol (轉)

摘要

        ArcGIS中,對於要素圖層的渲染,支持按照要素字段的值渲染要素的大小,其中Graduated Symbols能夠對大小進行分級渲染。在我的開發系統的過程當中,也能夠用來美化數據顯示,增強表達。參考ArcMap中對於Graduated Symbols的實現,有助於理解和編寫ArcGIS Engine的相關代碼。
 

一、ArcMap中Graduated Symbols渲染的實現

        首先,在左側圖層中找到要渲染的圖層,右擊打開圖層屬性(Properties),在上方選擇樣式(Symbology)選項卡,在數量(Quantities)下選擇Graduated Symbols。界面以下:
 
        圖中:A、Value表示符號大小對應的字段,Normalization(歸一化)表示將Value字段進行歸一化處理。B、Classification表示根據Value字段進行分級,包含分級方式(圖中爲NaturalBreaks)Classes爲分級數量,點擊右側Classify可對Classification進行更改設置。C、Symbol Size表示符號分級的最大最小值,右方,Template點擊,可對點要素的表示符號進行設置,可設置樣式、顏色、大小、初始角度。D、下方的Advanced點擊可選擇旋轉(Rotation),設置旋轉的參照字段和旋轉方式(Geographic爲Y向起順時針旋轉,Arithmetic爲X向起逆時針旋轉)。渲染示例圖以下:
 
 

二、ArcEngine中Graduated Symbols渲染的實現

        ArcGISEngine中,Graduated Symbols的實現依賴於IClassBreaksRenderer接口,首先須要設定分級的字段和級別數量,根據級別數量設定每一級的樣式,設定該級的斷點。級別數量對應於ArcMap中的Classes,斷點爲肯定有兩種方式,一是調用IClassifyGEN接口,同ArcMap中點擊Classify選擇相應方式,二是人工設定,同一中的manual。
 
        將IClassBreaksRenderer接口對象轉換爲IRotationRenderer藉口對象,能夠實現ArcMap中的Advanced的Rotation功能,設置旋轉字段和旋轉方式。
 
        (1)人工設定分級進行渲染的代碼以下:
[csharp]  view plain  copy
 
  1. public static void ArrowGraduatedRendererFlow2(IFeatureLayer pFeatureLayer, string SizeField, string RotationField)  
  2. {  
  3.     IGeoFeatureLayer pGeoFeatureLayer = pFeatureLayer as IGeoFeatureLayer;  
  4.     int classCountNum=4;  
  5.     double[] Classes = {0.0,0.5,1.0,2.0,10.0};  
  6.   
  7.     try  
  8.     {  
  9.         //聲明分級渲染對象  
  10.         IClassBreaksRenderer pClassBreaksRenderer = new ClassBreaksRendererClass();  
  11.         pClassBreaksRenderer.Field = SizeField;  
  12.         pClassBreaksRenderer.BreakCount = classCountNum;  
  13.   
  14.         for (int breakIndex = 0; breakIndex < classCountNum; breakIndex++)  
  15.         {  
  16.             IRgbColor pColor = GetRGB(225, 80, 10);  
  17.             ISymbol SetSymbol = SetArrowMarkSymbol(breakIndex, pColor);  
  18.             pClassBreaksRenderer.set_Symbol(breakIndex, SetSymbol);  
  19.             pClassBreaksRenderer.set_Break(breakIndex, Classes[breakIndex + 1]);  
  20.         }  
  21.         //設置符號旋轉的渲染方式  
  22.         IRotationRenderer pRotationRenderer = (IRotationRenderer)pClassBreaksRenderer;  
  23.         pRotationRenderer.RotationField = RotationField;//設置旋轉基準字段  
  24.         //pRotationRenderer.RotationType = esriSymbolRotationType.esriRotateSymbolArithmetic;//以x軸爲旋轉起點  
  25.         pRotationRenderer.RotationType = esriSymbolRotationType.esriRotateSymbolGeographic;//以y軸爲旋轉起點  
  26.   
  27.         //設置圖層的渲染方式  
  28.         pGeoFeatureLayer.Renderer = (IFeatureRenderer)pClassBreaksRenderer;  
  29.   
  30.     }  
  31.     catch (Exception e)  
  32.     {  
  33.         //MessageBox.Show(e.Message);  
  34.         return;  
  35.     }  
  36. }  

其中:SetArrowMarkSymbol(breakIndex, pColor)函數調用了IArrowMarkerSymbol接口,定義箭頭標識。數組

 

        (2)Classify分級並渲染的代碼以下:函數

 

[csharp]  view plain  copy
 
  1. public static void ArrowGraduatedRendererFlow(IFeatureLayer pFeatureLayer, string SizeField, string RotationField)  
  2. {  
  3.     IGeoFeatureLayer pGeoFeatureLayer = pFeatureLayer as IGeoFeatureLayer;  
  4.   
  5.     ITable pTable = (ITable)pGeoFeatureLayer;  
  6.     IQueryFilter pQueryFilter = new QueryFilterClass();  
  7.     pQueryFilter.AddField("");  
  8.     ICursor pCursor = pTable.Search(pQueryFilter, true);  
  9.   
  10.     //使用統計類獲得最大最小值  
  11.     IDataStatistics pDataStatistics = new DataStatisticsClass();  
  12.     pDataStatistics.Cursor = pCursor;  
  13.     //設置統計字段  
  14.     pDataStatistics.Field = SizeField;  
  15.     //獲得統計結果  
  16.     IStatisticsResults pStatisticsResult = pDataStatistics.Statistics;  
  17.     if (pStatisticsResult == null)  
  18.     {  
  19.         MessageBox.Show("屬性值統計失敗!");  
  20.         return;  
  21.     }  
  22.   
  23.     int classCountNum;  
  24.     classCountNum = (int)((pStatisticsResult.Maximum - pStatisticsResult.Minimum) / 0.5) + 1;//將(流速)值按0.5m/s分級,獲得分級級數  
  25.   
  26.     if (classCountNum <= 0)  
  27.     {  
  28.         classCountNum = 1;  
  29.     }  
  30.     if (classCountNum >= 32)  
  31.     {  
  32.         classCountNum = 32;  
  33.     }  
  34.     double[] Classes = GetClassBreakpoints(pGeoFeatureLayer, SizeField, classCountNum);//調用函數分級  
  35.   
  36.     try  
  37.     {  
  38.         //聲明分級渲染對象  
  39.         IClassBreaksRenderer pClassBreaksRenderer = new ClassBreaksRendererClass();  
  40.         pClassBreaksRenderer.Field = SizeField;  
  41.         pClassBreaksRenderer.BreakCount = classCountNum;  
  42.   
  43.         for (int breakIndex = 0; breakIndex < classCountNum; breakIndex++)  
  44.         {  
  45.             IRgbColor pColor = GetRGB(225, 80, 10);  
  46.             ISymbol SetSymbol = SetArrowMarkSymbol(breakIndex, pColor);  
  47.             pClassBreaksRenderer.set_Symbol(breakIndex, SetSymbol);  
  48.             pClassBreaksRenderer.set_Break(breakIndex, Classes[breakIndex + 1]);  
  49.         }  
  50.         //設置符號旋轉的渲染方式  
  51.         IRotationRenderer pRotationRenderer = (IRotationRenderer)pClassBreaksRenderer;  
  52.         pRotationRenderer.RotationField = RotationField;//設置旋轉基準字段  
  53.         //pRotationRenderer.RotationType = esriSymbolRotationType.esriRotateSymbolArithmetic;//以x軸爲旋轉起點  
  54.         pRotationRenderer.RotationType = esriSymbolRotationType.esriRotateSymbolGeographic;//以y軸爲旋轉起點  
  55.   
  56.         //設置圖層的渲染方式  
  57.         pGeoFeatureLayer.Renderer = (IFeatureRenderer)pClassBreaksRenderer;  
  58.   
  59.     }  
  60.     catch (Exception e)  
  61.     {  
  62.         //MessageBox.Show(e.Message);  
  63.         return;  
  64.     }  
  65. }  

 

 

其中,分級採用等間距分級的代碼以下:post

 

[csharp]  view plain  copy
 
  1. private static double[] GetClassBreakpoints(IGeoFeatureLayer pGeoFeatureLayer, string FieldName,int ClassesCount)  
  2.         {  
  3.             double[] breakPointClasses;  
  4.             if (pGeoFeatureLayer == null)  
  5.                 return null;  
  6.             ITable pTable = (ITable)pGeoFeatureLayer;//ITable pTable = (ITable)pGeoFeatureLayer.FeatureClass;  
  7.               
  8.             object dataValues;  
  9.             object dataFrequency;  
  10.             //從pTable的字段中獲得信息給dataValues和dataFrequency兩個數組  
  11.             ITableHistogram pTableHistogram = new BasicTableHistogramClass();  
  12.             pTableHistogram.Field = FieldName;  
  13.             pTableHistogram.Table = pTable;  
  14.             IBasicHistogram pHistogram = (IBasicHistogram)pTableHistogram;  
  15.             pHistogram.GetHistogram(out dataValues, out dataFrequency);  
  16.   
  17.             //下面是分級方法,用於根據得到的值計算得出符合要求的數據  
  18.             IClassifyGEN pClassify;  
  19.             //根據條件計算出IClassifyGEN  
  20.             pClassify = new EqualIntervalClass();  
  21.             int tt = ClassesCount;  
  22.             pClassify.Classify(dataValues, dataFrequency, ref tt);  
  23.             //返回數組  
  24.             breakPointClasses = (double[])pClassify.ClassBreaks;  
  25.             return breakPointClasses;  
  26.         }  

 

 

最終的渲染效果以下:spa

 

 
 from: http://blog.csdn.net/u012223164/article/details/39207369
相關文章
相關標籤/搜索