圖層渲染(Renderer)


ArcEngine提供多個着色對象用於產生專題圖,可以使用標准着色方案,也可以自定義着色方案,ArcEngine提供8中標准着色方案。

一、SimpleRenderer專題圖

是使用單一符號進行着色分類,不涉及對要素的數據進行處理。這種專題圖同一個圖層內的所有元素都是一種符號。

通過SimpleRenderer對象對Symbol進行設置后,賦予IGeoFeatureLayer接口的Renderer屬性,對象實現了ITransparencyRenerer接口,通過該接口的屬性,可以根據要素的某一個數值字段來設置要素顯示的透明度。

該對象還實現了ISimpleRenderer接口,提供了兩個重要的屬性:Description和Label這兩個屬性用來設置圖例。

/// <summary>
        /// 簡單渲染
        /// </summary>
        /// <param name="layerName">圖層名字</param>
        /// <param name="FillStyle">FillStyle</param>
        /// <param name="pColor">FillColor</param>
        /// <param name="OutLineColor">OutLineColor</param>
        /// <param name="RenderLabel">樣式名稱注釋</param>
        /// <param name="Descripition">描述</param>
        public void createSimpleFillSymbol(string layerName,esriSimpleFillStyle FillStyle,IColor pColor,IColor OutLineColor,string RenderLabel,string Descripition)
        {
            //簡單填充符號
            ISimpleFillSymbol simpleFillSymbol = new SimpleFillSymbolClass();
            //可以用符號選擇器進行
            simpleFillSymbol.Style = FillStyle;
            simpleFillSymbol.Color = pColor;
            //創建邊線符號
            ISimpleLineSymbol simpleLineSymbol = new SimpleLineSymbolClass();
            simpleLineSymbol.Style = esriSimpleLineStyle.esriSLSSolid;
            simpleLineSymbol.Color = OutLineColor;
            ISymbol symbol = simpleLineSymbol as ISymbol;
            symbol.ROP2 = esriRasterOpCode.esriROPNotXOrPen;
            simpleFillSymbol.Outline = simpleLineSymbol;

            ISimpleRenderer simpleRender = new SimpleRendererClass();
            simpleRender.Symbol = simpleFillSymbol as ISymbol;
            simpleRender.Label = RenderLabel;
            simpleRender.Description = Descripition;

            IGeoFeatureLayer geoFeatureLayer;
            geoFeatureLayer = getGeoLayer(layerName);
            if (geoFeatureLayer != null)
            {
                geoFeatureLayer.Renderer = simpleRender as IFeatureRenderer;
            }
        }

 

二、ClassBreakRenderer專題圖

為分級專題圖,通過要素圖層中要素的某個數值字段的值,根據用戶要求,將這些值分為多個級別,每個級別用不同的Symbol顯示。

該對象實現了IClassBreakRenderer接口,提供了實現分級顯示的屬性和方法,如Field屬性用於設置分級着色的字段,BreakCount屬性用於設置分級的數目。

/// <summary>
        /// 分級渲染
        /// </summary>
        /// <param name="layerName">圖層名</param>
        /// <param name="classCount">分級數目</param>
        /// <param name="ClassField">分級字段</param>
        /// <param name="FillStyle">填充樣式</param>
        public void createClassBreakRender(string layerName, int classCount, string ClassField, esriSimpleFillStyle FillStyle)
        {
            //int classCount = 6;
            ITableHistogram tableHistogram;//表格直方圖
            IBasicHistogram basicHistogram;//Provides access to members that control histogram objects created from different data sources. 

            ITable table;
            IGeoFeatureLayer geoFeatureLayer;
            geoFeatureLayer = getGeoLayer(layerName);
            ILayer layer = geoFeatureLayer as ILayer;
            table = layer as ITable;
            tableHistogram = new BasicTableHistogramClass();
            //按照 數值字段分級
            tableHistogram.Table = table;
            tableHistogram.Field = ClassField;
            basicHistogram = tableHistogram as IBasicHistogram;
            object values;
            object frequencys;
            //先統計每個值和各個值出現的次數
            basicHistogram.GetHistogram(out values, out frequencys);
            //創建平均分級對象
            IClassifyGEN classifyGEN = new QuantileClass();
            //用統計結果進行分級 ,級別數目為classCount
            classifyGEN.Classify(values, frequencys, ref classCount);
            //獲得分級結果,是個 雙精度類型數組 
            double[] classes;
            classes = classifyGEN.ClassBreaks as double[];
            //定義不同等級渲染的色帶用色
            IEnumColors enumColors = CreateAlgorithmicColorRamp(classes.Length).Colors;
            IColor color;

            IClassBreaksRenderer classBreaksRenderer = new ClassBreaksRendererClass();
            classBreaksRenderer.Field = ClassField;
            classBreaksRenderer.BreakCount = classCount;//分級數目
            classBreaksRenderer.SortClassesAscending = true;//定義分類是否在TOC中顯示Legend

            ISimpleFillSymbol simpleFillSymbol;
            for (int i = 0; i < classes.Length - 1; i++)
            {
                color = enumColors.Next();
                simpleFillSymbol = new SimpleFillSymbolClass();
                simpleFillSymbol.Color = color;
                simpleFillSymbol.Style = FillStyle;

                classBreaksRenderer.set_Symbol(i, simpleFillSymbol as ISymbol);
                classBreaksRenderer.set_Break(i, classes[i]);
            }
            if (geoFeatureLayer != null)
            {
                geoFeatureLayer.Renderer = classBreaksRenderer as IFeatureRenderer;
            }
           
        }

 

三、UniqueValueRenderer專題圖

是依據要素圖層中的某個字段的不同值,給每個要素一個單獨的顏色,以區分存在的每一個要素。

UniqueValueRenderer實現了IUniqueValueRenderer接口,提供了各種屬性和方法,如AddValue方法用於將單個要素的某個字段值和與之相匹配的着色符號加入到UniqueValueRenderer對象。

/// <summary>
        /// 單一值渲染(單字段)
        /// </summary>
        /// <param name="layerName">圖層名</param>
        /// <param name="RenderField">渲染字段</param>
        /// <param name="FillStyle">填充樣式</param>
        /// <param name="valueCount">字段的唯一值個數</param>
        public void createUniqueValueRander(string layerName, string RenderField, esriSimpleFillStyle FillStyle,int valueCount)
        {
            IGeoFeatureLayer geoFeatureLayer;
            geoFeatureLayer = getGeoLayer(layerName);
            IUniqueValueRenderer uniqueValueRenderer = new UniqueValueRendererClass();
            //可以設置多個字段
            uniqueValueRenderer.FieldCount = 1;//0-3個
            uniqueValueRenderer.set_Field(0, RenderField);

            //簡單填充符號
            ISimpleFillSymbol simpleFillSymbol = new SimpleFillSymbolClass();
            simpleFillSymbol.Style = FillStyle;

            IFeatureCursor featureCursor = geoFeatureLayer.FeatureClass.Search(null, false);
            IFeature feature;

            if (featureCursor != null)
            {
                IEnumColors enumColors = CreateAlgorithmicColorRamp(valueCount).Colors;
                int fieldIndex = geoFeatureLayer.FeatureClass.Fields.FindField(RenderField);
                for (int i = 0; i < valueCount; i++)
                {
                    feature = featureCursor.NextFeature();
                    string nameValue = feature.get_Value(fieldIndex).ToString();
                    simpleFillSymbol = new SimpleFillSymbolClass();
                    simpleFillSymbol.Color = enumColors.Next();
                    uniqueValueRenderer.AddValue(nameValue, RenderField, simpleFillSymbol as ISymbol);
                }
            }

            geoFeatureLayer.Renderer = uniqueValueRenderer as IFeatureRenderer;
        }
        /// <summary>
        ///  單一值渲染(多字段)
        /// </summary>
        /// <param name="layerName">圖層名</param>
        /// <param name="RenderField">多字段名</param>
        /// <param name="FillStyle">樣式</param>
        /// <param name="valueCount">每個字段中唯一值的個數</param>
        public void createUniqueValueRander(string layerName, string[] RenderField, esriSimpleFillStyle FillStyle, int[] valueCount)
        {
            IGeoFeatureLayer geoFeatureLayer;
            geoFeatureLayer = getGeoLayer(layerName);
            IUniqueValueRenderer uniqueValueRenderer = new UniqueValueRendererClass();
            //可以設置多個字段
            uniqueValueRenderer.FieldCount = RenderField .Length;//0-3個
            for (int i = 0; i < RenderField.Length; i++)
            {
                uniqueValueRenderer.set_Field(i, RenderField[i]);
            }

            //簡單填充符號
            ISimpleFillSymbol simpleFillSymbol = new SimpleFillSymbolClass();
            simpleFillSymbol.Style = FillStyle;

            IFeatureCursor featureCursor = geoFeatureLayer.FeatureClass.Search(null, false);
            IFeature feature;

            if (featureCursor != null)
            {
                for (int i = 0; i < RenderField.Length; i++)
                {
                    IEnumColors enumColors = CreateAlgorithmicColorRamp(valueCount[i]).Colors;
                    int fieldIndex = geoFeatureLayer.FeatureClass.Fields.FindField(RenderField[i]);
                    for (int j = 0; j < valueCount[i]; j++)
                    {
                        feature = featureCursor.NextFeature();
                        string nameValue = feature.get_Value(fieldIndex).ToString();
                        simpleFillSymbol = new SimpleFillSymbolClass();
                        simpleFillSymbol.Color = enumColors.Next();
                        uniqueValueRenderer.AddValue(nameValue, RenderField[i], simpleFillSymbol as ISymbol);
                    }
                }
            }
            geoFeatureLayer.Renderer = uniqueValueRenderer as IFeatureRenderer;
        }

 

四、ProportionalSymbolRenderer專題圖

使用梯度着色法制作的專題圖。

ProportionalSymbolRenderer實現了IProportionalSymbolRenderer接口。

這種着色法需要用戶知道最大和最小點各自代表的字段值、着色基於的字段和着色點使用的符號以及它在Legend要出現的級別數目。

/// <summary>
        /// 梯度着色
        /// </summary>
        /// <param name="layerName">圖層名字</param>
        /// <param name="ProportionField">要參考的字段</param>
        /// <param name="FillStyle">填充樣式</param>
        /// <param name="fillColor">填充Color</param>
        /// <param name="characterMarkerSymbol">特征點符號</param>
        /// <param name="units">參考單位</param>
        /// <param name="pLegendSymbolCount">要分成的級數</param>
        public void createProportionSymbolRender(string layerName, string ProportionField, esriSimpleFillStyle FillStyle, IColor fillColor, ICharacterMarkerSymbol characterMarkerSymbol, esriUnits units, int pLegendSymbolCount)
        {
            IGeoFeatureLayer geoFeatureLayer;
            IFeatureLayer featureLayer;
            IProportionalSymbolRenderer proportionalSymbolRenderer;
            ITable table;
            ICursor cursor;
            IDataStatistics dataStatistics;//用一個字段生成統計數據
            IStatisticsResults statisticsResult;//報告統計數據
            //stdole.IFontDisp fontDisp;//定義字體

            geoFeatureLayer = getGeoLayer(layerName);
            featureLayer = geoFeatureLayer as IFeatureLayer;
            table = geoFeatureLayer as ITable;
            cursor = table.Search(null, true);
            dataStatistics = new DataStatisticsClass();
            dataStatistics.Cursor = cursor;
            dataStatistics.Field = ProportionField;//確定分級字段
            statisticsResult = dataStatistics.Statistics;
            if (statisticsResult != null)
            {
                IFillSymbol fillSymbol = new SimpleFillSymbolClass();
                fillSymbol.Color = fillColor;
                //ICharacterMarkerSymbol characterMarkerSymbol = new CharacterMarkerSymbolClass();
                //fontDisp = new stdole.StdFontClass() as stdole.IFontDisp;
                //fontDisp.Name = "arial";
                //fontDisp.Size = 20;
                //characterMarkerSymbol.Font = fontDisp;
                //characterMarkerSymbol.CharacterIndex = 90;
                //characterMarkerSymbol.Color = getRGB(255, 0, 0);
                //characterMarkerSymbol.Size = 8;
                proportionalSymbolRenderer = new ProportionalSymbolRendererClass();
                proportionalSymbolRenderer.ValueUnit = units;
                proportionalSymbolRenderer.Field = ProportionField ;
                proportionalSymbolRenderer.FlanneryCompensation = false;//分級是不是在TOC中顯示legend
                proportionalSymbolRenderer.MinDataValue = statisticsResult.Minimum;
                proportionalSymbolRenderer.MaxDataValue = statisticsResult.Maximum;
                proportionalSymbolRenderer.BackgroundSymbol = fillSymbol;
                proportionalSymbolRenderer.MinSymbol = characterMarkerSymbol as ISymbol;
                proportionalSymbolRenderer.LegendSymbolCount = pLegendSymbolCount;//要分成的級數
                proportionalSymbolRenderer.CreateLegendSymbols();
                geoFeatureLayer.Renderer = proportionalSymbolRenderer as IFeatureRenderer;
            }
        }

 

五、ChartRenderer專題圖

使用一個餅圖或柱圖來表示一個要素的多個屬性。有水平排列和累計排列兩種。

ChartRenderer對象實現了IChartRenderer接口,其中ChartSymbol方法用於設置着色對象的着色符號,Label屬性用於設置Legend的標簽。

該方法用於比較一個要素中不同屬性,在獲得着色圖層的單個或多個字段時用RendererField對象來操作。該類實現了IRendererField接口,可以通過AddField方法來添加字段。

該着色法是使用餅圖來表現要素的多個屬性之間的比率關系。該對象實現了IPicChartRenderer接口,使用PieChartSymbol符號來修飾要素。

/// <summary>
        /// 條狀圖渲染
        /// </summary>
        /// <param name="layerName">圖層名字</param>
        /// <param name="RenderField">要柱狀表示的字段</param>
        /// <param name="fillsymbolColor">這些字段分別需要渲染的顏色</param>
        /// <param name="BarWidth">每個柱子的寬度</param>
        /// <param name="BgColor">背景色</param>
        public void createBarChartSymbol(string layerName, string[] RenderField, IColor[] fillsymbolColor,double BarWidth,IColor BgColor)
        {
            IGeoFeatureLayer geoFeatureLayer;
            IFeatureLayer featureLayer;
            ITable table;
            ICursor cursor;
            IRowBuffer rowBuffer;
            //獲取渲染圖層
            geoFeatureLayer = getGeoLayer(layerName);
            featureLayer = geoFeatureLayer as IFeatureLayer;
            table = featureLayer as ITable;
            geoFeatureLayer.ScaleSymbols = true;
            IChartRenderer chartRenderer = new ChartRendererClass();
            IRendererFields rendererFields = chartRenderer as IRendererFields;
            for (int i = 0; i < RenderField.Length; i++)
            {
                rendererFields.AddField(RenderField[i], RenderField[i]);
            }

            //int[] fieldIndexs = new int[2];
            //fieldIndexs[0] = table.FindField(field1);
            //fieldIndexs[1] = table.FindField(field2);
            //獲取要素最大值,決定柱子的最大高度
            double fieldValue = 0.0, maxValue = 0.0;
            cursor = table.Search(null, true);
            rowBuffer = cursor.NextRow();
            while (rowBuffer != null)
            {
                for (int i = 0; i < RenderField.Length; i++)
                {
                    int index = table.FindField(RenderField[i]);
                    fieldValue = double.Parse(rowBuffer.get_Value(index).ToString());
                    if (fieldValue > maxValue)
                    {
                        maxValue = fieldValue;
                    }
                }
                rowBuffer = cursor.NextRow();
            }
            //創建水平排列符號
            IBarChartSymbol barChartSymbol = new BarChartSymbolClass();
            barChartSymbol.Width = BarWidth;//柱子的邊長
            IMarkerSymbol markerSymbol = barChartSymbol as IMarkerSymbol;
            markerSymbol.Size = 50;//這個是?
            IChartSymbol chartSymbol = barChartSymbol as IChartSymbol;
            chartSymbol.MaxValue = maxValue;
            //添加渲染符號
            ISymbolArray symbolArray = barChartSymbol as ISymbolArray;
            IFillSymbol[] fillsymbol = new IFillSymbol[RenderField.Length];
            for (int i = 0; i < RenderField.Length; i++)
            {
                //設置不同顏色的柱子
                fillsymbol[i] = new SimpleFillSymbolClass();
                fillsymbol[i].Color = fillsymbolColor[i];
                symbolArray.AddSymbol(fillsymbol[i] as ISymbol);
                //IFillSymbol fillSymbol = new SimpleFillSymbolClass();
                //fillSymbol.Color = getRGB(255, 0, 0);//紅色柱子
                //symbolArray.AddSymbol(fillSymbol as ISymbol);
                //fillSymbol = new SimpleFillSymbolClass();
                //fillSymbol.Color = getRGB(0, 255, 0);//綠色柱子
                //symbolArray.AddSymbol(fillSymbol as ISymbol);
            }

            //設置柱狀圖符號
            chartRenderer.ChartSymbol = barChartSymbol as IChartSymbol;
            //設置底圖樣式
            IFillSymbol pFillSymbol = new SimpleFillSymbolClass();
            pFillSymbol.Color = BgColor;
            chartRenderer.BaseSymbol = pFillSymbol as ISymbol;
            chartRenderer.UseOverposter = false;//假如那個位置放不下柱狀圖,是否用線段連接指示位置
            //創建圖例
            chartRenderer.CreateLegend();
            geoFeatureLayer.Renderer = chartRenderer as IFeatureRenderer;
        }
        /// <summary>
        /// 創建累計柱狀圖表(stacked)
        /// </summary>
        /// <param name="layerName">Name</param>
        /// <param name="RenderField">Fields</param>
        /// <param name="fillsymbolColor">every Color</param>
        /// <param name="BarWidth">width</param>
        /// <param name="BgColor">BackGound Color</param>
        public void createStackedChartSymbol(string layerName, string[] RenderField, IColor[] fillsymbolColor, double BarWidth, IColor BgColor)
        {
            IGeoFeatureLayer geoFeatureLayer;
            IFeatureLayer featureLayer;
            ITable table;
            ICursor cursor;
            IRowBuffer rowBuffer;
            //獲取渲染圖層
            geoFeatureLayer = getGeoLayer(layerName);
            featureLayer = geoFeatureLayer as IFeatureLayer;
            table = featureLayer as ITable;
            geoFeatureLayer.ScaleSymbols = true;
            IChartRenderer chartRenderer = new ChartRendererClass();
            IRendererFields rendererFields = chartRenderer as IRendererFields;
            for (int i = 0; i < RenderField.Length; i++)
            {
                rendererFields.AddField(RenderField[i], RenderField[i]);
            }
            //獲取要素最大值
            double fieldValue = 0.0, maxValue = 0.0;
            cursor = table.Search(null, true);
            rowBuffer = cursor.NextRow();
            while (rowBuffer != null)
            {
                for (int i = 0; i < RenderField.Length ; i++)
                {
                    int index = table.FindField(RenderField[i]);
                    fieldValue = double.Parse(rowBuffer.get_Value(index).ToString());
                    if (fieldValue > maxValue)
                    {
                        maxValue = fieldValue;
                    }
                }
                rowBuffer = cursor.NextRow();
            }
            //創建累積排列符號
            IStackedChartSymbol stackedChartSymbol = new StackedChartSymbolClass();

            stackedChartSymbol.Width = 10;//柱子寬度
            IMarkerSymbol markerSymbol = stackedChartSymbol as IMarkerSymbol;
            markerSymbol.Size = 50;//下面的大小
            IChartSymbol chartSymbol = stackedChartSymbol as IChartSymbol;
            chartSymbol.MaxValue = maxValue;
            //添加渲染符號
            ISymbolArray symbolArray = stackedChartSymbol as ISymbolArray;
            IFillSymbol[] fillsymbol = new IFillSymbol[RenderField.Length];
            for (int i = 0; i < RenderField.Length; i++)
            {
                //設置不同顏色的柱子
                fillsymbol[i] = new SimpleFillSymbolClass();
                fillsymbol[i].Color = fillsymbolColor[i];
                symbolArray.AddSymbol(fillsymbol[i] as ISymbol);
            }
            //設置柱狀圖符號
            chartRenderer.ChartSymbol = stackedChartSymbol as IChartSymbol;
            IFillSymbol pFillSymbol = new SimpleFillSymbolClass();
            pFillSymbol.Color =BgColor;
            chartRenderer.BaseSymbol = pFillSymbol as ISymbol;
            chartRenderer.UseOverposter = false;
            //創建圖例
            chartRenderer.CreateLegend();
            geoFeatureLayer.Renderer = chartRenderer as IFeatureRenderer;
        }
        /// <summary>
        /// 創建餅圖
        /// </summary>
        /// <param name="layerName">name</param>
        /// <param name="RenderField">Fields</param>
        /// <param name="fillsymbolColor">Each color</param>
        /// <param name="BgColor">background Color</param>
        public void createPieChartSymbol(string layerName, string[] RenderField, IColor[] fillsymbolColor,  IColor BgColor)
        {
            IGeoFeatureLayer geoFeatureLayer;
            IFeatureLayer featureLayer;
            ITable table;
            ICursor cursor;
            IRowBuffer rowBuffer;
            
            //獲取渲染圖層
            geoFeatureLayer = getGeoLayer(layerName);
            featureLayer = geoFeatureLayer as IFeatureLayer;
            table = featureLayer as ITable;
            geoFeatureLayer.ScaleSymbols = true;
            IChartRenderer chartRenderer = new ChartRendererClass();
            IPieChartRenderer pieChartRenderer = chartRenderer as IPieChartRenderer;
            IRendererFields rendererFields = chartRenderer as IRendererFields;
            for (int i = 0; i < RenderField.Length; i++)
            {
                rendererFields.AddField(RenderField[i], RenderField[i]);
            
            }
            //獲取渲染要素的最大值
            double fieldValue = 0.0, maxValue = 0.0;
            cursor = table.Search(null, true);
            rowBuffer = cursor.NextRow();
            while (rowBuffer != null)
            {
                for (int i = 0; i < RenderField.Length ; i++)
                {
                    int index = table.FindField(RenderField[i]);
                    fieldValue = double.Parse(rowBuffer.get_Value(index).ToString());
                    if (fieldValue > maxValue)
                    {
                        maxValue = fieldValue;
                    }
                }
                rowBuffer = cursor.NextRow();
            }
            //設置餅圖符號
            IPieChartSymbol pieChartSymbol = new PieChartSymbolClass();
            pieChartSymbol.Clockwise = true;
            pieChartSymbol.UseOutline = true;
            IChartSymbol chartSymbol = pieChartSymbol as IChartSymbol;
            chartSymbol.MaxValue = maxValue;
            ILineSymbol lineSymbol = new SimpleLineSymbolClass();
            lineSymbol.Color = getRGB(255, 0, 0);
            lineSymbol.Width = 2;
            pieChartSymbol.Outline = lineSymbol;
            IMarkerSymbol markerSymbol = pieChartSymbol as IMarkerSymbol;
            markerSymbol.Size = 30;
            //添加渲染符號
            ISymbolArray symbolArray = pieChartSymbol as ISymbolArray;
            IFillSymbol[] fillsymbol =new  IFillSymbol[RenderField.Length];
            for (int i = 0; i < RenderField.Length; i++)
            {
                fillsymbol[i] = new SimpleFillSymbolClass();
                fillsymbol[i].Color = fillsymbolColor[i];
                symbolArray.AddSymbol(fillsymbol[i] as ISymbol);
            }
            //設置背景
            chartRenderer.ChartSymbol = pieChartSymbol as IChartSymbol;
            IFillSymbol pFillSymbol = new SimpleFillSymbolClass();
            pFillSymbol.Color = BgColor;
            chartRenderer.BaseSymbol = pFillSymbol as ISymbol;
            chartRenderer.UseOverposter = false;
            //創建圖例
            chartRenderer.CreateLegend();
            geoFeatureLayer.Renderer = chartRenderer as IFeatureRenderer;
        }

 

六、DotDensityRenderer專題圖

DotDensityRenderer對象使用DotDensityFillSymbol符號對Polygon類型的要素進行着色。該專題圖使用隨機分布的點的密度來表現要素某個屬性值得大小。也可以對圖層的多個屬性值着色,通過指定不同的點符號來區分。

DotDensityRenderer對象實現IDotDensityRenderer接口,定義了使用點密度着色方法和屬性,如DotDensitySymbol用於確定着色點符號,CreateLegend方法用於產生圖例。

/// <summary>
        /// 點密度
        /// </summary>
        /// <param name="layerName">圖層名字</param>
        /// <param name="RenderField">渲染字段</param>
        /// <param name="dotDensityFillSymbol">點密度符號</param>
        /// <param name="simpleMarkerSymbol">點符號</param>
        /// <param name="RenderDensity">點密度</param>
        public void createDotDensityFillSymbol(string layerName, string RenderField, IDotDensityFillSymbol dotDensityFillSymbol, ISimpleMarkerSymbol simpleMarkerSymbol,double  RenderDensity)
        {
            IGeoFeatureLayer geoFeatureLayer;
            IDotDensityRenderer dotDensityRenderer;
            //獲取渲染圖層
            geoFeatureLayer = getGeoLayer(layerName);
            dotDensityRenderer = new DotDensityRendererClass();
            IRendererFields rendererFields = dotDensityRenderer as IRendererFields;
            //設置渲染字段
            rendererFields.AddField(RenderField, RenderField);

            ////設置填充顏色和背景色,直接由參數傳入,具體定義參考下面的 例子
            //dotDensityFillSymbol = new DotDensityFillSymbolClass();
            //dotDensityFillSymbol.DotSize = 3;
            //dotDensityFillSymbol.Color = getRGB(255, 0, 0);
            //dotDensityFillSymbol.BackgroundColor = getRGB(0, 255, 0);

            //設置渲染符號
            ISymbolArray symbolArray = dotDensityFillSymbol as ISymbolArray;
            //點符號樣式,也可以參考下面的自己定義
            //ISimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbolClass();
            //simpleMarkerSymbol.Style = esriSimpleMarkerStyle.esriSMSCircle;
            //simpleMarkerSymbol.Size = 2;
            //simpleMarkerSymbol.Color = getRGB(0, 0, 255);
            symbolArray.AddSymbol(simpleMarkerSymbol as ISymbol);
            dotDensityRenderer.DotDensitySymbol = dotDensityFillSymbol;
            //設置渲染密度
            dotDensityRenderer.DotValue = RenderDensity;
            //創建圖例
            dotDensityRenderer.CreateLegend();
            geoFeatureLayer.Renderer = dotDensityRenderer as IFeatureRenderer;
        }

此外還有兩個補充方法(在調用這些方法的時候能用到):

private IMap pMap;
        public Renderer(IMap _pMap)
        {
            pMap = _pMap;
        }
        //獲取顏色對象
        private IRgbColor getRGB(int r, int g, int b)
        {
            IRgbColor pColor;
            pColor = new RgbColorClass();
            pColor.Red = r;
            pColor.Green = g;
            pColor.Blue = b;
            return pColor;
        }
        private IGeoFeatureLayer getGeoLayer(string layerName)
        {
            ILayer layer;
            IGeoFeatureLayer geoFeatureLayer;
            for (int i = 0; i < this.pMap.LayerCount; i++)
            {
                layer = this.pMap.get_Layer(i);
                if (layer != null && layer.Name == layerName)
                {
                    geoFeatureLayer = layer as IGeoFeatureLayer;
                    return geoFeatureLayer;
                }
            }
            return null;
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM