前言
上一篇博文简单介绍了有关于数据源的操作,这个部分主要认识下有关数据集的相关操作。
数据集集合(Datasets)提供对数据集的管理功能,如创建、删除、重命名等操作。一个数据源中所有的数据集对象都由一个数据集集合对象来管理。数据集集合可以包含一个或多种类型的数据集。
而数据集是同种类型数据的集合,比如:点数据集、线数据集。数据集类(Dataset)是所有数据集类型的基类。根据数据类型的不同,分为矢量数据集、栅格数据集和影像数据集,以及为了处理特定问题而设计的如路由数据集,网络数据集等。按照数据结构不同,SuperMap中将数据集分为如下类型:点数据集(Point)、线数据集(Line)、面数据集(Region)、纯属性数据集(Tabular)、网络数据集(Network)、复合数据集(CAD)、文本数据集(Text)、路由数据集(LineM)、影像数据集(Image)、栅格数据集(Grid),其中点数据集、线数据集、面数据集、纯属性数据集、文本数据集、复合数据集属于矢量数据集类型。
一、有关数据集常用类说明
Dataset类 | 所有数据集类型(如矢量数据集,栅格数据集等)的基类。提供各数据集共有的属性,方法和事件。 |
Datasets类 | 数据集集合类,提供对数据集的管理功能,如创建、删除、重命名等操作。一个数据源中所有的数据集对象都由一个数据集集合对象来管理。 |
DatasetVectorInfo类 | 矢量数据集信息类,包括了矢量数据集的信息,如矢量数据集的名称,数据集的类型,编码方式,是否选用文件缓存等。文件缓存只针对图幅索引而言。 |
DatasetGridInfo类 | 栅格数据集信息类,包括了返回和设置栅格数据集的相应的属性信息等,例如栅格数据集的名称、宽度、高度、像素格式、编码方式、存储分块大小和空值等。 |
二、有关数据集常用方法说明
Datasets.IsAvailableDatasetName() | 判断数据集名称在当前数据集集合中是否合法。 |
Datasets.Create() | 根据指定的数据集信息创建数据集。 |
Datasets.Delete() | 根据数据集名称或序号删除指定的数据集。 |
Datasource.CopyDataset() | 根据指定的编码类型以及字符集类型复制数据集。 |
三、界面设计
(1)创建右键菜单
和上篇博文关于数据源操作右键菜单设置过程一致,此处新建了两个右键菜单,不再过多赘述。(跳转上一篇博文)
(2)新建窗体
在解决方案资源管理器中右键单击项目,然后选择“添加” -> “窗体”。在“添加新项”对话框中,选择“Windows 窗体”模板,并为新窗体指定一个名称,然后单击“添加”按钮。
(3)设计新建窗体
打开工具箱,拖动控件,进行如下窗体设计:
四、功能实现
(1)关于新建窗体功能代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Net.Mime.MediaTypeNames;
namespace WindowsFormsApp1
{
public partial class Name : Form
{
public string text;
public Name()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
text = textBox1.Text;
if (textBox1 == null)
{
MessageBox.Show("输入名称不能为空!", "提示");
}
this.Close();
}
private void button2_Click(object sender, EventArgs e)
{
this.Close();
return;
}
}
}
(2)新建矢量点数据集
private void createPointDataset_Click(object sender, EventArgs e)
{
//从工作空间树中获取选定的节点的文本
string createpoint_Alias = this.D_workspaceControl.WorkspaceTree.SelectedNode.Text;
//根据文本获取对应的数据源
Datasource Dspointdataset = this.D_workspace.Datasources[createpoint_Alias];
//弹出一个对话框输入数据集的名称
Name name = new Name();
name.ShowDialog();
string PointDatasetName = name.text;
if (PointDatasetName == null)
{
return;
}
//判断数据集名称是否合法
bool datasetlsAvailable = Dspointdataset.Datasets.IsAvailableDatasetName(PointDatasetName);
//如果不合法则在名称后面加上"_1"
if (!datasetlsAvailable)
{
PointDatasetName = PointDatasetName + "_1";
}
//创建一个数据集信息对象,并设置数据集的名称、类型等信息
DatasetVectorInfo info = new DatasetVectorInfo();
info.Name = PointDatasetName;
info.Type = DatasetType.Point;
DatasetVector pointDataset = Dspointdataset.Datasets.Create(info);
if (pointDataset == null)
{
MessageBox.Show("创建点数据集失败!", "提示");
return;
}
//刷新工作空间树
this.D_workspaceControl.WorkspaceTree.Refresh();
}
(3) 新建矢量线数据集
private void createLineDataset_Click(object sender, EventArgs e)
{
//从工作空间树中获取选定的节点的文本
string createline_Alias = this.D_workspaceControl.WorkspaceTree.SelectedNode.Text;
//根据文本获取对应的数据源
Datasource Dslinedataset = this.D_workspace.Datasources[createline_Alias];
//弹出一个对话框输入数据集的名称
Name name = new Name();
name.ShowDialog();
string LineDatasetName = name.text;
if (LineDatasetName == null)
{
return;
}
//判断数据集名称是否合法
bool datasetlsAvailable = Dslinedataset.Datasets.IsAvailableDatasetName(LineDatasetName);
//如果不合法则在名称后面加上"_1"
if (!datasetlsAvailable)
{
LineDatasetName = LineDatasetName + "_1";
}
//创建一个数据集信息对象,并设置数据集的名称、类型等信息
DatasetVectorInfo info = new DatasetVectorInfo();
info.Name = LineDatasetName;
info.Type = DatasetType.Line;
DatasetVector lineDataset = Dslinedataset.Datasets.Create(info);
if (lineDataset == null)
{
MessageBox.Show("创建线数据集失败!", "提示");
return;
}
//刷新工作空间树
this.D_workspaceControl.WorkspaceTree.Refresh();
}
(4)新建矢量面数据集
private void createRegionDataset_Click(object sender, EventArgs e)
{
//从工作空间树中获取选定的节点的文本
string createregion_Alias = this.D_workspaceControl.WorkspaceTree.SelectedNode.Text;
//根据文本获取对应的数据源
Datasource Dsregiondataset = this.D_workspace.Datasources[createregion_Alias];
//弹出一个对话框输入数据集的名称
Name name = new Name();
name.ShowDialog();
string RegionDatasetName = name.text;
if (RegionDatasetName == null)
{
return;
}
//判断数据集名称是否合法
bool datasetlsAvailable = Dsregiondataset.Datasets.IsAvailableDatasetName(RegionDatasetName);
//如果不合法则在名称后面加上"_1"
if (!datasetlsAvailable)
{
RegionDatasetName = RegionDatasetName + "_1";
}
//创建一个数据集信息对象,并设置数据集的名称、类型等信息
DatasetVectorInfo info = new DatasetVectorInfo();
info.Name = RegionDatasetName;
info.Type = DatasetType.Region;
DatasetVector regionDataset = Dsregiondataset.Datasets.Create(info);
if (regionDataset == null)
{
MessageBox.Show("创建线数据集失败!", "提示");
return;
}
//刷新工作空间树
this.D_workspaceControl.WorkspaceTree.Refresh();
}
从以上创建点、线、面的代码不难看出,代码区别只是DatasetType的类型变换,DatasetType枚举定义了数据集类型常量,如需新建其他类型的数据集,可参考DatasetType枚举具体的成员。
(5)新建栅格数据集
private void createGridDataset_Click(object sender, EventArgs e)
{
//从工作空间树中获取选定的节点的文本
String creategrid_Alias = this.D_workspaceControl.WorkspaceTree.SelectedNode.Text;
//根据文本获取对应的数据源
Datasource Dsgriddataset = this.D_workspace.Datasources[creategrid_Alias];
//弹出一个对话框输入数据集的名称
Name name = new Name();
name.ShowDialog();
String GridDatasetName = name.text;
//判断数据集名称是否合法
bool datasetlsAvailable = Dsgriddataset.Datasets.IsAvailableDatasetName(GridDatasetName);
if (!datasetlsAvailable)
{
GridDatasetName = GridDatasetName + "_1";
}
//创建一个数据集信息对象,并设置数据集的像素分块、宽、高、无值等信息
DatasetGridInfo info = new DatasetGridInfo();
info.Name = GridDatasetName;
info.BlockSizeOption = BlockSizeOption.BS_128;
info.Height = 200;
info.Width = 200;
info.NoValue = -999;
info.PixelFormat = PixelFormat.Single;
info.EncodeType = EncodeType.SGL;
DatasetGrid gridDataset = Dsgriddataset.Datasets.Create(info);
if (gridDataset == null)
{
MessageBox.Show("创建栅格数据集失败!", "提示");
return;
}
//刷新工作空间树
this.D_workspaceControl.WorkspaceTree.Refresh();
}
(6)复制数据集
private void copyDataset_Click(object sender, EventArgs e)
{
//从工作空间树中获取选定的节点的父节点的文本
String copydataset_Alias = this.D_workspaceControl.WorkspaceTree.SelectedNode.Parent.Text;
//根据文本获取对应的数据源
Datasource dscopydataset = this.D_workspace.Datasources[copydataset_Alias];
//选定的节点的文本获取对应的数据集
Dataset selectDataset = dscopydataset.Datasets[this.D_workspaceControl.WorkspaceTree.SelectedNode.Text];
//获取一个数据源中未被使用的数据集的名称
String newName = dscopydataset.Datasets.GetAvailableDatasetName(this.D_workspaceControl.WorkspaceTree.SelectedNode.Text);
//使用获取的新名称和选定数据集的编码类型
Dataset desDataset = dscopydataset.CopyDataset(selectDataset, newName, selectDataset.EncodeType);
//刷新工作空间树
this.D_workspaceControl.WorkspaceTree.Refresh();
}
(7)删除数据集
private void deleteDataset_Click(object sender, EventArgs e)
{
//从工作空间树中获取选定的节点的父节点的文本
String deletedataset_Alias = this.D_workspaceControl.WorkspaceTree.SelectedNode.Parent.Text;
//根据文本获取对应的数据源
Datasource targetDatasource = this.D_workspace.Datasources[deletedataset_Alias];
//根据文本获取对应的数据集名称
String toDeleteDatasetName = this.D_workspaceControl.WorkspaceTree.SelectedNode.Text;
try
{
//定义图层集合
Layers Alllayers = D_mapControl.Map.Layers;
int layersCount = Alllayers.Count;
for (int i = 0; i < layersCount; i++)
{
Layer layer = Alllayers[i];
//判断数据集名称是否为即将删除的数据集名称
if (layer.Dataset.Name == toDeleteDatasetName)
{
Alllayers.Remove(layer);
layersCount--;
i--;
}
}
//根据指定的名称来删除数据集
targetDatasource.Datasets.Delete(toDeleteDatasetName);
//刷新地图控件
D_mapControl.Refresh();
//刷新工作空间树
this.D_workspaceControl.WorkspaceTree.Refresh();
//刷新图层管理器
this.D_layersControl.Refresh();
}
catch (Exception)
{
MessageBox.Show("删除数据集失败!");
}
}
五、右键菜单功能实现
在上一篇博文的基础上,添加有关于单击数据源及数据集节点代码:
//为 D_workspaceControl控件的WorkspaceTree控件的NodeMouseClick事件添加了一个名为tree_NodeMouseClick的事件处理程序
//当单击WorkspaceTree控件的节点时,将触发 tree_NodeMouseClick 事件处理程序,从而执行相关的操作或代码逻辑
this.D_workspaceControl.WorkspaceTree.NodeMouseClick += new TreeNodeMouseClickEventHandler(tree_NodeMouseClick);
private void tree_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
//单击Workspace节点时,弹出一个名为 contextMenuStrip_workspace的右键菜单,选择相应的操作。
WorkspaceTreeNodeBase treenode = e.Node as WorkspaceTreeNodeBase;
if (treenode.NodeType == WorkspaceTreeNodeDataType.Workspace)
{
treenode.ContextMenuStrip = contextMenuStrip_workspace;
}
else if(treenode.NodeType == WorkspaceTreeNodeDataType.Datasources)
{
treenode.ContextMenuStrip = contextMenuStrip_datasource;
}
else if(treenode.NodeType == WorkspaceTreeNodeDataType.Datasource)
{
treenode.ContextMenuStrip = contextMenuStrip_childdatasource;
}
//在用户右键单击数据集节点时显示特定的上下文菜单选项
this.D_workspaceControl.WorkspaceTree.NodeContextMenuStrips[WorkspaceTreeNodeDataType.Dataset] = contextMenuStrip_dataset;
}
六、运行结果
总结
以上就是有关于SuperMap iObjects 11i .NET关于数据集相关操作的一些过程记录,我们下篇博文再见!