zoukankan      html  css  js  c++  java
  • ArcGIS Engine渲染

    符号化之Renderer( 渲染)体系

        ArcGIS Engine9.3对GIS数据的符号化分为矢量数据渲染和栅格数据渲染两大类。接下来分别介绍FeatureRender和RasterRender。

    1.FeatureRender对象
        FeatureRenderer是一个抽象类,它有15个子类负责进行不同类型的着色运算。它们都实现了IFeatureRenderer接口,这个接口定义了进行要素图层符号化的公共属性和方法。
        可以通过IGeoFeatureLayer::Renderer属性获得一个要素图层的符号化对象

    表四

    要素符号化类型 描述
    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所示:
        

    图13

        由于篇幅有限不再对每一种符号化类型的使用进行讲解,在后边的实例中将为读者演示如何进行唯一值符号化。

    2.RasterRender对象
          RasterRender是一个抽象类,它有15个子类负责进行不同类型的着色运算。它们都实现了IRasterRender接口,这个接口定义了栅格图层符号化的公共属性和方法。可以通过IRasterLayer::Renderer属性获得一个栅格图层的符号化对象。

    要素符号化类型 描述
    RasterRGBRenderer 栅格RGB符号化
    RasterUniqueValueRenderer 唯一值符号化
    RasterColormapRenderer 双变量唯一值符号化
    RasterClassifyColorRampRenderer 图表符号化
    RasterStretchColorRampRenderer 分类等级符号化
    RasterDiscreteColorRenderer 点密度 符号化

        栅格符号化类型结构图如图14所示:

    图14

    以下代码片段是对一个RasterLayer进行RasterStretchColorRampRenderer符号化操作:

    ///

    /// 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] + " ";

                }

                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

  • 相关阅读:
    k8s升级
    k8s常用命令kubeadm
    k8s部署安装-更新时间2020-10-5(docker)
    centos7安装后的优化-2019-10-12更新
    gitlab安装后出现的web IDE显示报错问题
    奋斗的路上
    Spring Boot之过滤器
    java 并发
    jar包使用
    找不到xsd文件思路
  • 原文地址:https://www.cnblogs.com/yuxuetaoxp/p/4660025.html
Copyright © 2011-2022 走看看