ArcEngine开发之矢量图层渲染实现

来源:互联网 发布:淘宝商品销售属性没有 编辑:程序博客网 时间:2024/05/22 03:21

渲染是ArcGIS常用的功能,在开发中这个功能也比较重要,通过自己的整理摸索重要实现了简单渲染和单一值专题图渲染两种比较常用的渲染功能。虽然感觉写得不是很好,但可能对大家有借鉴意义,故在这里跟大家分享一下。

实现效果如下:
具体代码如下(可能有点多哈):
一:渲染图层编写的类
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.SystemUI;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Display;
using CommonClassLibrary;


namespace TocFunction.GisToc
{
   public  class LayerRenderer
    {
       AxMapControl mMapControl;
       ILayer  mLayer;
       AxSymbologyControl mSymbolControl;
       IEnumColors EnumColors;
       string symbolType;
       public LayerRenderer()
       { 
       }
       //构造函数
       public LayerRenderer(AxMapControl pMapControl,AxSymbologyControl pSymbolControl,ILayer pLayer)
       {
           mMapControl = pMapControl;
           mLayer = pLayer;
           mSymbolControl = pSymbolControl;
           symbolType = GetLayerType();
       }
       //
       public IEnumColors mEnumColors
       {
           get
           {
               return EnumColors;
           }
           set
           {
               EnumColors= value;
           }
       }
       //
       public esriSymbologyStyleClass SymbolClassStyle()
       {
           switch (GetLayerType())
           {
               case "Point":
                   return esriSymbologyStyleClass.esriStyleClassMarkerSymbols;
               case "Polyline":
                   return esriSymbologyStyleClass.esriStyleClassLineSymbols;
               case "Polygon":
                   return esriSymbologyStyleClass.esriStyleClassFillSymbols;
               case "MultiPatch":
                   return esriSymbologyStyleClass.esriStyleClassFillSymbols;
               default:
                   return esriSymbologyStyleClass.esriStyleClassMarkerSymbols;
           }
       }
       //Symbol转化为Image
       public Image SymbolConvertToImage(ISymbol pSymbol)
       {
           esriSymbologyStyleClass symbologyStyleClass=SymbolClassStyle();
           mSymbolControl.StyleClass = symbologyStyleClass;
           IStyleGalleryItem StyleGalleryItem = new ServerStyleGalleryItem();
           StyleGalleryItem.Item = pSymbol;
           stdole.IPictureDisp picture = mSymbolControl.GetStyleClass(mSymbolControl.StyleClass).PreviewItem(StyleGalleryItem,75,20);
           System.Drawing.Image image = System.Drawing.Image.FromHbitmap(new System.IntPtr(picture.Handle));
           return image;
       }
       //返回图层的类型
       public string GetLayerType()
       {
           try
           {
               if (mLayer == null && !(mLayer is IFeatureLayer)) return null;
               IGeoFeatureLayer pGeoFeatureLayer = (IGeoFeatureLayer)mLayer;
               switch (((IFeatureLayer)mLayer).FeatureClass.ShapeType)
               {
                   case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint:
                       return "Point";
                   case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline:
                       return "Polyline";
                   case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon:
                       return "Polygon";
                   case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryMultiPatch:
                       return "MultiPatch";
                   default:
                       return null;
               }
           }
           catch { return null; }
       }
       //改变颜色
       public ISymbol ChangeColor(ISymbol symbol, IColor pColor)
       {
           //设置符号颜色为用户选定的颜色
           switch (mSymbolControl.StyleClass)
           {
               //点符号
               case esriSymbologyStyleClass.esriStyleClassMarkerSymbols:
                   IMarkerSymbol markerSymbol = (IMarkerSymbol)symbol;
                   markerSymbol.Color = pColor;
                   return (ISymbol)markerSymbol;
               //线符号
               case esriSymbologyStyleClass.esriStyleClassLineSymbols:
                   ILineSymbol lineSymbol = (ILineSymbol)symbol;
                   lineSymbol.Color = pColor;
                   return (ISymbol)lineSymbol;


               //面符号
               case esriSymbologyStyleClass.esriStyleClassFillSymbols:
                   ((IFillSymbol)symbol).Color = pColor;
                   IFillSymbol fillSymbol = (IFillSymbol)symbol;
                   fillSymbol.Color = pColor;
                   return (ISymbol)fillSymbol;
           }
           return symbol;
           //更新符号预览
       }
       //改变颜色
       public void ChangeColor(IStyleGalleryItem pStyleGalleryItem, IColor pColor)
       {
           //设置符号颜色为用户选定的颜色
           switch (mSymbolControl.StyleClass)
           {
               //点符号
               case esriSymbologyStyleClass.esriStyleClassMarkerSymbols:
                   ((IMarkerSymbol)pStyleGalleryItem.Item).Color =pColor;
                   break;
               //线符号
               case esriSymbologyStyleClass.esriStyleClassLineSymbols:
                   ((ILineSymbol)pStyleGalleryItem.Item).Color =pColor;
                   break;
               //面符号
               case esriSymbologyStyleClass.esriStyleClassFillSymbols:
                       ((IFillSymbol)pStyleGalleryItem.Item).Color =pColor;
                   break;
           }
           //更新符号预览
       }
       //生成符号
        public ISymbol getDefaultSymbol()
       {
           IColor pColor =ConvertColorToIColor(Color.Green);
           ISymbol result = null;
           switch (symbolType)
           {
               case "Point":
                   result = new SimpleMarkerSymbolClass();
                   ISimpleMarkerSymbol markSymbol = (result as ISimpleMarkerSymbol);
                   markSymbol.Size = 2;
                   markSymbol.Color = pColor;
                   break;
               case "Polyline":
                   result = new SimpleLineSymbolClass();
                   ISimpleLineSymbol lineSymbol = (result as ISimpleLineSymbol);
                   lineSymbol.Width = 1;
                   lineSymbol.Color = pColor;
                   break;
               case "Polygon":
                   result = new SimpleFillSymbolClass();
                   ISimpleLineSymbol outline = new SimpleLineSymbolClass();
                   outline.Width = 0.5;
                   outline.Color = ConvertColorToIColor(Color.Green);
                   ISimpleFillSymbol fillSymbol = (result as ISimpleFillSymbol);
                   fillSymbol.Outline = outline;
                   fillSymbol.Color = pColor;
                   break;
               case "MultiPatch":
                   result = new SimpleFillSymbolClass();
                   ISimpleFillSymbol fSymbol = (result as ISimpleFillSymbol);
                   fSymbol.Color = pColor;
                   break;
           }
           return result;
       }
       //简单渲染
       public void SimpleFillSymbol(ISymbol pSymbol, string pLableName, string pDescription)
       {
           ISimpleRenderer simpleRender = new SimpleRenderer();
           simpleRender.Symbol = pSymbol;
           simpleRender.Label = pLableName;
           simpleRender.Description = pDescription;
           IGeoFeatureLayer geoFeatureLayer;
           geoFeatureLayer =mLayer as IGeoFeatureLayer;
           if (geoFeatureLayer != null)
           {
               geoFeatureLayer.Renderer = simpleRender as IFeatureRenderer;
               mMapControl.ActiveView.ContentsChanged();//图层图例刷新靠这句话
               mMapControl.ActiveView.Refresh();
           }
       }


       //单一值专题图
       public void IUniqueValue(string FieldName,ListView ListView)
       {
           if (ListView.Items.Count<1) return;
           IGeoFeatureLayer geoFeatureLayer;
           geoFeatureLayer =mLayer as IGeoFeatureLayer;
           IUniqueValueRenderer uniqueValueRenderer = new UniqueValueRenderer();
           uniqueValueRenderer.FieldCount = 1;
           uniqueValueRenderer.set_Field(0,QueryTable.GetFieldName(mLayer,FieldName));
           string NameValue;
           ISymbol Symbol;
           for (int i = 0; i < ListView.Items.Count; i++)
           {
               NameValue = ListView.Items[i].SubItems[1].Text;
               Symbol = (ISymbol)ListView.Items[i].Tag;
               uniqueValueRenderer.AddValue(NameValue, FieldName, Symbol);
           }
           geoFeatureLayer.Renderer = uniqueValueRenderer as IFeatureRenderer;
           mMapControl.ActiveView.Refresh();
           mMapControl.ActiveView.ContentsChanged();
       }
       //分级专题图
       public void HistogramRenderer(string pFieldName,ISymbol pSymbol,int pCount)
       {
           int classCount = pCount;
           ITableHistogram tableHistogram;
           IBasicHistogram basicHistogram;
           ITable table;
           IGeoFeatureLayer geoFeatureLayer;
           geoFeatureLayer =mLayer as IGeoFeatureLayer;
           int fieldCount = geoFeatureLayer.FeatureClass.FeatureCount(null);
           ILayer layer = mLayer as IGeoFeatureLayer;
           table = layer as ITable;
           tableHistogram = (ITableHistogram)new BasicTableHistogram();
           //按照 数值字段分级
           tableHistogram.Table = table;
           tableHistogram.Field = pFieldName;
           basicHistogram = tableHistogram as IBasicHistogram;
           object values;
           object frequencys;
           //先统计每个值和各个值出现的次数
           basicHistogram.GetHistogram(out values, out frequencys);
           //创建平均分级对象
           IClassifyGEN classifyGEN = new Quantile();
           //用统计结果进行分级 ,级别数目为classCount
           classifyGEN.Classify(values, frequencys, ref classCount);
           //获得分级结果,是个 双精度类型数组 
           double[] classes;
           classes = classifyGEN.ClassBreaks as double[];
           IEnumColors enumColors =CreateColorRamp.CreateAlgorithmicColorRamp(classes.Length).Colors;//
           IColor color;
           IClassBreaksRenderer classBreaksRenderer = new ClassBreaksRenderer();
           classBreaksRenderer.Field = pFieldName;
           classBreaksRenderer.BreakCount = classCount;
           classBreaksRenderer.SortClassesAscending = true;
           for (int i = 0; i < classes.Length - 1; i++)
           {
               color = enumColors.Next();
               classBreaksRenderer.set_Symbol(i, pSymbol);
               classBreaksRenderer.set_Break(i, classes[i]);
           }


           if (geoFeatureLayer != null)
           {
               geoFeatureLayer.Renderer= classBreaksRenderer as IFeatureRenderer;
           }
           mMapControl.ActiveView.Refresh();
           mMapControl.ActiveView.ContentsChanged();


       }
       //ProportionalSymbolRenderer专题图
       public  void ProportionalRenderer(string pFieldName)
       {


           IGeoFeatureLayer geoFeatureLayer;
           IFeatureLayer featureLayer;
           IProportionalSymbolRenderer proportionalSymbolRenderer;
           ITable table;
           ICursor cursor;
           IDataStatistics dataStatistics;
           IStatisticsResults statisticsResult;
           stdole.IFontDisp fontDisp;


           geoFeatureLayer = mLayer as IGeoFeatureLayer;
           int fieldCount = geoFeatureLayer.FeatureClass.FeatureCount(null);
           featureLayer = geoFeatureLayer as IFeatureLayer;
           table = geoFeatureLayer as ITable;
           cursor = table.Search(null, true);
           dataStatistics = new DataStatistics();
           dataStatistics.Cursor = cursor;
           dataStatistics.Field =pFieldName;
           statisticsResult = dataStatistics.Statistics;
           if (statisticsResult != null)
           {
               IFillSymbol fillSymbol = new SimpleFillSymbol();
               fillSymbol.Color = getRGB(0, 255, 0);
               ICharacterMarkerSymbol characterMarkerSymbol = new CharacterMarkerSymbol();
               fontDisp = new stdole.StdFont() as stdole.IFontDisp;
               fontDisp.Name = "arial";
               fontDisp.Size = 20;
               characterMarkerSymbol.Font = fontDisp;
               characterMarkerSymbol.CharacterIndex = 90;
               characterMarkerSymbol.Color = getRGB(255, 0, 0);
               characterMarkerSymbol.Size = 10;
               proportionalSymbolRenderer = (IProportionalSymbolRenderer)new ProportionalSymbolRenderer();
               proportionalSymbolRenderer.ValueUnit = esriUnits.esriUnknownUnits;
               proportionalSymbolRenderer.Field = pFieldName;
               proportionalSymbolRenderer.FlanneryCompensation = false;
               proportionalSymbolRenderer.MinDataValue = statisticsResult.Minimum;
               proportionalSymbolRenderer.MaxDataValue = statisticsResult.Maximum;
               proportionalSymbolRenderer.BackgroundSymbol = fillSymbol;
               proportionalSymbolRenderer.MinSymbol = characterMarkerSymbol as ISymbol;
               proportionalSymbolRenderer.LegendSymbolCount = fieldCount;//
               proportionalSymbolRenderer.CreateLegendSymbols();
               geoFeatureLayer.Renderer = proportionalSymbolRenderer as IFeatureRenderer;
           }
           mMapControl.ActiveView.Refresh();
           mMapControl.ActiveView.ContentsChanged();


       }
       //BarChartSymbol
       public void BarChartRenderer(string pFieldx, string pFieldy)
       {
           IGeoFeatureLayer geoFeatureLayer;
           IFeatureLayer featureLayer;
           ITable table;
           ICursor cursor;
           IRowBuffer rowBuffer;
           //设置渲染要素
           string field1 =pFieldx;// "sqmi"
           string field2 = pFieldy;// "sqkm"
           //获取渲染图层
           geoFeatureLayer =mLayer as IGeoFeatureLayer;
           featureLayer = geoFeatureLayer as IFeatureLayer;
           table = featureLayer as ITable;
           geoFeatureLayer.ScaleSymbols = true;
           IChartRenderer chartRenderer = new ChartRenderer();
           IRendererFields rendererFields = chartRenderer as IRendererFields;
           rendererFields.AddField(field1, field1);
           rendererFields.AddField(field2, field2);
           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 < 2; i++)
               {
                   fieldValue = double.Parse(rowBuffer.get_Value(fieldIndexs[i]).ToString());
                   if (fieldValue > maxValue)
                   {
                       maxValue = fieldValue;
                   }
               }
               rowBuffer = cursor.NextRow();
           }
           //创建水平排列符号
           IBarChartSymbol barChartSymbol = (IBarChartSymbol)new BarChartSymbol();
           barChartSymbol.Width = 10;
           IMarkerSymbol markerSymbol = barChartSymbol as IMarkerSymbol;
           markerSymbol.Size = 50;
           IChartSymbol chartSymbol = barChartSymbol as IChartSymbol;
           chartSymbol.MaxValue = maxValue;
           //添加渲染符号
           ISymbolArray symbolArray = barChartSymbol as ISymbolArray;
           IFillSymbol fillSymbol = new SimpleFillSymbol();
           fillSymbol.Color = getRGB(255, 0, 0);
           symbolArray.AddSymbol(fillSymbol as ISymbol);
           fillSymbol = new SimpleFillSymbol();
           fillSymbol.Color = getRGB(0, 255, 0);
           symbolArray.AddSymbol(fillSymbol as ISymbol);
           //设置柱状图符号
           chartRenderer.ChartSymbol = barChartSymbol as IChartSymbol;
           fillSymbol = new SimpleFillSymbol();
           fillSymbol.Color = getRGB(0, 0, 255);
           chartRenderer.BaseSymbol = fillSymbol as ISymbol;
           chartRenderer.UseOverposter = false;
           //创建图例
           chartRenderer.CreateLegend();
           geoFeatureLayer.Renderer = chartRenderer as IFeatureRenderer;
           mMapControl.ActiveView.Refresh();
           mMapControl.ActiveView.ContentsChanged();
       }
       //StackedChartSymbol
       public  void StackedChartSymbol(string pFieldx,string pFieldy)
       {
           IGeoFeatureLayer geoFeatureLayer;
           IFeatureLayer featureLayer;
           ITable table;
           ICursor cursor;
           IRowBuffer rowBuffer;
           //设置渲染要素
           string field1 = pFieldx;
           string field2 = pFieldy;
           //获取渲染图层
           geoFeatureLayer =mLayer as IGeoFeatureLayer;
           featureLayer = geoFeatureLayer as IFeatureLayer;
           table = featureLayer as ITable;
           geoFeatureLayer.ScaleSymbols = true;
           IChartRenderer chartRenderer = new ChartRenderer();
           IRendererFields rendererFields = chartRenderer as IRendererFields;
           rendererFields.AddField(field1, field1);
           rendererFields.AddField(field2, field2);
           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 < 2; i++)
               {
                   fieldValue = double.Parse(rowBuffer.get_Value(fieldIndexs[i]).ToString());
                   if (fieldValue > maxValue)
                   {
                       maxValue = fieldValue;
                   }
               }
               rowBuffer = cursor.NextRow();
           }
           //创建累积排列符号
           IStackedChartSymbol stackedChartSymbol = (IStackedChartSymbol)new StackedChartSymbol();


           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 SimpleFillSymbol();
           fillSymbol.Color = getRGB(255, 0, 0);
           symbolArray.AddSymbol(fillSymbol as ISymbol);
           fillSymbol = new SimpleFillSymbol();
           fillSymbol.Color = getRGB(0, 255, 0);
           symbolArray.AddSymbol(fillSymbol as ISymbol);
           //设置柱状图符号
           chartRenderer.ChartSymbol = stackedChartSymbol as IChartSymbol;
           fillSymbol = new SimpleFillSymbol();
           fillSymbol.Color = getRGB(0, 0, 255);
           chartRenderer.BaseSymbol = fillSymbol as ISymbol;
           chartRenderer.UseOverposter = false;
           //创建图例
           chartRenderer.CreateLegend();
           geoFeatureLayer.Renderer = chartRenderer as IFeatureRenderer;
           mMapControl.ActiveView.Refresh();
           mMapControl.ActiveView.ContentsChanged();
       }
       //PieChartRenderer
       public void PieChartRenderer(string pFieldx, string pFieldy)
       {
           IGeoFeatureLayer geoFeatureLayer;
           IFeatureLayer featureLayer;
           ITable table;
           ICursor cursor;
           IRowBuffer rowBuffer;
           //设置饼图的要素
           string field1 = pFieldx;
           string field2 = pFieldy;
           //获取渲染图层
           geoFeatureLayer =mLayer as IGeoFeatureLayer;
           featureLayer = geoFeatureLayer as IFeatureLayer;
           table = featureLayer as ITable;
           geoFeatureLayer.ScaleSymbols = true;
           IChartRenderer chartRenderer = new ChartRenderer();
           IPieChartRenderer pieChartRenderer = chartRenderer as IPieChartRenderer;
           IRendererFields rendererFields = chartRenderer as IRendererFields;
           rendererFields.AddField(field1, field1);
           rendererFields.AddField(field2, field2);
           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 < 2; i++)
               {
                   fieldValue = double.Parse(rowBuffer.get_Value(fieldIndexs[i]).ToString());
                   if (fieldValue > maxValue)
                   {
                       maxValue = fieldValue;
                   }
               }
               rowBuffer = cursor.NextRow();
           }
           //设置饼图符号
           IPieChartSymbol pieChartSymbol = (IPieChartSymbol)new PieChartSymbol();
           pieChartSymbol.Clockwise = true;
           pieChartSymbol.UseOutline = true;
           IChartSymbol chartSymbol = pieChartSymbol as IChartSymbol;
           chartSymbol.MaxValue = maxValue;
           ILineSymbol lineSymbol = new SimpleLineSymbol();
           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 SimpleFillSymbol();
           fillSymbol.Color = getRGB(0, 255, 0);
           symbolArray.AddSymbol(fillSymbol as ISymbol);
           fillSymbol = new SimpleFillSymbol();
           fillSymbol.Color = getRGB(0, 0, 255);
           symbolArray.AddSymbol(fillSymbol as ISymbol);
           chartRenderer.ChartSymbol = pieChartSymbol as IChartSymbol;
           fillSymbol = new SimpleFillSymbol();
           fillSymbol.Color = getRGB(100, 100, 100);
           chartRenderer.BaseSymbol = fillSymbol as ISymbol;
           chartRenderer.UseOverposter = false;
           //创建图例
           chartRenderer.CreateLegend();
           geoFeatureLayer.Renderer = chartRenderer as IFeatureRenderer;
           mMapControl.ActiveView.Refresh();
           mMapControl.ActiveView.ContentsChanged();
       }
       //DotDensityFillSymbol
       public void DotDensityRenderer(string pField)
       {
           IGeoFeatureLayer geoFeatureLayer;
           IDotDensityFillSymbol dotDensityFillSymbol;
           IDotDensityRenderer dotDensityRenderer;
           //获取渲染图层
           geoFeatureLayer =mLayer as IGeoFeatureLayer;
           dotDensityRenderer =(IDotDensityRenderer) new DotDensityRenderer();
           IRendererFields rendererFields = dotDensityRenderer as IRendererFields;
           //设置渲染字段
           string field1 = pField;
           rendererFields.AddField(field1, field1);
           //设置填充颜色和背景色
           dotDensityFillSymbol = new DotDensityFillSymbol();
           dotDensityFillSymbol.DotSize = 3;
           dotDensityFillSymbol.Color = getRGB(255, 0, 0);
           dotDensityFillSymbol.BackgroundColor = getRGB(0, 255, 0);
           //设置渲染符号
           ISymbolArray symbolArray = dotDensityFillSymbol as ISymbolArray;
           ISimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol();
           simpleMarkerSymbol.Style = esriSimpleMarkerStyle.esriSMSCircle;
           simpleMarkerSymbol.Size = 2;
           simpleMarkerSymbol.Color = getRGB(0, 0, 255);
           symbolArray.AddSymbol(simpleMarkerSymbol as ISymbol);
           dotDensityRenderer.DotDensitySymbol = dotDensityFillSymbol;
           //设置渲染密度
           dotDensityRenderer.DotValue = 50000;
           //创建图例
           dotDensityRenderer.CreateLegend();
           geoFeatureLayer.Renderer = dotDensityRenderer as IFeatureRenderer;
           mMapControl.ActiveView.Refresh();
           mMapControl.ActiveView.ContentsChanged();
       }
       public Color ConvertIRgbColorToColor(IRgbColor pRgbColor)
       {
           if (!(pRgbColor == null))
               return ColorTranslator.FromOle(pRgbColor.RGB);
           else
               return Color.Green;
       }
      public Color ConvertIColorToColor(IColor pColor)
      {
            return ColorTranslator.FromOle(pColor.RGB);
      }
       //颜色转换
         public IColor ConvertColorToIColor(Color color)
        {
            IColor pColor = new RgbColor();
            pColor.RGB = color.B * 65536 + color.G * 256 + color.R;
            return pColor;
        }
       //获取颜色对象
       public  IRgbColor getRGB(int r, int g, int b)
       {
           IRgbColor pColor;
           pColor = new RgbColor();
           pColor.Red = r;
           pColor.Green = g;
           pColor.Blue = b;
           return pColor;
       }


    }
}

二:窗体即空间等事件代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.SystemUI;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Display;
using System.Drawing.Imaging;


namespace TocFunction.GisToc
{
    public partial class FrmRenderer : DevExpress.XtraEditors.XtraForm
    {
        AxMapControl mMapControl;
        LayerRenderer mRenderer;
        ILayer mLayer;
        ISymbol mSymbol=null;
        ImageComboBox ImageBox;
        public FrmRenderer(AxMapControl pMapControl, ILayer pLayer)
        {
            InitializeComponent();
            mMapControl = pMapControl;
            mLayer = pLayer;
        }
        //
        private void AddImageCbx()
        {
            ImageBox = new ImageComboBox();
            xtraTabPage2.Controls.Add(ImageBox);
            ImageBox.Width = 150;
            ImageBox.Height = 23;
            ImageBox.Left =295;
            ImageBox.Top =12;
            ImageBox.Visible = true;
            ImageBox.SelectedIndexChanged += new System.EventHandler(ChangeColorRamp);
            ColorRampStyles.LoadStyleFile(Application.StartupPath + @"\Data\ESRI.ServerStyle");
            ISymbologyStyleClass symbologyStyleClass = ColorRampStyles.GetStyleClass(esriSymbologyStyleClass.esriStyleClassColorRamps);
            ColorRampStyles.StyleClass = esriSymbologyStyleClass.esriStyleClassColorRamps;
            symbologyStyleClass = ColorRampStyles.GetStyleClass(esriSymbologyStyleClass.esriStyleClassColorRamps);
            for (int i = 0; i < symbologyStyleClass.get_ItemCount(symbologyStyleClass.StyleCategory); i++)
            {
                stdole.IPictureDisp picture = symbologyStyleClass.PreviewItem(symbologyStyleClass.GetItem(i), ImageBox.Width, ImageBox.Height);
                System.Drawing.Image image = System.Drawing.Image.FromHbitmap(new System.IntPtr(picture.Handle));
                ImageBox.Items.Add(image);
            }
            if (ImageBox.Items.Count > 0)
                ImageBox.SelectedIndex = 0;
        }
        //颜色转换
        private void ChangeColorRamp(object sender, EventArgs e)
        {
            IEnumColors EnumColors;
            int index = ImageBox.SelectedIndex;
            if (index == -1) return;
            ISymbologyStyleClass symbologyStyleClass = ColorRampStyles.GetStyleClass(esriSymbologyStyleClass.esriStyleClassColorRamps);
            IColorRamp ColorRamp = (IColorRamp)symbologyStyleClass.GetItem(index).Item;
            EnumColors = ColorRamp.Colors;
            EnumColors.Reset();
            ISymbol symbol;
            if (ListView.Items.Count <= 70)
            {
                for (int i = 0; i < ListView.Items.Count; i++)
                {
                    symbol = (ISymbol)ListView.Items[i].Tag;
                    symbol = mRenderer.ChangeColor(symbol, EnumColors.Next());
                    imageList1.Images[i] = mRenderer.SymbolConvertToImage(symbol);
                    ListView.Items[i].Tag = symbol;
                    ListView.Items[i].ImageIndex = i;
                }
            }
            else
            {
                symbol = (ISymbol)ListView.Items[0].Tag;
                //IColor color=mRenderer.ConvertColorToIColor(Color.Green);
                //symbol = mRenderer.ChangeColor(symbol,color);
                imageList1.Images[0] = mRenderer.SymbolConvertToImage(symbol);
                for (int i = 0; i < ListView.Items.Count; i++)
                {
                    ListView.Items[i].Tag = symbol;
                    ListView.Items[i].ImageIndex =0;
                }
            }
            ListView.Refresh();
        }


        private void FrmRenderer_Load(object sender, EventArgs e)
        {
            AddImageCbx();
            TreeNode TnFeature = new TreeNode();
            TnFeature.Text = "要素";
            TnFeature.Nodes.Add("简单渲染");
            TvMethod.Nodes.Add(TnFeature);
            TreeNode TnCateGories = new TreeNode();
            TnCateGories.Text = "专题分级";
            TnCateGories.Nodes.Add("单一值专题");
            TvMethod.Nodes.Add(TnCateGories);
            TvMethod.ExpandAll();
            mRenderer = new LayerRenderer(mMapControl,axSymbologyControl1, mLayer);
            ListView.SmallImageList = imageList1;
            IGeoFeatureLayer geoFeatureLayer = mLayer as IGeoFeatureLayer;
            ISimpleRenderer simpleRender = null;
            IUniqueValueRenderer uniqueValueRenderer = null;
            simpleRender = geoFeatureLayer.Renderer as ISimpleRenderer;
            uniqueValueRenderer = geoFeatureLayer.Renderer as IUniqueValueRenderer;
            QueryTable.GetFieldName(mLayer, cbxFieldName);
            try
            {
                if (uniqueValueRenderer != null)
                {
                    ShowImage(1);
                    for (int i = 0; i < uniqueValueRenderer.FieldCount; i++)
                    {
                        cbxFieldName.Text =QueryTable.GetFieldAliasName(mLayer,uniqueValueRenderer.get_Field(i));
                    }
                    string value, label;
                    for (int i = 0; i < uniqueValueRenderer.ValueCount; i++)
                    {
                        value = uniqueValueRenderer.get_Value(i);
                        label = uniqueValueRenderer.get_Label(value);
                        mSymbol = uniqueValueRenderer.get_Symbol(value);
                        imageList1.Images.Add(mRenderer.SymbolConvertToImage(mSymbol));
                        ListViewItem item = new ListViewItem();
                        item.ImageIndex = i;//0就是imagelist的第一个图片,以此类推
                        item.SubItems.Add(value);
                        item.SubItems.Add(label);
                        item.SubItems.Add("?");
                        item.Tag = mSymbol;
                        ListView.Items.Add(item);
                    }
                }
                if (simpleRender != null)
                {
                    ShowImage(0);
                    xtraTabControl1.SelectedTabPageIndex = 0;
                    txtLable.Text = simpleRender.Label;
                    txtDescripe.Text = simpleRender.Description;
                    mSymbol = simpleRender.Symbol;
                }
                if (mSymbol != null)
                {
                    btnSymbol.Image = mRenderer.SymbolConvertToImage(mSymbol);
                }
            }
            catch
            {
                
            }
        }
        //判断图层渲染类型
        private int GetRendererType()
        {
            IGeoFeatureLayer geoFeatureLayer=mLayer as IGeoFeatureLayer;
            ISimpleRenderer simpleRender = null;
            IUniqueValueRenderer uniqueValueRenderer=null;
            simpleRender = geoFeatureLayer.Renderer as ISimpleRenderer;
            uniqueValueRenderer = geoFeatureLayer.Renderer as IUniqueValueRenderer;
            if (simpleRender != null)
                return 1;
            if (uniqueValueRenderer != null)
                return 2;
            return 0;
        }
        //选择类型
        private void ShowImage(int n)
        {
            string ImagePath = Application.StartupPath + "\\images\\";
            switch (n)
            { 
                case 0:
                    xtraTabControl1.SelectedTabPageIndex = 0;
                    PicPreview.Image = new Bitmap(ImagePath + "simple.jpg");
                    TvMethod.SelectedNode = TvMethod.Nodes[0].Nodes[0];
                    break;
                case 1:
                    xtraTabControl1.SelectedTabPageIndex = 1;
                    PicPreview.Image = new Bitmap(ImagePath + "unique.jpg");
                    TvMethod.SelectedNode = TvMethod.Nodes[1].Nodes[0];
                    break;
            }
        }
        private void TvMethod_AfterSelect(object sender, TreeViewEventArgs e)
        {
            switch (e.Node.Text)
            {
                case "简单渲染":
                    ShowImage(0);
                    if (mSymbol != null)
                    {
                        btnSymbol.Image = mRenderer.SymbolConvertToImage(mSymbol);
                    }
                    break;
                case "单一值专题":
                    ShowImage(1);
                    break;
            }
        }


        private void btnAddAll_Click(object sender, EventArgs e)
        {
            if (cbxFieldName.Text != "")
            {
                int Count = QueryTable.GetValueCount(mLayer, cbxFieldName.Text);
                if (Count > 70)
                {
                    if (MessageBox.Show("按照该字段分类的类别数会分为" + Count.ToString() + "类,\n如果继续的话,可能需要较长时间,是否继续?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.No)
                        return;
                }
                string FieldName = cbxFieldName.SelectedItem.ToString();
                ListView.Items.Clear();
                imageList1.Images.Clear();
                List<string> FieldValues = new List<string>();
                List<int> ValueCount = new List<int>();
                QueryTable.GetUniqueValue(mLayer, FieldName, ref FieldValues, ref ValueCount);
                if (Count <= 70)
                {
                    for (int i = 0; i < FieldValues.Count; i++)
                    {
                        ISymbol symbol;
                        symbol=mRenderer.getDefaultSymbol();
                        imageList1.Images.Add(mRenderer.SymbolConvertToImage(symbol));
                        ListViewItem Item = new ListViewItem();
                        Item.ImageIndex =i;
                        Item.SubItems.Add(FieldValues[i]);
                        Item.SubItems.Add(FieldValues[i]);
                        Item.SubItems.Add(ValueCount[i].ToString());
                        Item.Tag = symbol;
                        ListView.Items.Add(Item);
                    }
                    
                }
                else
                {
                    imageList1.Images.Add(mRenderer.SymbolConvertToImage(mSymbol));
                    for (int i = 0; i < FieldValues.Count; i++)
                    {
                        ListViewItem Item = new ListViewItem();
                        Item.ImageIndex = 0;
                        Item.SubItems.Add(FieldValues[i]);
                        Item.SubItems.Add(FieldValues[i]);
                        Item.SubItems.Add(ValueCount[i].ToString());
                        Item.Tag = mSymbol;
                        ListView.Items.Add(Item);
                    }
                }
                ListView.Refresh();
                if(ListView.Items.Count<=15)
                    ImageBox.SelectedIndex = 62;
                else
                    ImageBox.SelectedIndex =0;
            }
        }


        private void cbxFieldName_SelectedIndexChanged(object sender, EventArgs e)
        {
            ListView.Items.Clear();
        }


        private void ListView_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            int n = ListView.SelectedItems[0].Index;
            ISymbol symbol;
            symbol=(ISymbol)ListView.Items[n].Tag;
            SetSymbolFrm SymbolSelectorFrm = new SetSymbolFrm(symbol, mLayer);
            if (SymbolSelectorFrm.ShowDialog() == DialogResult.OK)
            {
                symbol = SymbolSelectorFrm.gSymbol;
                if (ListView.Items.Count <= 70)
                {
                    imageList1.Images[n] = mRenderer.SymbolConvertToImage(symbol);
                    ListView.Items[n].ImageIndex = n;
                    ListView.Items[n].Tag = symbol;
                }
                else
                {
                    imageList1.Images[0] = mRenderer.SymbolConvertToImage(symbol);
                    ListView.Items[n].Tag = symbol;
                    ListView.Items[n].ImageIndex =0;
                }
                ListView.Refresh();
            }
        }


        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.Close();
        }


        private void btnOk_Click(object sender, EventArgs e)
        {
            switch (xtraTabControl1.SelectedTabPage.Text)
            {
                case "简单渲染":
                    mRenderer.SimpleFillSymbol(mSymbol, txtLable.Text, txtDescripe.Text);
                    break;
                case "单一值渲染":
                    mRenderer.IUniqueValue(cbxFieldName.Text, ListView);
                    break;
            }
            this.Close();
        }


        private void btnSymbol_Click(object sender, EventArgs e)
        {
            SetSymbolFrm SymbolSelectorFrm = new SetSymbolFrm(mSymbol, mLayer);
            if (SymbolSelectorFrm.ShowDialog() == DialogResult.OK)
            {
                mSymbol = SymbolSelectorFrm.gSymbol;
                btnSymbol.Image = mRenderer.SymbolConvertToImage(mSymbol);
            }
        }


        private void btnApply_Click(object sender, EventArgs e)
        {
            switch (xtraTabControl1.SelectedTabPage.Text)
            {
                case "简单渲染":
                    mRenderer.SimpleFillSymbol(mSymbol, txtLable.Text, txtDescripe.Text);
                    break;
                case "单一值渲染":
                    mRenderer.IUniqueValue(cbxFieldName.Text, ListView);
                    break;
            }
        }


        private void btnRemoveAll_Click(object sender, EventArgs e)
        {
            ListView.Items.Clear();
            ListView.Refresh();
        }


        private void btnRemoveSelect_Click(object sender, EventArgs e)
        {
            if (ListView.SelectedIndices.Count > 0)
            {
                ListView.Items.RemoveAt(ListView.SelectedIndices[0]);
                ListView.Refresh();
            }
        }


        private void btnUp_Click(object sender, EventArgs e)
        {
            if (ListView.SelectedIndices.Count > 0)
            {
                int index=ListView.SelectedIndices[0];
                if ( index> 0)
                {
                    ListViewItem upitem = new ListViewItem();
                    ListViewItem dwitem = new ListViewItem();
                    upitem = (ListViewItem)ListView.Items[index - 1].Clone();
                    dwitem = (ListViewItem)ListView.Items[index].Clone();
                    ListView.Items.RemoveAt(index - 1);
                    ListView.Items.Insert(index - 1, dwitem);
                    ListView.Items.RemoveAt(index);
                    ListView.Items.Insert(index, upitem);
                }
                ListView.Refresh();
            }
        }


        private void btnDown_Click(object sender, EventArgs e)
        {
            if (ListView.SelectedIndices.Count > 0)
            {
                int index = ListView.SelectedIndices[0];
                if (index<ListView.Items.Count-1)
                {
                    ListViewItem upitem = new ListViewItem();
                    ListViewItem dwitem = new ListViewItem();
                    upitem = (ListViewItem)ListView.Items[index].Clone();
                    dwitem = (ListViewItem)ListView.Items[index+1].Clone();
                    ListView.Items.RemoveAt(index);
                    ListView.Items.Insert(index, dwitem);
                    ListView.Items.RemoveAt(index+1);
                    ListView.Items.Insert(index+1, upitem);
                }
                ListView.Refresh();
            }
        }
    }
}

0 0
原创粉丝点击