supermap iobjects学习——workspace,WorkspaceControl,控件交互

工作空间(Workspace)是SuperMap中的一个重要的概念,工作空间存储了一个工程项目中所有的数据源,地图的组织关系,工作空间通过其中的数据源集合对象( Datasources),地图集合对象( Maps)来管理其下的数据源和地图。

工作空间中的数据源集合( Datasources)只存储数据源的连接信息和位置等,实际的数据源都存储在数据库或者UDB中。

工作空间中的地图集合( Maps)中存储的是地图的配置信息,如地图包含图层的个数,图层引用的数据集,地图范围,背景风格等。

在当前版本中,一个应用程序中允许多个工作空间共存,每个工作空间可以管理自己的一套数据源和地图等。不同的工作空间不可相互操作。

注意:当用户使用该工作空间对象进行编程时,如果将Workspace与 MapControl建立了关联,那么在进行对象的关闭时,一定需要注意关闭的顺序,如下:

1、 关闭map 对象;

2、 关闭MapControl对象;

3、 关闭Workspace对象。

以下代码示范如何打开工作空间,从工作空间中取数据源,从数据源取数据集,查看数据集的描述信息以及如何保存或另存工作空间。

public void OpenWorkspace()
{
    // 打开工作空间,取出工作空间中名为“World”的数据集,查询其描述信息
    Workspace workspace = new Workspace();
    WorkspaceConnectionInfo workspaceConnectionInfo = new WorkspaceConnectionInfo();
    workspaceConnectionInfo.Type=WorkspaceType.SXWU;
    String file = @"D:\world\world.sxwu";
    workspaceConnectionInfo.Server=file;
    workspace.Open(workspaceConnectionInfo);
    Datasource datasource = workspace.Datasources[0];
    DatasetVector dataset = (DatasetVector) datasource.Datasets["World"];
    Console.WriteLine("数据集的描述信息为:"+dataset.Description);

    // 保存工作空间
    workspace.Save();
    // 另存工作空间
    String file_saveAs = "D:/world/world_saveAs.sxwu";
    WorkspaceConnectionInfo workspaceConnectionInfo_saveAs = new WorkspaceConnectionInfo(file_saveAs);
    if (workspace.SaveAs(workspaceConnectionInfo_saveAs))
    {
        Console.WriteLine("另存工作空间成功!");
    }

    // 释放资源
    dataset.Close();
    workspaceConnectionInfo.Dispose();
    workspaceConnectionInfo_saveAs.Dispose();
    workspace.Close();
    workspace.Dispose();
}



实现目标:通过工作空间管理器打开工作空间,双击节点打开场景,并且在layercontrol里面关联。

using SuperMap.Data;
using SuperMap.Mapping;
using SuperMap.Realspace;
using SuperMap.UI;

首先要动态生成工作空间管理器,场景管理器,图层管理器

        private Workspace m_workspace;
        private WorkspaceControl m_workspaceControl;
        private SceneControl m_scenecontrol;
        private LayersControl m_layerscontrol;
private void Initialize()
        {
            //初始化组件,form生成的时间调用该方法动态生成组件
            m_workspace = new Workspace();
            //groupcontrol是form里的容器
            m_workspaceControl = new WorkspaceControl(m_workspace);
            m_workspaceControl.Dock = DockStyle.Fill;
            groupControl1.Controls.Add(m_workspaceControl);

            m_layerscontrol = new LayersControl();
            m_layerscontrol.Dock = DockStyle.Fill;
            groupControl2.Controls.Add(m_layerscontrol);

            m_scenecontrol = new SceneControl();
            m_scenecontrol.Action = Action3D.Pan;
            m_scenecontrol.Dock = DockStyle.Fill;
            groupControl3.Controls.Add(m_scenecontrol);
            //初始化自定义的方法
            m_run = new Run(m_workspaceControl , m_layerscontrol , m_scenecontrol);


        }
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            //定义关闭窗体时释放资源,要注意顺序,先关闭map再关闭mapcontrol,scenecontrol之类,最后关闭workspace
            if (m_scenecontrol != null)
            {
                m_scenecontrol.Dispose();
            }
            m_workspaceControl.Dispose();
            m_layerscontrol.Dispose();
            m_workspace.Dispose();
        }

然后弄了个button来打开工作空间文件

WorkspaceConnectionInfo 类 是工作空间连接信息类。

包括了工作空间连接的所有信息,如所要连接的服务器名称,数据库名称,用户名,密码等。

private void Open_Click(object sender, EventArgs e)
        {
            //打开工作空间
            try
            {String m_StrFilter = "工作空间文件(*.smw;*.sxw;*.smwu;*.sxwu)|*.smw;*.sxw;*.smwu;*.sxwu";
                OpenFileDialog openWorkSpace = new OpenFileDialog();
                openWorkSpace.Filter = m_StrFilter;
                openWorkSpace.FilterIndex = 0;
                String WorkspacePath;
                if (openWorkSpace.ShowDialog() == DialogResult.OK)
                {
                    WorkspacePath = openWorkSpace.FileName;
                    WorkspaceConnectionInfo workspaceConnectionInfo = new WorkspaceConnectionInfo(@WorkspacePath);
                    m_workspace.Open(workspaceConnectionInfo);
                }
            }
            catch (Exception exception) { MessageBox.Show(exception.ToString()); }
        }

最后写了个Run类,作用是绑定节点双击事件,实现双击工作空间树的节点判断节点类型,然后取得符合的节点打开至场景scene和图层管理器中

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using SuperMap.Data;
using SuperMap.Mapping;
using SuperMap.Realspace;
using System.Diagnostics;
using SuperMap.UI;

namespace 三维测试
{
    class Run
    {
        private WorkspaceControl m_workspaceControl;
        private LayersControl m_layersControl;
        private Workspace m_workspace;
        private SceneControl m_sceneControl;


        public Run(WorkspaceControl wscon,LayersControl lc,SceneControl sc)
        {
            m_workspaceControl = wscon;
            m_workspace = wscon.WorkspaceTree.Workspace;
            m_layersControl = lc;
            m_sceneControl = sc;

            Initialize();
        }

        private void Initialize() 
        {
            //为工作空间管理器绑定节点双击事件
            m_workspaceControl.WorkspaceTree.NodeMouseDoubleClick += new TreeNodeMouseClickEventHandler(WorkspaceTree_NodeMouseDoubleClick);
            
            m_sceneControl.Scene.Workspace = m_workspace;

            m_layersControl.Scene = m_sceneControl.Scene;

        }

        private void WorkspaceTree_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            FreshData();
        }

        private void FreshData()
        {
            //工作空间控件树节点基类,获取树中选中的节点
            WorkspaceTreeNodeBase node = m_workspaceControl.WorkspaceTree.SelectedNode as WorkspaceTreeNodeBase;
            //获取选中的节点种类,数据源(矢量,栅格),场景
            WorkspaceTreeNodeDataType type = node.NodeType;
            //位运算,如果type是WorkspaceTreeNodeDataType.Dataset这个类型,并且不是unknown,就赋值,否则跳过if
            if ((type & WorkspaceTreeNodeDataType.Dataset) != WorkspaceTreeNodeDataType.Unknown)
            {
                type = WorkspaceTreeNodeDataType.Dataset;
            }
            switch (type)
            {
                case WorkspaceTreeNodeDataType.Dataset:
                    {
                        
                    }
                    break;
                case WorkspaceTreeNodeDataType.SceneName:
                    {
                        String sceneName = node.GetData() as String;
                        if (m_layersControl.Scene != null)
                        {
                            m_layersControl.Scene.Open(sceneName);
                            m_sceneControl.Scene.Refresh();
                        }
                    }
                    break;
            }

        }
    }
}


  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值