zoukankan      html  css  js  c++  java
  • c#+arcAE对图层进行各种渲染操作

    转载:http://blog.sina.com.cn/s/blog_6023833e0100t5t0.html

    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.DataSourcesFile;
    using ESRI.ArcGIS.Display;

    namespace lesson3
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void Form1_Load(object sender, EventArgs e)
            {
                loadMapDocument();
            }
            //加载地图文档
            private void loadMapDocument()
            {
                System.Windows.Forms.OpenFileDialog openFileDialog;
                openFileDialog = new OpenFileDialog();
                openFileDialog.Title = "打开地图文档";
                openFileDialog.Filter = "map documents(*.mxd)|*.mxd";
                openFileDialog.ShowDialog();
                string filePath = openFileDialog.FileName;
                if (axMapControl1.CheckMxFile(filePath))
                {
                    axMapControl1.MousePointer = esriControlsMousePointer.esriPointerHourglass;
                    axMapControl1.LoadMxFile(filePath, 0, Type.Missing);
                    axMapControl1.MousePointer = esriControlsMousePointer.esriPointerDefault;
                }
                else
                {
                    MessageBox.Show(filePath + "不是有效的地图文档");
                }
            }
                    //获取颜色对象
            private IRgbColor getRGB(int r, int g, int b)
            {
                IRgbColor pColor;
                pColor = new RgbColorClass();
                pColor.Red = r;
                pColor.Green = g;
                pColor.Blue = b;
                return pColor;
            }
            private IGeoFeatureLayer getGeoLayer(string layerName)
            {
                ILayer layer;
                IGeoFeatureLayer geoFeatureLayer ;
                for (int i = 0; i < this.axMapControl1.LayerCount; i++)
                {
                    layer = this.axMapControl1.get_Layer(i);
                    if (layer != null && layer.Name == layerName)
                    {
                        geoFeatureLayer = layer as IGeoFeatureLayer ;
                        return geoFeatureLayer;
                    }
                }
                return null;
            }
            //简单渲染专题图
            private void button1_Click(object sender, EventArgs e)
            {
                //简单填充符号
                ISimpleFillSymbol simpleFillSymbol = new SimpleFillSymbolClass();
                simpleFillSymbol.Style = esriSimpleFillStyle.esriSFSDiagonalCross;
                simpleFillSymbol.Color = getRGB(255, 0, 0);
                //创建边线符号
                ISimpleLineSymbol simpleLineSymbol = new SimpleLineSymbolClass();
                simpleLineSymbol.Style = esriSimpleLineStyle.esriSLSDashDotDot;
                simpleLineSymbol.Color = getRGB(0, 255, 0);
                ISymbol symbol = simpleLineSymbol as ISymbol;
                symbol.ROP2 = esriRasterOpCode.esriROPNotXOrPen;
                simpleFillSymbol.Outline = simpleLineSymbol;

                ISimpleRenderer simpleRender =new SimpleRendererClass ();
                simpleRender .Symbol =simpleFillSymbol as ISymbol  ;
                simpleRender.Label ="continent";
                simpleRender.Description ="简单渲染";

                IGeoFeatureLayer geoFeatureLayer;
                geoFeatureLayer = getGeoLayer("Continents");
                if (geoFeatureLayer != null)
                {
                    geoFeatureLayer.Renderer = simpleRender as IFeatureRenderer ;
                }
                this.axMapControl1.Refresh();
            }
            //创建颜色带
            private IColorRamp CreateAlgorithmicColorRamp(int count )
            {
                //创建一个新AlgorithmicColorRampClass对象
                IAlgorithmicColorRamp algColorRamp = new AlgorithmicColorRampClass();
                IRgbColor fromColor = new RgbColorClass();
                IRgbColor toColor = new RgbColorClass();
                //创建起始颜色对象
                fromColor.Red = 255;
                fromColor.Green = 0;
                fromColor.Blue = 0;
                //创建终止颜色对象          
                toColor.Red = 0;
                toColor.Green = 0;
                toColor.Blue = 255;
                //设置AlgorithmicColorRampClass的起止颜色属性
                algColorRamp.ToColor = fromColor;
                algColorRamp.FromColor = toColor;
                //设置梯度类型
                algColorRamp.Algorithm = esriColorRampAlgorithm.esriCIELabAlgorithm;
                //设置颜色带颜色数量
                algColorRamp.Size = count ;
                //创建颜色带
                bool bture = true;
                algColorRamp.CreateRamp(out bture);
                return algColorRamp;

            }
            //分级专题图
            private void button2_Click(object sender, EventArgs e)
            {
                int classCount = 6;
                ITableHistogram tableHistogram;
                IBasicHistogram basicHistogram;
                ITable table;           
                IGeoFeatureLayer geoFeatureLayer;
                geoFeatureLayer = getGeoLayer("Continents");
                ILayer layer = geoFeatureLayer as ILayer;
                table = layer as ITable;
                tableHistogram =new BasicTableHistogramClass ();
                 //按照 数值字段分级
                tableHistogram.Table =table ;
                tableHistogram.Field ="sqmi";
                basicHistogram =tableHistogram as IBasicHistogram ;
                object   values;
                object   frequencys;
                //先统计每个值和各个值出现的次数
                basicHistogram.GetHistogram (out values ,out frequencys );
                //创建平均分级对象
                IClassifyGEN classifyGEN =new QuantileClass ();
                //用统计结果进行分级 ,级别数目为classCount
                classifyGEN.Classify (values ,frequencys , ref classCount );
                //获得分级结果,是个 双精度类型数组
                double [] classes;
                classes=classifyGEN.ClassBreaks as double [];

                IEnumColors enumColors = CreateAlgorithmicColorRamp(classes.Length ).Colors;
                IColor color;
              
                IClassBreaksRenderer classBreaksRenderer = new ClassBreaksRendererClass();
                classBreaksRenderer.Field = "sqmi";
                classBreaksRenderer.BreakCount = classCount;
                classBreaksRenderer.SortClassesAscending = true;

                ISimpleFillSymbol  simpleFillSymbol;
                for (int i = 0; i < classes.Length-1 ; i++)
                {
                    color = enumColors.Next();
                    simpleFillSymbol = new  SimpleFillSymbolClass ();
                    simpleFillSymbol.Color = color;
                    simpleFillSymbol.Style = esriSimpleFillStyle.esriSFSSolid;

                    classBreaksRenderer.set_Symbol(i, simpleFillSymbol as ISymbol);
                    classBreaksRenderer.set_Break(i, classes[i]);          
                 
                }
             
                if (geoFeatureLayer != null)
                {
                    geoFeatureLayer.Renderer = classBreaksRenderer as IFeatureRenderer;
                }
              
                this.axMapControl1.ActiveView.Refresh();        
            }
            //单一值专题图
            private void button3_Click(object sender, EventArgs e)
            {
                IGeoFeatureLayer geoFeatureLayer;
                geoFeatureLayer = getGeoLayer("Continents");
                IUniqueValueRenderer uniqueValueRenderer =new UniqueValueRendererClass ();
                uniqueValueRenderer.FieldCount =1;
                uniqueValueRenderer.set_Field (0,"continent");

                 //简单填充符号
                ISimpleFillSymbol simpleFillSymbol = new SimpleFillSymbolClass();
                simpleFillSymbol.Style = esriSimpleFillStyle.esriSFSSolid ;          

                IFeatureCursor featureCursor = geoFeatureLayer.FeatureClass.Search(null, false);
                IFeature feature;
               
                if (featureCursor != null)
                {
                    IEnumColors enumColors = CreateAlgorithmicColorRamp(8).Colors;
                    int fieldIndex =geoFeatureLayer.FeatureClass.Fields.FindField ("continent");
                    for (int i = 0; i <8; i++)
                    {
                        feature = featureCursor.NextFeature();
                        string nameValue = feature.get_Value(fieldIndex).ToString ();
                        simpleFillSymbol = new SimpleFillSymbolClass();                  
                        simpleFillSymbol.Color = enumColors.Next();                  
                        uniqueValueRenderer.AddValue(nameValue, "continent", simpleFillSymbol as ISymbol);
                    }
                }
               
                geoFeatureLayer.Renderer = uniqueValueRenderer as IFeatureRenderer;
                this.axMapControl1.Refresh();
            }
            //ProportionalSymbolRenderer
            private void button4_Click(object sender, EventArgs e)
            {

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

                geoFeatureLayer = getGeoLayer("Continents");
                featureLayer =geoFeatureLayer as IFeatureLayer ;
                table =geoFeatureLayer as ITable ;
                cursor =table.Search (null,true );
                dataStatistics =new DataStatisticsClass ();
                dataStatistics.Cursor =cursor ;
                dataStatistics.Field ="sqmi";
                statisticsResult =dataStatistics.Statistics ;
                if (statisticsResult !=null)
                {
                    IFillSymbol  fillSymbol =new SimpleFillSymbolClass ();
                    fillSymbol.Color =getRGB (0,255,0);
                    ICharacterMarkerSymbol characterMarkerSymbol=new CharacterMarkerSymbolClass ();
                    fontDisp =new stdole.StdFontClass () as stdole.IFontDisp ;
                    fontDisp.Name ="arial";
                    fontDisp.Size =20;
                    characterMarkerSymbol.Font =fontDisp ;
                    characterMarkerSymbol.CharacterIndex =90;
                    characterMarkerSymbol.Color =getRGB (255,0,0);
                    characterMarkerSymbol.Size =8;
                    proportionalSymbolRenderer=new ProportionalSymbolRendererClass ();
                    proportionalSymbolRenderer.ValueUnit =esriUnits.esriUnknownUnits;
                    proportionalSymbolRenderer .Field ="sqmi";
                    proportionalSymbolRenderer.FlanneryCompensation =false ;
                    proportionalSymbolRenderer.MinDataValue =statisticsResult.Minimum ;
                    proportionalSymbolRenderer.MaxDataValue =statisticsResult.Maximum ;
                    proportionalSymbolRenderer.BackgroundSymbol =fillSymbol ;
                    proportionalSymbolRenderer.MinSymbol =characterMarkerSymbol as ISymbol ;
                    proportionalSymbolRenderer.LegendSymbolCount =10;
                    proportionalSymbolRenderer.CreateLegendSymbols ();
                    geoFeatureLayer.Renderer =proportionalSymbolRenderer as IFeatureRenderer ;
                }
                this.axMapControl1.Refresh();
            }
            //BarChartSymbol
            private void button5_Click(object sender, EventArgs e)
            {
                IGeoFeatureLayer geoFeatureLayer ;
                IFeatureLayer featureLayer ;
                ITable table ;
                ICursor cursor;
                IRowBuffer rowBuffer;
                //设置渲染要素
                string field1="sqmi";
                string field2="sqkm";
                //获取渲染图层
                geoFeatureLayer = getGeoLayer("Continents");
                featureLayer =geoFeatureLayer as IFeatureLayer ;
                table =featureLayer as ITable ;
                geoFeatureLayer.ScaleSymbols =true;
                IChartRenderer chartRenderer =new ChartRendererClass ();
                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 =new BarChartSymbolClass ();
                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 SimpleFillSymbolClass ();
                fillSymbol.Color =getRGB (255,0,0);
                symbolArray.AddSymbol (fillSymbol as ISymbol );
                fillSymbol =new SimpleFillSymbolClass ();
                fillSymbol .Color =getRGB (0,255,0);
                symbolArray .AddSymbol (fillSymbol as ISymbol );
                //设置柱状图符号
                chartRenderer.ChartSymbol =barChartSymbol as IChartSymbol ;
                fillSymbol =new SimpleFillSymbolClass ();
                fillSymbol.Color =getRGB (0,0,255);
                chartRenderer.BaseSymbol =fillSymbol as ISymbol ;
                chartRenderer.UseOverposter =false ;
                //创建图例
                chartRenderer.CreateLegend ();
                geoFeatureLayer.Renderer =chartRenderer as IFeatureRenderer ;
                this.axMapControl1.Refresh();
            }
            //StackedChartSymbol
            private void button6_Click(object sender, EventArgs e)
            {
                IGeoFeatureLayer geoFeatureLayer;
                IFeatureLayer featureLayer;
                ITable table;
                ICursor cursor;
                IRowBuffer rowBuffer;
                //设置渲染要素
                string field1 = "sqmi";
                string field2 = "sqkm";
                //获取渲染图层
                geoFeatureLayer = getGeoLayer("Continents");
                featureLayer = geoFeatureLayer as IFeatureLayer;
                table = featureLayer as ITable;
                geoFeatureLayer.ScaleSymbols = true;
                IChartRenderer chartRenderer = new ChartRendererClass();
                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 = new StackedChartSymbolClass();
              
                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 SimpleFillSymbolClass();
                fillSymbol.Color = getRGB(255, 0, 0);
                symbolArray.AddSymbol(fillSymbol as ISymbol);
                fillSymbol = new SimpleFillSymbolClass();
                fillSymbol.Color = getRGB(0, 255, 0);
                symbolArray.AddSymbol(fillSymbol as ISymbol);
                //设置柱状图符号
                chartRenderer.ChartSymbol = stackedChartSymbol as IChartSymbol;
                fillSymbol = new SimpleFillSymbolClass();
                fillSymbol.Color = getRGB(0, 0, 255);
                chartRenderer.BaseSymbol = fillSymbol as ISymbol;
                chartRenderer.UseOverposter = false;
                //创建图例
                chartRenderer.CreateLegend();
                geoFeatureLayer.Renderer = chartRenderer as IFeatureRenderer;
                this.axMapControl1.Refresh();
            }
            //PieChartRenderer
            private void button7_Click(object sender, EventArgs e)
            {
                IGeoFeatureLayer geoFeatureLayer;
                IFeatureLayer featureLayer;
                ITable table;
                ICursor cursor;
                IRowBuffer rowBuffer;
                //设置饼图的要素
                string field1 = "sqmi";
                string field2 = "sqkm";
                //获取渲染图层
                geoFeatureLayer = getGeoLayer("Continents");
                featureLayer = geoFeatureLayer as IFeatureLayer;
                table = featureLayer as ITable;
                geoFeatureLayer.ScaleSymbols = true;
                IChartRenderer chartRenderer = new ChartRendererClass();
                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 =new PieChartSymbolClass ();
                pieChartSymbol.Clockwise =true ;
                pieChartSymbol.UseOutline =true ;
                IChartSymbol chartSymbol =pieChartSymbol as IChartSymbol ;
                chartSymbol.MaxValue =maxValue ;
                ILineSymbol lineSymbol =new SimpleLineSymbolClass ();
                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 SimpleFillSymbolClass ();
                fillSymbol.Color =getRGB (0,255,0);
                symbolArray.AddSymbol (fillSymbol as ISymbol  );
                fillSymbol =new SimpleFillSymbolClass ();
                fillSymbol .Color=getRGB  (0,0,255);
                symbolArray.AddSymbol (fillSymbol as ISymbol );
                chartRenderer.ChartSymbol =pieChartSymbol as IChartSymbol  ;
                fillSymbol=new SimpleFillSymbolClass ();
                fillSymbol.Color =getRGB (100,100,100);
                chartRenderer.BaseSymbol =fillSymbol as ISymbol ;
                chartRenderer.UseOverposter =false ;
                //创建图例
                chartRenderer.CreateLegend ();
                geoFeatureLayer.Renderer =chartRenderer as IFeatureRenderer ;
                this.axMapControl1.Refresh ();

            }
            //DotDensityFillSymbol
            private void button8_Click(object sender, EventArgs e)
            {
                IGeoFeatureLayer geoFeatureLayer ;
                IDotDensityFillSymbol dotDensityFillSymbol;
                IDotDensityRenderer dotDensityRenderer ;
                //获取渲染图层
                geoFeatureLayer = getGeoLayer("Continents");
                dotDensityRenderer=new DotDensityRendererClass ();
                IRendererFields rendererFields =dotDensityRenderer as IRendererFields ;
                //设置渲染字段
                string field1="sqmi";
                rendererFields.AddField (field1 ,field1 );
                //设置填充颜色和背景色
                dotDensityFillSymbol =new DotDensityFillSymbolClass ();
                dotDensityFillSymbol.DotSize =3;
                dotDensityFillSymbol.Color =getRGB (255,0,0);
                dotDensityFillSymbol.BackgroundColor =getRGB (0,255,0);
                //设置渲染符号
                ISymbolArray symbolArray =dotDensityFillSymbol as ISymbolArray ;
                ISimpleMarkerSymbol simpleMarkerSymbol =new SimpleMarkerSymbolClass ();
                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 ;
                this.axMapControl1.Refresh ();
            }
        }
    }

  • 相关阅读:
    HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别(转)
    JSP语法
    Web开发基础(读书笔记)
    eclispe新导入的文件有个小红叉号(x)的问题
    Vue处理数据,数组更新,但视图无法得到及时更新
    VUE 利用tab切换+同路由跳转传参(check)+vant上拉加载制作订单列表(终)
    适配方案一之:利用rem和less计算制作移动端适配页面
    Git常用命令务忘
    git提交代码步骤笔记
    Vue仿淘宝订单状态的tab切换效果——(但现实中不会用此种方式进行存储数据)
  • 原文地址:https://www.cnblogs.com/mingjiatang/p/3782516.html
Copyright © 2011-2022 走看看