ArcGIS Engine渲染

符號化之Renderer( 渲染)體系

    ArcGIS Engine9.3對GIS數據的符號化分爲矢量數據渲染和柵格數據渲染兩大類。接下來分別介紹FeatureRender和RasterRender。

1.FeatureRender對象
    FeatureRenderer是一個抽象類,它有15個子類負責進行不一樣類型的着色運算。它們都實現了IFeatureRenderer接口,這個接口定義了進行要素圖層符號化的公共屬性和方法。
    能夠經過IGeoFeatureLayer::Renderer屬性得到一個要素圖層的符號化對象html

表四算法

要素符號化類型 描述
SimpleRender 簡單符號化
UniqueValueRender 惟一值符號化
BiUniqueValueRender 雙變量惟一值符號化
ChartRender 圖表符號化
ClassBreaksRenderer 分類等級符號化
DotDensityRenderer 點密度符號化
ProportionalSymbolRenderer 根據屬性值設置符號大小進行符號化
ScaleDependentRenderer 依比例尺符號化
RepresentationRenderer 製圖表達符號化
CoTrackSymbologyRenderer(TrackingAnalyst) 軌跡符號化(應用於TrackingAnaylyst擴展模塊)
EnhancedInfoRenderder(TrackingAnalyst) 加強信息符號化(應用於TrackingAnaylyst擴展模塊)
UniqueValueTextRenderer(TrackingAnalyst) 惟一值文本符號化(應用於TrackingAnaylyst擴展模塊)
NAStopRenderer(NetworkAnalyst) 中止符號化(應用於網絡分析擴展模塊)
FeatureVertexRenderer(SurveyExt) 要素定點符號化(應用於測量分析擴展模塊)
SharedEdgeRenderer(EditorExt) 用於繪製拓撲元素

    經常使用的要素符號化類型主要有如下6種類型,如圖13所示:
    網絡

圖13this

    因爲篇幅有限再也不對每一種符號化類型的使用進行講解,在後邊的實例中將爲讀者演示如何進行惟一值符號化。

2.RasterRender對象
      RasterRender是一個抽象類,它有15個子類負責進行不一樣類型的着色運算。它們都實現了IRasterRender接口,這個接口定義了柵格圖層符號化的公共屬性和方法。能夠經過IRasterLayer::Renderer屬性得到一個柵格圖層的符號化對象。spa

要素符號化類型 描述
RasterRGBRenderer 柵格RGB符號化
RasterUniqueValueRenderer 惟一值符號化
RasterColormapRenderer 雙變量惟一值符號化
RasterClassifyColorRampRenderer 圖表符號化
RasterStretchColorRampRenderer 分類等級符號化
RasterDiscreteColorRenderer 點密度 符號化

    柵格符號化類型結構圖如圖14所示:
code

圖14orm

如下代碼片斷是對一個RasterLayer進行RasterStretchColorRampRenderer符號化操做:xml

///htm

/// StretchColorRamp符號化RasterLayer對象

///

///RasterLayer

publicvoid SetStretchColorRampRenderer(IRasterLayer pRasterLayer)

{

try

{

//建立RasterStretchColorRampRendererClass對象

IRasterStretchColorRampRenderer pRStretchRender=newRasterStretchColorRampRendererClass();

//QI到IRasterRenderer

IRasterRenderer pRasterRender=pRStretchRenderas IRasterRenderer;

pRasterRender.Raster = pRasterLayer asIRaster;

pRasterRender.Update();

//建立兩個起始顏色

IRgbColor pFromRgbColor =new RgbColorClass();

pFromRgbColor.Red = 255;

IRgbColor pToRgbColor =new RgbColorClass();

pToRgbColor.Blue = 255;

//建立起止顏色帶

IAlgorithmicColorRamp pAlgorithmicColorRamp =newAlgorithmicColorRampClass();

pAlgorithmicColorRamp.Size = 255;

pAlgorithmicColorRamp.FromColor = pFromRgbColor asIColor;

pAlgorithmicColorRamp.ToColor = pToRgbColor asIColor;

bool btrue=true;

pAlgorithmicColorRamp.CreateRamp(out btrue);

//選擇拉伸顏色帶符號化的波段

pRStretchRender.BandIndex = 0;

//設置拉伸顏色帶符號化所採用的顏色帶

pRStretchRender.ColorRamp = pAlgorithmicColorRamp asIColorRamp;

pRasterRender.Update();

//符號化RasterLayer

pRasterLayer.Renderer = pRasterRender;

}

catch(Exception Err)

{

    MessageBox.Show(Err.Message,"提示",MessageBoxButtons.OK,MessageBoxIcon.Information);

}

}

 

AE之分級顏色專題圖渲染  

 參考代碼1:

 

 

private void 分級渲染ToolStripMenuItem_Click(object sender, EventArgs e)

        {

 

 

           

            //值分級

            IBasicHistogram pBasicHis = new BasicTableHistogramClass();

            ITableHistogram pTabHis = (ITableHistogram)pBasicHis;

            pTabHis.Field = "w1";

 

            ITable pTab = (ITable)axMapControl1.get_Layer(0);

            pTabHis.Table = pTab;

 

            object doubleArrVal, longArrFreq;

            pBasicHis.GetHistogram(out doubleArrVal, out longArrFreq);

 

 

            IClassifyGEN pClassify = new EqualIntervalClass();  //NaturalBreaksClass

 

            int nDes = 5;

 

            pClassify.Classify(doubleArrVal, longArrFreq, ref nDes);

            object classes = pClassify.ClassBreaks;

 

            System.Array pArr = (System.Array)classes;

 

            //算法梯度顏色

            IAlgorithmicColorRamp pAlgoColorRamp = new AlgorithmicColorRampClass();

            pAlgoColorRamp.Size = pArr.Length;

            IRgbColor pFromColor = new RgbColorClass(), pToColor = new RgbColorClass();

            pFromColor.Red = 0;

            pFromColor.Green = 255;

            pFromColor.Blue = 0;

            pToColor.Red = 255;

            pToColor.Green = 0;

            pToColor.Blue = 255;

 

            pAlgoColorRamp.FromColor = pFromColor;

            pAlgoColorRamp.ToColor = pToColor;

            bool ok = true;

            pAlgoColorRamp.CreateRamp(out ok);

            //顏色梯度結束

 

            IClassBreaksRenderer pRender = new ClassBreaksRendererClass();

            pRender.BreakCount = pArr.Length;

            pRender.Field = "w1";

            ISimpleFillSymbol pSym;

            for (int i = 0; i < pArr.Length; i++)

            {

                pRender.set_Break(i, (double)pArr.GetValue(i));

                pSym = new SimpleFillSymbolClass();

                pSym.Color = pAlgoColorRamp.get_Color(i);

                pRender.set_Symbol(i, (ISymbol)pSym);

            }

 

            IGeoFeatureLayer pGeoLyr = (IGeoFeatureLayer)axMapControl1.get_Layer(0);

            pGeoLyr.Renderer = (IFeatureRenderer)pRender;

 

            axMapControl1.Refresh();

            axTOCControl1.Update();

 

        }

 

參考代碼2:

  private void 分層設色ToolStripMenuItem_Click(object sender, EventArgs e)

        {

      

                //獲取當前圖層 ,並把它設置成IGeoFeatureLayer的實例

            IMap pMap = axMapControl1.Map;

            ILayer pLayer = pMap.get_Layer(0) as IFeatureLayer;

            IFeatureLayer pFeatureLayer = pLayer as IFeatureLayer;

            IGeoFeatureLayer pGeoFeatureLayer = pLayer as IGeoFeatureLayer;

           

           

            //獲取圖層上的feature

            IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;

            IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, false);

            IFeature pFeature = pFeatureCursor.NextFeature();

          

          

            //

            IFeatureRenderer PR=pGeoFeatureLayer.Renderer;

           

          

            //JoinData("縣級區域", "DZGB", "sectioncode");   //join外部表

           // int DC ; 

            int  desiredClasses = 5;

            string fieldName = "w1";

            int classesCount;

            double[] classes;

            string strOutput = "";

            bool ok;

            object dataFrequency;

            object dataValues;

            ITable pTable ;

            //IClassify pClassify;

            EqualIntervalClass pClassify;

            //IBasicHistogram pTableHistogram = new BasicTableHistogramClass();

            //IHistogram pTableHistogram = new BasicTableHistogramClass();

            ITableHistogram pTableHistogram = new BasicTableHistogramClass() as ITableHistogram;

            IBasicHistogram pHistogram;

            IClassBreaksRenderer pClassBreaksRenderer;

            IHsvColor pFromColor;

            IHsvColor pToColor;

            IAlgorithmicColorRamp pAlgorithmicColorRamp;

            IEnumColors pEnumColors;

            IColor pColor;

            ISimpleFillSymbol pSimpleFillSymbol;

 

            pLayer = (IFeatureLayer)axMapControl1.get_Layer(0);

            pGeoFeatureLayer = (IGeoFeatureLayer)pLayer;

            pTable = (ITable)pGeoFeatureLayer;

            pHistogram = (IBasicHistogram)pTableHistogram;

            // Get values and frequencies for the field

            pTableHistogram.Field = fieldName;

            pTableHistogram.Table = pTable;

            pHistogram.GetHistogram(out dataValues, out dataFrequency);

            // Put values and frequencies into an Equal Interval Classify Object

            pClassify = new EqualIntervalClass();

            //pClassify = new NaturalBreaksClass();

            pClassify.SetHistogramData(dataValues, dataFrequency);

            pClassify.Classify(dataValues, dataFrequency, ref desiredClasses);

            //pClassify.Classify(ref desiredClasses);

            classes = (double[])pClassify.ClassBreaks;

            classesCount = classes.Length;

 

            // Initialise a new Class Breaks renderer

            // Supply the number of Class Breaks and the field to perform. the class breaks on

            pClassBreaksRenderer = new ClassBreaksRendererClass();

            pClassBreaksRenderer.Field = fieldName;

            pClassBreaksRenderer.BreakCount = classesCount;

            pClassBreaksRenderer.SortClassesAscending = true;

            // Use algorithmic color ramp to generate an range of colors between YELLOW to RED

            // Initial color: YELLOW

            pFromColor = new HsvColorClass();

            pFromColor.Hue = 60;

            pFromColor.Saturation = 100;

            pFromColor.Value = 96;

            // Final color: RED

            pToColor = new HsvColorClass();

            pToColor.Hue = 0;

            pToColor.Saturation = 100;

            pToColor.Value = 96;

            // Set up HSV Color ramp to span from YELLOW to RED

            pAlgorithmicColorRamp = new AlgorithmicColorRampClass();

            pAlgorithmicColorRamp.Algorithm = esriColorRampAlgorithm.esriHSVAlgorithm;

            pAlgorithmicColorRamp.FromColor = pFromColor;

            pAlgorithmicColorRamp.ToColor = pToColor;

            pAlgorithmicColorRamp.Size = classesCount;

            pAlgorithmicColorRamp.CreateRamp(out ok);

 

            pEnumColors = pAlgorithmicColorRamp.Colors;

            for (int index = 0; index < classesCount - 1; index++)

            {

                pColor = pEnumColors.Next();

                pSimpleFillSymbol = new SimpleFillSymbolClass();

                pSimpleFillSymbol.Color = pColor;

                pSimpleFillSymbol.Style = esriSimpleFillStyle.esriSFSSolid;

                pClassBreaksRenderer.set_Symbol(index, (ISymbol)pSimpleFillSymbol);

                pClassBreaksRenderer.set_Break(index, classes[index + 1]);

                // Store each break value for user output

                strOutput += "-" + classes[index + 1] + "\n";

            }

            pGeoFeatureLayer.Renderer = (IFeatureRenderer)pClassBreaksRenderer;

            //this.axMapControl1.Refresh();

           /////////////////////////////////////////////////////////////////////////////////////////

            //////////////////////////////////////////////////////////////////////////////////////////

           

            //get the custom property from which is supposed to be the layer to be saved

            object customProperty = null;

            //IMapControl3 mapControl = null;

            customProperty = axMapControl1.CustomProperty;

          

            //ask the user to set a name for the new layer file

            SaveFileDialog saveFileDialog = new SaveFileDialog();

            saveFileDialog.Filter = "Layer File|*.lyr|All Files|*.*";

            saveFileDialog.Title = "生成專題圖";

            saveFileDialog.RestoreDirectory = true;

            saveFileDialog.FileName = System.IO.Path.Combine(saveFileDialog.InitialDirectory, pGeoFeatureLayer.Name + ".lyr");

 

            //get the layer name from the user

            DialogResult dr = saveFileDialog.ShowDialog();

            if (saveFileDialog.FileName != "" && dr == DialogResult.OK)

            {

                if (System.IO.File.Exists(saveFileDialog.FileName))

                {

                    //try to delete the existing file

                    System.IO.File.Delete(saveFileDialog.FileName);

                }

 

                //create a new LayerFile instance

                ILayerFile layerFile = new LayerFileClass();

                //create a new layer file

                layerFile.New(saveFileDialog.FileName);

                //attach the layer file with the actual layer

                layerFile.ReplaceContents((ILayer)pGeoFeatureLayer);

                //save the layer file

                layerFile.Save();

 

                //ask the user whether he'd like to add the layer to the map

                if (DialogResult.Yes == MessageBox.Show("Would you like to add the layer to the map?", "Message", MessageBoxButtons.YesNo,MessageBoxIcon.Question))

                {

                    axMapControl1.AddLayerFromFile(saveFileDialog.FileName, 0);

                }

 

               

            }

            IActiveView pActiveView = axMapControl1.Map as IActiveView;

            pActiveView.Refresh();

            axTOCControl1.Update();

      

          

 

        }

 

參考代碼3:

  private void 等級專題圖ToolStripMenuItem_Click(object sender, EventArgs e)

        {

            // 獲取當前圖層,並把它設置成IGeoFeatureLayer的實例

            ILayer pLayer = axMapControl1.get_Layer(0);

            IFeatureLayer pFeatLayer = (IFeatureLayer)pLayer;

            IGeoFeatureLayer pGeoFeatLayer = (IGeoFeatureLayer)pLayer;

            IFeatureClass pFeatClass = pFeatLayer.FeatureClass;

 

            // We're going to retrieve frequency data from a population

            // field and then clasify this data

            ITable pTable = (ITable)pFeatClass;

            IBasicHistogram pBasicHistogram = new BasicTableHistogramClass();

            ITableHistogram pTableHistogram = (ITableHistogram)pBasicHistogram;

 

            // Get values and frequencies for the population field into a table histogram object

            string fieldName = "w1";

            pTableHistogram.Field = fieldName;

            pTableHistogram.Table = pTable;

            object dataValues;

            object dataFrequency;

            pBasicHistogram.GetHistogram(out dataValues, out dataFrequency);

 

            IClassifyGEN pClassifyGEN = new QuantileClass();

            int numClass = 3;

            pClassifyGEN.Classify(dataValues, dataFrequency, ref numClass);

            double[] classes = (double[])pClassifyGEN.ClassBreaks;

            long classesCount = long.Parse(classes.GetUpperBound(0).ToString());

 

            // Initialize a new class breaks renderer and supply the number of class breaks

            // and the field to perform the class breaks on

            IClassBreaksRenderer pClassBreaksRenderer = new ClassBreaksRendererClass();

            pClassBreaksRenderer.Field = fieldName;

            pClassBreaksRenderer.MinimumBreak = classes[0];

            pClassBreaksRenderer.SortClassesAscending = true;

 

            // 設置着色對象的分級數目

            pClassBreaksRenderer.BreakCount = int.Parse(classesCount.ToString());

            // 建立並設置隨機色譜

            IAlgorithmicColorRamp pAlgorithmicColorRamp = new AlgorithmicColorRampClass();

            pAlgorithmicColorRamp.Algorithm = esriColorRampAlgorithm.esriCIELabAlgorithm;

            IEnumColors pEnumColors;

            IRgbColor pColor1 = new RgbColorClass();

            IRgbColor pColor2 = new RgbColorClass();

            pColor1.Red = 255;

            pColor1.Green = 210;

            pColor1.Blue = 210;

            pColor2.Red = 190;

            pColor2.Green = 0;

            pColor2.Blue = 170;

            pAlgorithmicColorRamp.FromColor = pColor1;

            pAlgorithmicColorRamp.ToColor = pColor2;

            pAlgorithmicColorRamp.Size = numClass;

            bool ok = true;

            pAlgorithmicColorRamp.CreateRamp(out ok);

            pEnumColors = pAlgorithmicColorRamp.Colors;

            pEnumColors.Reset();

 

            IClassBreaksUIProperties pUIProperties = (IClassBreaksUIProperties)pClassBreaksRenderer;

            pUIProperties.ColorRamp = "Custom";

 

            ISimpleFillSymbol pSimpleMarkerSymbol = new SimpleFillSymbolClass();

            IColor pColor;

            int[] colors = new int[numClass];

 

            // be careful, indices are different for the different lists

            for (int breakIndex = 0; breakIndex < classesCount; breakIndex++)

            {

                pClassBreaksRenderer.set_Label(breakIndex, classes[breakIndex] + "-" + classes[breakIndex + 1]);

                pUIProperties.set_LowBreak(breakIndex, classes[breakIndex]);

                ISimpleFillSymbol pFillSymbol = new SimpleFillSymbolClass();

                pColor = pEnumColors.Next();

                pFillSymbol.Color = pColor;

                colors[breakIndex] = pColor.RGB;

 

                pClassBreaksRenderer.set_Symbol(breakIndex, (ISymbol)pFillSymbol);

                pClassBreaksRenderer.set_Break(breakIndex, classes[breakIndex + 1]);

            }

 

            // 將等級圖渲染對象與渲染圖層掛鉤

            pGeoFeatLayer.Renderer = (IFeatureRenderer)pClassBreaksRenderer;

            axMapControl1.ActiveView.Refresh();

            axTOCControl1.Update();

        }

參考代碼4:

private void 等級圖ToolStripMenuItem_Click(object sender, EventArgs e)

        {

 

 

            //獲取當前圖層 ,並把它設置成IGeoFeatureLayer的實例

            IMap pMap = axMapControl1.Map;

            ILayer pLayer = pMap.get_Layer(0) as IFeatureLayer;

            IFeatureLayer pFeatureLayer = pLayer as IFeatureLayer;

            IGeoFeatureLayer pGeoFeatureLayer = pLayer as IGeoFeatureLayer;

 

            //獲取圖層上的feature

            IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;

            IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, false);

            IFeature pFeature = pFeatureCursor.NextFeature();

            //////////////////////////////////////////////////////////////////////

 

            //定義所需的接口對象和相關變量

 

            IClassBreaksUIProperties pUIProperties;

            object dataValues;

            object dataFrequency;

            //double[] cb;

 

 

            int breakIndex;

            long ClassesCount;

            int numClass;

            numClass = 10;

            double[] Classes;

            //////////////////////////////////////////////////////////////////////

            

 

            ITable pTable;

            pTable = pFeatureClass as ITable;

            IBasicHistogram pBasicHist = new BasicTableHistogramClass();

            ITableHistogram pTableHist;

 

            pTableHist = (ITableHistogram)pBasicHist;

 

            //Get values and frequencies for the population field into a table histogram object

            pTableHist.Field = "w1";

            pTableHist.Table = pTable;

            pBasicHist.GetHistogram(out dataValues, out dataFrequency);

 

            IClassifyGEN pClassifyGEN = new QuantileClass();

            pClassifyGEN.Classify(dataValues, dataFrequency, ref numClass);

            Classes = (double[])pClassifyGEN.ClassBreaks;

            ClassesCount = long.Parse(Classes.GetUpperBound(0).ToString());

 

            //Initialise a new class breaks renderer and supply the number of class breaks and the field to perform. the class breaks on.

            IClassBreaksRenderer pClassBreaksRenderer = new ClassBreaksRendererClass();

            pClassBreaksRenderer.Field = "w1";

            //pClassBreaksRenderer.BreakCount = ClassesCount;

            pClassBreaksRenderer.MinimumBreak = Classes[0];

            pClassBreaksRenderer.SortClassesAscending = true;

            //設置着色對象的分級數目

            pClassBreaksRenderer.BreakCount = int.Parse(ClassesCount.ToString());

 

            //建立並設置隨機色譜

            IAlgorithmicColorRamp pColorRamp = new AlgorithmicColorRampClass();

            pColorRamp.Algorithm = esriColorRampAlgorithm.esriCIELabAlgorithm;

            IEnumColors pEnumColors;

            IRgbColor pColor1 = new RgbColorClass();

            IRgbColor pColor2 = new RgbColorClass();

            pColor1.Red = 255;

            pColor1.Green = 210;

            pColor1.Blue = 210;

            pColor2.Red = 190;

            pColor2.Green = 0;

            pColor2.Blue = 170;

            pColorRamp.FromColor = pColor1;

            pColorRamp.ToColor = pColor2;

            pColorRamp.Size = numClass;

            bool ok = true;

            //pColorRamp.CreateRamp(out ok);

             pColorRamp.CreateRamp(out ok);

         

 

            pEnumColors = pColorRamp.Colors;

            pEnumColors.Reset();// use this interface to set dialog properties

 

            pUIProperties = pClassBreaksRenderer as IClassBreaksUIProperties;

            pUIProperties.ColorRamp = "Custom";

 

            ISimpleFillSymbol pSimpleMarkerSymbol = new SimpleFillSymbolClass();

 

            IColor pColor;

            int[] colors = new int[numClass];

 

            // be careful, indices are different for the diff lists   

            for (breakIndex = 0; breakIndex < ClassesCount; breakIndex++)

            {

 

                pClassBreaksRenderer.set_Label(breakIndex, Classes[breakIndex] + " - " + Classes[breakIndex + 1]);

                pUIProperties.set_LowBreak(breakIndex, Classes[breakIndex]);

                pSimpleMarkerSymbol = new SimpleFillSymbolClass();

                pColor = pEnumColors.Next();

                pSimpleMarkerSymbol.Color = pColor;

                colors[breakIndex] = pColor.RGB;

 

                pClassBreaksRenderer.set_Symbol(breakIndex, (ISymbol)pSimpleMarkerSymbol);

                pClassBreaksRenderer.set_Break(breakIndex, Classes[breakIndex + 1]);

            }

 

            //將等級圖渲染對象與渲染圖層掛鉤

            pGeoFeatureLayer.Renderer = (IFeatureRenderer)pClassBreaksRenderer;

            //刷新地圖和TOOCotrol

            IActiveView pActiveView = axMapControl1.Map as IActiveView;

            pActiveView.Refresh();

            axTOCControl1.Update();

 

 

        }

 

from:  http://blog.sina.com.cn/s/blog_90b91bf101015jkj.html

http://blog.sina.com.cn/s/blog_642c66ed0101cs5m.html

相關文章
相關標籤/搜索