此文是用.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<ColorGradientType> 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);
}
/// <summary>
/// 窗体加载事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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<ColorGradientType>();
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<ThemeUniqueItem> objThemeUniqueItem = new List<ThemeUniqueItem>();
//删除的单值专题图集合
List<ThemeUniqueItem> objDeleteThemeUniqueItem = new List<ThemeUniqueItem>();
List<string> list = new List<string>();
/// <summary>
/// 单值绑定方法
/// </summary>
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);
}
}
}
/// <summary>
/// 单元格单击事件 此事件主要针对专题图的显示和隐藏进行操作
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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;
}
}
}
/// <summary>
/// 单元格双击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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);
}
}
}
}
/// <summary>
/// 根据数据集类型获取符号库的类型
/// </summary>
/// <param name="datasetType">数据集类型</param>
/// <returns>返回符号库类型</returns>
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;
}
/// <summary>
///获取列表中显示的图片 设置默认值并在列表中显示
/// </summary>
/// <param name="P"></param>
/// <param name="geostyle1"></param>
/// <returns></returns>
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;
}
/// <summary>
/// 设置符号样式
/// </summary>
/// <param name="P"></param>
/// <param name="c"></param>
/// <returns></returns>
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绘制
/// <summary>
/// 绘制符号转换为图片
/// 我去。。。
/// </summary>
/// <param name="symbol"></param>
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();
}
}
/// <summary>
/// 取消
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BtnCancle_Click(object sender, EventArgs e)
{
this.Close();
}
private void btnAddValue_Click(object sender, EventArgs e)
{
showDZinformation();
}
/// <summary>
/// 添加子项
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnAddChild_Click(object sender, EventArgs e)
{
changeUniqueItem showChage = new changeUniqueItem(objDeleteThemeUniqueItem, objThemeUniqueItem,dataGridView2,this);
showChage.ShowDialog();
}
/// <summary>
/// 添加值
/// </summary>
/// <param name="num"></param>
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);
}
}
/// <summary>
/// 删除子项
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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);
}
}
}
}