ArcEngine簡單教程——柵格、矢量圖層的顏色渲染

ArcEngine簡單教程彙總

目錄

ArcEngine簡單教程彙總

1 目的

2 概要

色帶:

柵格渲染:

矢量渲染:

3代碼

4小結


 

1 目的

實現簡單的按照arcmap自帶色帶,進行圖層渲染功能,包括

對柵格圖層,按柵格值進行拉伸渲染、分級渲染、唯一值渲染

對矢量圖層,按某一字段值進行分級渲染、唯一值渲染

 

2 概要

本文只介紹主要功能方法,具體的調用關係、窗口實現等完整完整demo可見:

https://download.csdn.net/download/nominior/12454058

色帶:

1)獲取

使用SymbologyControl控件獲取ArcMap色帶,色帶位置:ArcMap安裝路徑/Styles/ESRI.Style

   

2)顯示

使用C#中的combobox對色帶進行顯示(比SymbologyControl效果略好),分兩個過程:

  • 修改combobox的DrawItem方法,使得combobox可以繪製色帶
  • 遍歷SymbologyControl中的色帶,繪製到combobox中

 

柵格渲染:

  • 包括拉伸渲染、分級渲染、唯一值渲染等渲染方式
  • 基本渲染流程爲:創建並設置對應渲染器,渲染顏色與渲染值映射,柵格圖層渲

具體見 代碼及註釋

 

矢量渲染:

  • 包括拉伸渲染、分級渲染、唯一值渲染等渲染方式
  • 基本渲染流程爲:創建並設置對應渲染器,數值處理,渲染顏色與渲染值映射,柵格圖層渲染

具體見 代碼及註釋

 

 

3代碼

涉及的ArcGIS引用、界面示意如圖:

          

combobox色帶顯示代碼

        // combobox重繪
        private void cb_colormap_DrawItem(object sender, DrawItemEventArgs e)
        {
            e.DrawBackground();
            e.DrawFocusRectangle();
            e.Graphics.DrawImage(cb_colormap.Items[e.Index] as Image, e.Bounds);
        }

        // 初始化符號庫
        private void InitSymbologyControl()
        {
            //色帶定位
            string sInstall = "D:\\ArcGIS\\Desktop10.2\\";
            string defaultStyle = System.IO.Path.Combine(sInstall, "Styles\\ESRI.ServerStyle");
            //色帶讀取
            this.axSymbologyControl1.LoadStyleFile(defaultStyle);
            this.axSymbologyControl1.StyleClass = esriSymbologyStyleClass.esriStyleClassColorRamps;
            //色帶另存
            this.pSymbologyStyleClass = axSymbologyControl1.GetStyleClass(esriSymbologyStyleClass.esriStyleClassColorRamps);
        }

        // 初始化色帶下拉框
        private void InitColorRampCombobox()
        {
            this.cb_colormap.DrawMode = DrawMode.OwnerDrawFixed;
            this.cb_colormap.DropDownStyle = ComboBoxStyle.DropDownList;
            //繪製色帶
            for (int i = 0; i < pSymbologyStyleClass.ItemCount; i++)
            {
                //從另存中讀取色帶
                IStyleGalleryItem pStyleGalleryItem = pSymbologyStyleClass.GetItem(i);
                IPictureDisp pPictureDisp = pSymbologyStyleClass.PreviewItem(pStyleGalleryItem, cb_colormap.Width, cb_colormap.Height);
                Image image = Image.FromHbitmap(new IntPtr(pPictureDisp.Handle));
                cb_colormap.Items.Add(image);
            }
            cb_colormap.SelectedIndex = 25;
        }

柵格渲染代碼

        #region 不同方式的柵格渲染
        private void SetRasterSymbol(IRasterLayer pRasterLayer)
        {
            //獲取cb選擇的色帶序號,根據序號選擇色帶
            int symbol_index = cb_colormap.SelectedIndex;
            ISymbologyStyleClass symbologyStyleClass = axSymbologyControl1.GetStyleClass(esriSymbologyStyleClass.esriStyleClassColorRamps);
            IStyleGalleryItem mStyleGalleryItem = symbologyStyleClass.GetItem(symbol_index);
            IColorRamp colorramp_select = (IColorRamp)mStyleGalleryItem.Item;

            if (cb_method.Text == "Stretch")
            {
                RasterStretchRender(colorramp_select, pRasterLayer);
            }
            else if (cb_method.Text == "Classify")
            {
                if (textBox1.Text == "不分")
                {

                }
                else
                {
                    int cls_num = Convert.ToInt32(textBox1.Text);
                    RasterClassifyRender(colorramp_select, pRasterLayer, cls_num);
                }          
            }
            else if (cb_method.Text == "Unique")
            {
                RasterUniqueRender(colorramp_select, pRasterLayer);
            }

            //視圖刷新
            map.ActiveView.ContentsChanged();
            map.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);
        }

        private void RasterStretchRender(IColorRamp pColorRamp, IRasterLayer pRasterLayer)
        {
            //渲染器定義
            IRasterStretchColorRampRenderer pSRRender = new RasterStretchColorRampRendererClass();
            IRasterRenderer pRRender = pSRRender as IRasterRenderer;

            //渲染器設置
            pRRender.Raster = pRasterLayer.Raster;
            pRRender.Update();
            pSRRender.ColorRamp = pColorRamp;

            //柵格渲染
            pRasterLayer.Renderer = pRRender;
        }

        private void RasterClassifyRender(IColorRamp pColorRamp, IRasterLayer pRasterLayer, int cls_num)
        {
            //渲染器定義
            IRasterClassifyColorRampRenderer pRCRender = new RasterClassifyColorRampRendererClass();
            IRasterRenderer pRRend = pRCRender as IRasterRenderer;

            //渲染器設置
            pRRend.Raster = pRasterLayer.Raster;
            pRRend.Update();
            pRCRender.ClassCount = cls_num;
            //渲染映射
            int gap = pColorRamp.Size / (cls_num-1);
            IFillSymbol fillSymbol = new SimpleFillSymbol() as IFillSymbol;
            for (int i = 0; i < pRCRender.ClassCount; i++)
            {
                int index;
                if (i < pRCRender.ClassCount - 1)
                {
                    index = i * gap;
                }
                else
                {
                    index = pColorRamp.Size-1;
                }
                fillSymbol.Color = pColorRamp.get_Color(index);
                pRCRender.set_Symbol(i, fillSymbol as ISymbol);
                pRCRender.set_Label(i, pRCRender.get_Break(i).ToString("0.00") +"-"+ pRCRender.get_Break(i+1).ToString("0.00"));
            }
            //柵格渲染
            pRasterLayer.Renderer = pRRend;
        }

        private void RasterUniqueRender(IColorRamp pColorRamp, IRasterLayer pRasterLayer)
        {
            //渲染器定義
            IRasterUniqueValueRenderer pRURender = new RasterUniqueValueRendererClass();
            IRasterRenderer pRRend = pRURender as IRasterRenderer;

            //渲染器設置
            pRRend.Raster = pRasterLayer.Raster;
            pRRend.Update();
            
            IUniqueValues uniqueValues = new UniqueValuesClass();
            IRasterCalcUniqueValues calcUniqueValues = new RasterCalcUniqueValuesClass();
            calcUniqueValues.AddFromRaster(pRasterLayer.Raster, 0, uniqueValues);//計算第0通道的唯一值
            //渲染映射
            int gap = pColorRamp.Size / (uniqueValues.Count - 1);
            IFillSymbol fillSymbol = new SimpleFillSymbol() as IFillSymbol;
            for (int i = 0; i < uniqueValues.Count; i++)
            {
                int index;
                if (i < uniqueValues.Count - 1)
                {
                    index = i * gap;
                }
                else
                {
                    index = pColorRamp.Size - 1;
                }
                fillSymbol.Color = pColorRamp.get_Color(index);
                pRURender.AddValue(0, i, uniqueValues.get_UniqueValue(i));
                pRURender.set_Label(0, i, uniqueValues.get_UniqueValue(i).ToString());
                pRURender.set_Symbol(0, i, fillSymbol as ISymbol);
            }
            //柵格渲染
            pRasterLayer.Renderer = pRRend;
        }
        #endregion

矢量渲染代碼

        #region 不同方式的矢量渲染
        private void SetFeatureSymbol(IFeatureLayer pFeatureLayer)
        {
            //獲取cb選擇的色帶序號,根據序號選擇色帶
            int symbol_index = cb_colormap.SelectedIndex;
            ISymbologyStyleClass symbologyStyleClass = axSymbologyControl1.GetStyleClass(esriSymbologyStyleClass.esriStyleClassColorRamps);
            IStyleGalleryItem mStyleGalleryItem = symbologyStyleClass.GetItem(symbol_index);
            IColorRamp colorramp_select = (IColorRamp)mStyleGalleryItem.Item;

            if (cb_method.Text == "Classify")
            {
                if (textBox1.Text == "不分")
                {

                }
                else
                {
                    int cls_num = Convert.ToInt32(textBox1.Text);
                    FeatureClassifyRender(colorramp_select, pFeatureLayer, cls_num);
                }
            }
            else if (cb_method.Text == "Unique")
            {
                FeatureUniqueRender(colorramp_select, pFeatureLayer);
            }

            //視圖刷新
            map.ActiveView.ContentsChanged();
            map.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);
        }

        private void FeatureClassifyRender(IColorRamp pColorRamp, IFeatureLayer pFeatureLayer, int cls_num)
        {
            if (pField.Type == esriFieldType.esriFieldTypeDouble || pField.Type == esriFieldType.esriFieldTypeInteger || pField.Type == esriFieldType.esriFieldTypeOID)
            {
                //渲染器定義
                IClassBreaksRenderer pFCRender = new ClassBreaksRendererClass();
                IFeatureRenderer pFRender = pFCRender as IFeatureRenderer;

                //渲染器設置
                pFCRender.Field = pField.Name;
                pFCRender.BreakCount = cls_num+1;

                //數值處理
                ITableHistogram histo = new BasicTableHistogramClass();//獲取直方圖
                histo.Field = pField.Name;
                histo.Table = pFeatureLayer.FeatureClass as ITable;
                object dbArray, nArray;//定義分級數組
                (histo as IBasicHistogram).GetHistogram(out dbArray, out nArray);
                double[] dataArray = dbArray as double[];
                int[] fredArray = nArray as int[];
                IClassifyGEN classify = new EqualIntervalClass();//平均分級法
                classify.Classify(dataArray, fredArray, cls_num);
                double[] Breaks = classify.ClassBreaks as double[];//分級數組確定


                //渲染映射
                pFCRender.MinimumBreak = Breaks[0];
                int gap = pColorRamp.Size / (pFCRender.BreakCount - 1);
                for (int i = 0; i < cls_num; i++)
                {
                    int index;
                    if (i < cls_num - 1)
                    {
                        index = i * gap;
                    }
                    else
                    {
                        index = pColorRamp.Size - 1;
                    }
                    ISymbol pSymbol = null;
                    if (pFeatureLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolygon)
                    {
                        pSymbol = new SimpleFillSymbolClass();
                        (pSymbol as IFillSymbol).Outline.Width = 1.0;
                        (pSymbol as IFillSymbol).Color = pColorRamp.get_Color(index);
                    }
                    else if (pFeatureLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolyline)
                    {
                        pSymbol = new SimpleLineSymbolClass();
                        (pSymbol as ILineSymbol).Width = 1.0;
                        (pSymbol as ILineSymbol).Color = pColorRamp.get_Color(index);
                    }
                    else if (pFeatureLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPoint)
                    {
                        pSymbol = new SimpleMarkerSymbolClass();
                        (pSymbol as IMarkerSymbol).Size = 1.0;
                        (pSymbol as IMarkerSymbol).Color = pColorRamp.get_Color(index);      
                    }
                    pFCRender.set_Break(i, Breaks[i + 1]);
                    pFCRender.set_Symbol(i, pSymbol);
                    pFCRender.set_Label(i, Breaks[i].ToString() + "-" + Breaks[i + 1].ToString());
                }

                //矢量圖層渲染
                (pFeatureLayer as IGeoFeatureLayer).Renderer = pFRender;
            }
        }

        private void FeatureUniqueRender(IColorRamp pColorRamp, IFeatureLayer pFeatureLayer)
        {
            //渲染器定義
            IUniqueValueRenderer pFURender = new UniqueValueRendererClass();
            IFeatureRenderer pFRender = pFURender as IFeatureRenderer;

            //渲染器設置
            pFURender.FieldCount = 1;
            pFURender.set_Field(0, pField.Name);
            if (pField.Type == esriFieldType.esriFieldTypeString)
            {
                pFURender.set_FieldType(0, true);
            }
            else
            {
                pFURender.set_FieldType(0, false);
            }

            //數值處理
            IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
            IFeatureCursor lFeatureCursor = pFeatureClass.Search(null, false);
            IDataStatistics pData = new DataStatisticsClass();
            pData.Field = pField.Name;
            pData.Cursor = lFeatureCursor as ICursor;
            IEnumerator pEnumVar = pData.UniqueValues;
            string[] uniqueValues = new string[pData.UniqueValueCount];
            pEnumVar.Reset();
            int n = 0;
            while (pEnumVar.MoveNext())
            {
                uniqueValues[n++] = pEnumVar.Current.ToString();
            }

            //渲染映射
            int gap = pColorRamp.Size / (uniqueValues.Length - 1);
            for (int i = 0; i < uniqueValues.Length; i++)
            {
                int index;
                if (i < uniqueValues.Length - 1)
                {
                    index = i * gap;
                }
                else
                {
                    index = pColorRamp.Size - 1;
                }
                ISymbol pSymbol = null;
                if (pFeatureLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolygon)
                {
                    pSymbol = new SimpleFillSymbolClass();
                    (pSymbol as IFillSymbol).Outline.Width = 1.0;
                    (pSymbol as IFillSymbol).Color = pColorRamp.get_Color(index);
                }
                else if (pFeatureLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolyline)
                {
                    pSymbol = new SimpleLineSymbolClass();
                    (pSymbol as ILineSymbol).Width = 1.0;
                    (pSymbol as ILineSymbol).Color = pColorRamp.get_Color(index);
                }
                else if (pFeatureLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPoint)
                {
                    pSymbol = new SimpleMarkerSymbolClass();
                    (pSymbol as IMarkerSymbol).Size = 2.0;
                    (pSymbol as IMarkerSymbol).Color = pColorRamp.get_Color(index);
                }
                pFURender.AddValue(uniqueValues[i], "", pSymbol);
            }

            //矢量圖層渲染
            (pFeatureLayer as IGeoFeatureLayer).Renderer = pFRender;


        }
        #endregion

4小結

渲染過程2個關鍵對象:色帶、渲染器,1個重要過程渲染器與對應渲染值、渲染顏色的關係映射

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章