SuperMap iObjects .NET 11i二次开发(五)——小白进阶之有关数据集操作

前言

上一篇博文简单介绍了有关于数据源的操作,这个部分主要认识下有关数据集的相关操作。


数据集集合(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关于数据集相关操作的一些过程记录,我们下篇博文再见!

  • 19
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值