ArcEngine 产生专题图

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;
            }
        }
View Code

相关文章:

  • 2021-08-12
  • 2022-12-23
  • 2022-12-23
  • 2021-04-21
  • 2021-11-18
  • 2022-12-23
  • 2021-08-18
猜你喜欢
  • 2022-12-23
  • 2021-05-24
  • 2021-05-21
  • 2021-12-20
  • 2021-12-23
  • 2022-01-05
相关资源
相似解决方案