[转] AE之分级颜色专题图渲染

时间:2024-01-20 19:19:51

原文 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();

            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 = ;

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

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

            long classesCount = long.Parse(classes.GetUpperBound().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[];

            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 = ;

            pColor1.Green = ;

            pColor1.Blue = ;

            pColor2.Red = ;

            pColor2.Green = ;

            pColor2.Blue = ;

            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 = ; breakIndex < classesCount; breakIndex++)

            {

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

                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 + ]);

            }

            // 将等级图渲染对象与渲染图层挂钩

            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() 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 = ;

            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().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[];

            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 = ;

            pColor1.Green = ;

            pColor1.Blue = ;

            pColor2.Red = ;

            pColor2.Green = ;

            pColor2.Blue = ;

            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 = ; breakIndex < ClassesCount; breakIndex++)

            {

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

                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 + ]);

            }

            //将等级图渲染对象与渲染图层挂钩

            pGeoFeatureLayer.Renderer = (IFeatureRenderer)pClassBreaksRenderer;

            //刷新地图和TOOCotrol

            IActiveView pActiveView = axMapControl1.Map as IActiveView;

            pActiveView.Refresh();

            axTOCControl1.Update();

        }