超图举例单值专题图色带样式控制


此文是用.NET Iobject 7c 下利用vs2010开发的winform版 单值专题图的创建及色带的修改。在此记下来以便后期参考(可能很快就会被淹没,超图的更新换代很快)

  初期由于不知道样式的承载控件应该选择那个,测试过listview、listbox,但是效果都不满意,偶然间查到datagridview可以更好的充当这个角色,展示效果做好肯定就要配套的修改功能了,这个修改我咨询过客服,客服说在修改方面,只是给了一个样式修改的接口,我测试过对修改对象进行清空,赋值都不行,对象和地图展示的关联较强;

在测试中发现,若是对专题图对象删除再次添加,所添加的名称和删除图层的名称保持不变,最后只能曲线的进行对图层的删除和重新添加,

----》 第一个窗体为主窗体展示,最后一个窗体为增删值做准备

说明:1 下拉框根据单值的条件筛选填入字段名称

   2 承载数据的控件时datagridview,需要把该控件的列指定特定的值 如图 2 

     3  按钮--添加所有值就是重新根据条件进行读取一次数据并展示出来

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SuperMap.Mapping;
using SuperMap.Data;
using SuperMap.UI;
using soTest.ThematicMap;

namespace SuperMap.SampleCode.Mapping
{
    public partial class frmThemeUnique : Form
    {
        Workspace m_workspace;
        List setColorTheml = null;
        Dataset objLayer = null;
        ThemeUnique objThemeUnique = null;
        MapControl objMapControl = null;
        public frmThemeUnique(Workspace m_workspace, Dataset layer, ThemeUnique objThemeUnique,MapControl objMapControl)
        {
            InitializeComponent();
            this.m_workspace = m_workspace;
            this.objLayer = layer;
            this.objThemeUnique = objThemeUnique;
            this.objMapControl = objMapControl;
            dataGridView2.CellMouseClick += new DataGridViewCellMouseEventHandler(dataGridView2_CellMouseClick);
            dataGridView2.CellMouseDoubleClick += new DataGridViewCellMouseEventHandler(dataGridView2_CellMouseDoubleClick);
        }
        /// 
        /// 窗体加载事件
        /// 
        /// 
        /// 
        private void frmThemeUnique_Load(object sender, EventArgs e)
        {
            resources = m_workspace.Resources;
           // string path = Application.StartupPath.Substring(0, Application.StartupPath.LastIndexOf("CurExe"));
            //设置单值专题图数值        
            #region MyRegion            
            setColorTheml = new List();
            setColorTheml.Add(ColorGradientType.Spectrum);
            setColorTheml.Add(ColorGradientType.Terrain);
            setColorTheml.Add(ColorGradientType.GreenOrangeViolet);
            setColorTheml.Add(ColorGradientType.Rainbow);
            setColorTheml.Add(ColorGradientType.CyanGreen);
            setColorTheml.Add(ColorGradientType.CyanBlue);
            //  setColorTheml.Add("青->蓝渐变色", ColorGradientType.PinkBlue);
            setColorTheml.Add(ColorGradientType.PinkRed);
            setColorTheml.Add(ColorGradientType.BlueRed);
            setColorTheml.Add(ColorGradientType.GreenRed);
            setColorTheml.Add(ColorGradientType.GreenBlue);
            setColorTheml.Add(ColorGradientType.YellowBlue);
            setColorTheml.Add(ColorGradientType.YellowGreen);
            setColorTheml.Add(ColorGradientType.YellowRed);
            setColorTheml.Add(ColorGradientType.CyanBlack);
            setColorTheml.Add(ColorGradientType.PinkBlack);
            setColorTheml.Add(ColorGradientType.YellowBlack);
            setColorTheml.Add(ColorGradientType.BlueBlack);
            setColorTheml.Add(ColorGradientType.GreenBlack);
            setColorTheml.Add(ColorGradientType.RedBlack);
            setColorTheml.Add(ColorGradientType.CyanWhite);
            setColorTheml.Add(ColorGradientType.PinkWhite);
            setColorTheml.Add(ColorGradientType.YellowWhite);
            setColorTheml.Add(ColorGradientType.BlueWhite);
            setColorTheml.Add(ColorGradientType.GreenWhite);
            setColorTheml.Add(ColorGradientType.RedWhite);
            setColorTheml.Add(ColorGradientType.BlackWhite);
            #endregion
            dataGridView2.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            dataGridView2.AllowUserToAddRows = false;
            setDZcombox();
            if (objThemeUnique == null)
            {
                showDZinformation();
            }
            else
            {
                updateThemeUnique(objThemeUnique);
            }
           
        }

        public void updateThemeUnique(ThemeUnique objThemeUnique)
        {
          
            comboBox1.Text = objThemeUnique.UniqueExpression;         
            for (int i = 0; i < objThemeUnique.Count; i++)
            {
                objThemeUniqueItem.Add(objThemeUnique[i]);
                Image im = getImage(objLayer.Type, objThemeUnique[i].Style);
                dataGridView2.Rows.Add(true, im, objThemeUnique[i].Caption);             
            }
        }


        #region 单值专题图
        public void setDZcombox()
        {
            DatasetVector objDv = objLayer as DatasetVector;
            FieldInfos objFled = objDv.FieldInfos;
            FieldInfo objFd = null;
            for (int i = 0; i < objFled.Count; i++)
            {
                objFd = objFled[i];
                comboBox1.Items.Add(objFd.Name.Trim());
            }
            if (comboBox1.Items.Count > 0)
                comboBox1.SelectedIndex = 0;
            objFled = null;
            objDv = null;
        }
        // 设置单值专题图
        ThemeUnique themeunique = null;
        DatasetVector datasetVector = null;
        Geometry objg = null;
        Resources resources = null;
        //单只专题图子项集合
        List objThemeUniqueItem = new List();
        //删除的单值专题图集合
        List objDeleteThemeUniqueItem = new List();
        List<string> list = new List<string>();
        /// 
        /// 单值绑定方法
        /// 
        public void showDZinformation()
        {
            themeunique = new ThemeUnique();
            //清空数据
            objThemeUniqueItem.Clear();
            objDeleteThemeUniqueItem.Clear();
            list.Clear();
            //专题图清空
            themeunique.Clear();
            //列表清空
            dataGridView2.Rows.Clear();
            // 当只有普通图层时,添加专题图层
            datasetVector = objLayer as DatasetVector;
            //设置字段表达式
            themeunique.UniqueExpression = comboBox1.Text.Trim();
            Recordset objRecor = datasetVector.GetRecordset(false, CursorType.Static);
            FieldInfos objFled = datasetVector.FieldInfos;
            objRecor.MoveFirst();
            for (int j = 0; j < objRecor.RecordCount; j++)
            {
                //新建DataTable的行对象             
                if (objRecor.FieldCount == objFled.Count)
                {
                    object value = objRecor.GetFieldValue(comboBox1.SelectedIndex);
                    if (value != null)
                    {
                        if (!string.IsNullOrWhiteSpace(value.ToString().Trim()))
                        {
                            objg = objRecor.GetGeometry();
                            list.Add(value.ToString().Trim());
                        }
                    }
                }
                else
                {
                    // MessageBox.Show("字段数有问题!", "提示");
                }
                objRecor.MoveNext();//移到下个列
            }
            //释放对象
            objRecor.Dispose();
            //专题图子项
            ThemeUniqueItem objItem = null;
            GeoStyle geostyle1 = null;
            Random objRan = new Random();
            // 根据指定的渐变颜色类型,返回一个 Colors 类的对象
            //运行结果是根据指定的渐变颜色返回的4个颜色构成的颜色集合,颜色值为:
            //(R=0,G=255,B=0),(R=0,G=255,B=85),(R=0,G=255,B=170),(R=0,G=255,B=255)
            Colors colors = Colors.MakeGradient(list.Count, ColorGradientType.BlueBlack, false);
            // 得到点线面的RootGroup
            List<string> isTrueAndFalse = new List<string>();
            for (int i = 0; i < list.Count; i++)
            {
                string itemName = list[i];
                objItem = new ThemeUniqueItem();
                objItem.Caption = itemName;
                objItem.IsVisible = true;

                geostyle1 = GeoStyleSample(objLayer.Type, colors[isTrueAndFalse.Count]);// geostyle1;
                objItem.Style = geostyle1;
                objItem.Unique = itemName;
                if (!isTrueAndFalse.Contains(itemName))
                {
                    objThemeUniqueItem.Add(objItem);
                    Image im = getImage(objLayer.Type, geostyle1);
                    dataGridView2.Rows.Add(true, im, itemName);
                    isTrueAndFalse.Add(itemName);
                }
            }
        }
        /// 
        /// 单元格单击事件 此事件主要针对专题图的显示和隐藏进行操作
        /// 
        /// 
        /// 
        void dataGridView2_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (dataGridView2.Columns[e.ColumnIndex].Name.Equals("checkbox"))
            {
                bool value = (bool)dataGridView2.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
                if (value)
                {
                    dataGridView2.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = false;
                    objThemeUniqueItem[e.RowIndex].IsVisible = false;
                }
                else
                {
                    dataGridView2.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = true;
                    objThemeUniqueItem[e.RowIndex].IsVisible = true;
                }
            }
        }
       /// 
       /// 单元格双击事件
       /// 
       /// 
       /// 
        void dataGridView2_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {          
            if (dataGridView2.Columns[e.ColumnIndex].Name.Equals("imgvalue"))
            {
                //样式符号
                GeoStyle objGeoStyle = SymbolDialog.ShowDialog(m_workspace.Resources, objThemeUniqueItem[e.RowIndex].Style, GetSymbolType(objLayer.Type));
                if (objGeoStyle != null)
                {
                    //更新专题图样式
                    objThemeUniqueItem[e.RowIndex].Style = objGeoStyle;
                  
                    //更换列表中的图像
                    if (objLayer.Type == DatasetType.Point)
                    {
                        //获取符号编号
                        int num = objGeoStyle.MarkerSymbolID;
                        //加载符号库
                        SymbolLibrary symbolMarkerLibrary = resources.MarkerLibrary;
                        //拟定一个点对象
                        GeoPoint point = new GeoPoint(5, 5);
                        //获取并赋值对应的点样式
                        point.Style = objGeoStyle;
                        //从库中查找对应的点符号编号
                        Symbol symbol = symbolMarkerLibrary.FindSymbol(num);
                        //objThemeUniqueItem[e.RowIndex].Style.SetSymbolMarker(symbol as SymbolMarker);
                        dataGridView2.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = DrawSymbol(symbol, point, 20, 20);
                    }
                    else if (objLayer.Type == DatasetType.Line)
                    {
                        //获取符号编号
                        int num = objGeoStyle.LineSymbolID;
                        //加载符号库
                        SymbolLibrary symbolMarkerLibrary = resources.LineLibrary;
                        //拟定一个线对象
                        Point2Ds point2Ds = new Point2Ds();
                        point2Ds.Add(new Point2D(0, 5));
                        point2Ds.Add(new Point2D(15, 5));
                        GeoLine line = new GeoLine(point2Ds);
                        //获取并赋值对应的点样式
                        line.Style = objGeoStyle;
                        //从库中查找对应的线符号编号
                        Symbol symbol = symbolMarkerLibrary.FindSymbol(num);
                       // objThemeUniqueItem[e.RowIndex].Style.SetSymbolLine(symbol as SymbolLine);
                        dataGridView2.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = DrawSymbol(symbol, line, 20, 20);
                    }
                    else if (objLayer.Type == DatasetType.Region)
                    {
                        //获取符号编号
                        int num = objGeoStyle.FillSymbolID;
                        //加载符号库
                        SymbolLibrary symbolFillLibrary = resources.FillLibrary;
                        //拟定一个面对象
                        Point2Ds point2Ds = new Point2Ds();
                        point2Ds.Add(new Point2D(0, 0));
                        point2Ds.Add(new Point2D(0, 15));
                        point2Ds.Add(new Point2D(15, 15));
                        point2Ds.Add(new Point2D(15, 0));
                        GeoRegion region = new GeoRegion(point2Ds);
                        //获取并赋值对应的面样式
                        region.Style = objGeoStyle;
                        //从库中查找对应的点符号编号
                        Symbol symbol = symbolFillLibrary.FindSymbol(num);
                        //objThemeUniqueItem[e.RowIndex].Style.SetSymbolFill(symbol as SymbolFill);
                        dataGridView2.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = DrawSymbol(symbol, region, 20, 20);
                    }
                  
                }
              
            }
        }

        /// 
        /// 根据数据集类型获取符号库的类型
        /// 
        /// 数据集类型
        /// 返回符号库类型
        private SymbolType GetSymbolType(DatasetType datasetType)
        {
            SymbolType result = SymbolType.Marker;

            switch (datasetType)
            {
                case DatasetType.Line:
                    {
                        result = SymbolType.Line;
                    }
                    break;
                case DatasetType.Point:
                    {
                        result = SymbolType.Marker;
                    }
                    break;
                case DatasetType.Region:
                    {
                        result = SymbolType.Fill;
                    }
                    break;
                default:
                    break;
            }
            return result;
        }
        /// 
        ///获取列表中显示的图片 设置默认值并在列表中显示
        /// 
        /// 
        /// 
        /// 
        public Image getImage(DatasetType P, GeoStyle geostyle1)
        {
            Image im = null;
            if (P == DatasetType.Point)
            {
                //符号库
                SymbolLibrary symbolMarkerLibrary = resources.MarkerLibrary;
                SymbolGroup m_symbolMarkerRootGroup = symbolMarkerLibrary.RootGroup;
                GeoPoint point = new GeoPoint(5, 5);
                point.Style = geostyle1;
                Symbol symbol = null;
                if (geostyle1.MarkerSymbolID == null)
                {
                    symbol = m_symbolMarkerRootGroup[0];//symbolMarkerLibrary.FindSymbol(0);//
                }
                else {
                    symbol = m_symbolMarkerRootGroup[geostyle1.MarkerSymbolID];
                    //symbol = symbolMarkerLibrary.FindSymbol(geostyle1.MarkerSymbolID);//symbolMarkerLibrary.FindSymbol(0);//
                }             
                im = DrawSymbol(symbol, point, 20, 20);
            }
            else if (P == DatasetType.Line)
            {
                SymbolLibrary symbolLineLibrary = resources.LineLibrary;
                SymbolGroup m_symbolLineRootGroup = symbolLineLibrary.RootGroup;
                Point2Ds point2Ds = new Point2Ds();
                point2Ds.Add(new Point2D(0, 5));
                point2Ds.Add(new Point2D(15, 5));
                GeoLine line = new GeoLine(point2Ds);
                line.Style = geostyle1;
                Symbol symbol = null;
                if (geostyle1.LineSymbolID == null)
                {
                    symbol = m_symbolLineRootGroup[0];//symbolMarkerLibrary.FindSymbol(0);//
                }
                else
                {
                    symbol = m_symbolLineRootGroup[geostyle1.LineSymbolID];
                    //symbol = symbolLineLibrary.FindSymbol(geostyle1.LineSymbolID);//symbolMarkerLibrary.FindSymbol(0);//
                }              
                im = DrawSymbol(symbol, line, 20, 20);
            }
            else if (P == DatasetType.Region)
            {
                SymbolLibrary symbolFillLibrary = resources.FillLibrary;
                SymbolGroup m_symbolFillRootGroup = symbolFillLibrary.RootGroup;
                //构造点对象,由点组成面对象
                Point2Ds point2Ds = new Point2Ds();
                point2Ds.Add(new Point2D(0, 0));
                point2Ds.Add(new Point2D(0, 15));
                point2Ds.Add(new Point2D(15, 15));
                point2Ds.Add(new Point2D(15, 0));
                GeoRegion region = new GeoRegion(point2Ds);
                region.Style = geostyle1;
                Symbol symbol = null;
                if (geostyle1.FillSymbolID == null)
                {
                    symbol = m_symbolFillRootGroup[0];//symbolMarkerLibrary.FindSymbol(0);//
                }
                else
                {
                    symbol = m_symbolFillRootGroup[geostyle1.FillSymbolID];
                   // symbol = symbolFillLibrary.FindSymbol(geostyle1.FillSymbolID);//symbolMarkerLibrary.FindSymbol(0);//
                }
               // Symbol symbol = m_symbolFillRootGroup[0];//symbolFillLibrary.FindSymbol(0);//
                im = DrawSymbol(symbol, region, 20, 20);

            }
            return im;

        }
        /// 
        /// 设置符号样式
        /// 
        /// 
        /// 
        /// 
        public GeoStyle GeoStyleSample(DatasetType P, Color c)
        {
            GeoStyle objGeoStyle = new GeoStyle();
            switch (P)
            {
                case DatasetType.Point:
                    // 实例化一个点几何对象,并对其进行风格设置
                   // GeoStyle geoStyle_P = new GeoStyle();
                    objGeoStyle.LineColor = c;
                    objGeoStyle.MarkerSize = new Size2D(5, 5);
                   // geoStyle_P.MarkerSymbolID = 0;  //系统图标
                    //objGeoStyle = geoStyle_P;
                    break;
                case DatasetType.Line:
                    // 实例化一个线几何对象,并对其进行风格设置
                    //GeoStyle geoStyle_L = new GeoStyle();
                    objGeoStyle.LineColor = c;
                    //geoStyle_L.LineSymbolID = 15;
                    objGeoStyle.LineWidth = 1.0;                 
                   // objGeoStyle = geoStyle_L;
                    break;
                case DatasetType.Region:
                    // 实例化一个面几何对象,并对其进行渐变风格设置
                    //GeoStyle geoStyle_R = new GeoStyle();
                     objGeoStyle.FillBackColor = Color.White;;
                     objGeoStyle.FillForeColor = c;
                     objGeoStyle.FillBackOpaque = true;
                    // geoStyle_R.FillOpaqueRate = 50;
                   // geoStyle_R.FillSymbolID = 0;
                    //geoStyle_R.FillGradientMode = FillGradientMode.Linear;
                    //objGeoStyle = geoStyle_R;
                    break;
            }
            return objGeoStyle;
        }
        #endregion
        #region 点、线、面 datagridview绘制
        /// 
        /// 绘制符号转换为图片
        /// 我去。。。
        /// 
        /// 
        public Image DrawSymbol(Symbol symbol, Geometry geometry, Int32 width, Int32 height)
        {
            try
            {
                Bitmap bitmap = new Bitmap(width, height);
                if (symbol.Type == SymbolType.Marker)
                {
                    //geometry.Style.MarkerSymbolID = symbol.ID;                 
                    Toolkit.Draw(geometry, m_workspace.Resources, Graphics.FromImage(bitmap));
                }
                else if (symbol.Type == SymbolType.Line)
                {
                    //此句必须加上,不然在点击切换样式时无效果
                   // geometry.Style.LineSymbolID = symbol.ID;      
                    symbol.Draw(bitmap, geometry);
                  //  Toolkit.Draw(geometry, mainfrm.m_workspace.Resources, Graphics.FromImage(bitmap));
                }
                else if (symbol.Type == SymbolType.Fill)
                {
                    //geometry.Style.FillSymbolID = symbol.ID;
                    symbol.Draw(bitmap, geometry);
                  // Toolkit.Draw(geometry, mainfrm.m_workspace.Resources, Graphics.FromImage(bitmap));
                }
                Image objImage = bitmap;
                return objImage;

            }
            catch (Exception ex)
            {
                // Trace.WriteLine(ex.Message);
            }
            return null;
        }
        #endregion
        
        //确定按钮
        private void btnSure_Click(object sender, EventArgs e)
        {
            //默认的方式 预备暂时不用
            // ThemeUnique themeunique = ThemeUnique.MakeDefault(datasetVector, comboBox1.Text.Trim(), setColorTheml[comboBoxEx1.SelectedIndex]);
            // 将制作好的专题图添加到地图中显示
            if (datasetVector != null && objThemeUniqueItem.Count > 0)
            {
                for (int i = 0; i < objThemeUniqueItem.Count; i++)
                {
                    themeunique.Add(objThemeUniqueItem[i]);
                }
               // Layer sd = mainfrm.m_LayersControl.Map.Layers.FindLayer("");             
                Layer layer = objMapControl.Map.Layers.Add(datasetVector, themeunique, true);
               // m_MapControl.Map.Refresh();
                themeunique.Dispose();
                this.Close();
            }
            else {               
                 objThemeUnique.Clear();
               // mainfrm.m_LayersControl.Map.Layers.Remove()
                for (int i = 0; i < objThemeUniqueItem.Count; i++)
                {
                    objThemeUnique.Add(objThemeUniqueItem[i]);
                }
                 //objThemeUnique.FromXML(themeunique.ToXML());                
                objMapControl.Map.Refresh();               
                this.Close();
            }
        }
        /// 
        /// 取消
        /// 
        /// 
        /// 
        private void BtnCancle_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnAddValue_Click(object sender, EventArgs e)
        {
            showDZinformation();
        }
        /// 
        /// 添加子项
        /// 
        /// 
        /// 
        private void btnAddChild_Click(object sender, EventArgs e)
        {          
            changeUniqueItem showChage = new changeUniqueItem(objDeleteThemeUniqueItem, objThemeUniqueItem,dataGridView2,this);       
            showChage.ShowDialog();
        }
        /// 
        /// 添加值
        /// 
        /// 
        public void addToDataGridView(int num)
        {
            if (objDeleteThemeUniqueItem.Count > 0)
            {
                Image im = getImage(objLayer.Type, objDeleteThemeUniqueItem[num].Style);
                dataGridView2.Rows.Add(true, im, objDeleteThemeUniqueItem[num].Caption);
            }
        }
        /// 
        /// 删除子项
        /// 
        /// 
        /// 
        private void btnDeleteChild_Click(object sender, EventArgs e)
        {
            int num = dataGridView2.CurrentRow.Index;
            if (num >= 0) {
                //移除专题图               
                dataGridView2.Rows.RemoveAt(num);
                objDeleteThemeUniqueItem.Add(objThemeUniqueItem[num]);
                objThemeUniqueItem.RemoveAt(num);              
            }
        }



    }
}
主窗体代码