前言
上一篇博文简单介绍了有关于文件型工作空间的操作,这个部分主要认识下有关数据源操作。
数据源集合(Datasources):对数据源进行管理,包括创建、打开、关闭数据源等功能。可以同时管理多种类型的数据源(UDB/UDBX、Oracle、SQL Server、PostgreSQL 等数据源),即在一个数据源集合对象中可以同时包括各种类型的数据源。实现了对数据源的无缝管理。在当前版本中,数据源集合支持多线程访问。一个工作空间中的数据源均由数据源集合管理。在创建数据源时,需要注意数据源的类型以及对应的数据引擎。
数据源(Datasource):是存储空间数据的场所,所有的空间数据都是存储于数据源而不是工作空间,任何对空间数据的操作都需要打开或获取数据源,数据源可以管理数据源与文件或数据库的连接、数据源的投影等信息。一个数据源对应着一种数据引擎。SuperMap 产品中提供了多种数据源类型,分为文件型数据源、数据库型数据源和 Web 数据源。如UDB/UDBX 数据源属于文件型数据源,Oracle、SQL Server、PostgreSQL等 数据源属于数据库型数据源;OGC、GoogleMaps、超图云服务、REST 地图服务和天地图地图服务数据源属于 Web 数据源。数据源只是定义了一致的数据访问接口和规范,并没有定义数据源的存储细节。数据源的物理存储既可以是文件方式的,也可以是数据库方式的,区别不同的存储方式主要在于采用的数据引擎类型,采用 UDB/UDBX 引擎时,数据源就以文件方式存储,而采用空间数据库引擎时,数据源被存储到指定的数据库中。数据源对象通常是作为工作空间中数据源集合中的一个元素,可以对数据源进行保存操作、对数据集进行复制操作。
一、有关数据源常用类说明
Datasources类 | 数据源的集合类,提供数据源进行管理,包括创建、打开、关闭数据源等功能。 |
Datasource类 | 数据源类,该类管理投影信息、数据源与数据库的连接信息和对其中的数据集的相关操作,如通过已有数据集复制生成新的数据集等。 |
DatasourceConnectionInfo类 | 数据源连接信息类,包括了进行数据源连接的所有信息,如所要连接的服务器名称,数据库名称、用户名、密码等。当保存工作空间时,工作空间中的数据源的连接信息都将存储到工作空间文件中。 |
二、有关数据源常用方法说明
Datasources.Open() | 根据指定的连接信息打开已经存在的数据源,指定数据源不存在时返回 Null。 |
Datasources.Create() | 根据指定的连接信息创建数据源,如果待创建的数据源已经存在则返回 null。 |
Datasource.Close() | 关闭当前数据源。 |
三、界面设计
(1)创建菜单
在上一篇博客的界面设计基础上,在MenuStrip控件中创建有关于数据源操作的菜单,如下图所示:
(2)创建右键菜单
和上篇博文关于工作空间操作右键菜单设置过程一致,此处不再过多赘述。(跳转至上一篇博文)
四、菜单栏功能实现
(1)新建文件型数据源
private void CreateDatasource_Click(object sender, EventArgs e)
{
SaveFileDialog saveFileDialog1 = new SaveFileDialog();
saveFileDialog1.Title = "新建文件型数据源";
saveFileDialog1.CheckPathExists = true;
saveFileDialog1.AddExtension = true;
saveFileDialog1.Filter = "SuperMap UDB文件(*.udb)|*.udb|SuperMap UDBX文件(*.udbx)|*.udbx";
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
//获取文件名并且去掉文件扩展名
String name = Path.GetFileNameWithoutExtension(saveFileDialog1.FileName);
for (int i = 0; i < D_workspace.Datasources.Count; i++)
{
//比较字符串"name"和数据源的别名是否相等
bool test = (String.Compare(name, D_workspace.Datasources[i].Alias) == 0);
if (test)
{
MessageBox.Show("指定数据源名称已存在!");
return;
}
}
//DatasourceConnectionInfo 构造函数(String, String, String)
DatasourceConnectionInfo dsconInfo = new DatasourceConnectionInfo(name, name, "");
//设置UDB文件的绝对路径,当绝对路径的长度超过 UTF-8 编码格式的260字节长度,该数据源无法打开
dsconInfo.Server = saveFileDialog1.FileName;
// 根据文件的扩展名来确定使用的引擎类型
if (Path.GetExtension(saveFileDialog1.FileName) == ".udb")
{
dsconInfo.EngineType = EngineType.UDB;
}
else
{
dsconInfo.EngineType = EngineType.UDBX;
}
//根据指定的数据源连接信息创建数据源
D_workspace.Datasources.Create(dsconInfo);
}
}
(2)打开文件型数据源
private void OpenFileDatasource_Click(object sender, EventArgs e)
{
if (D_workspace != null)
{
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.Filter = "SuperMap UDB文件(*.udb)|*.udb|SuperMap UDBX文件(*.udbx)|*.udbx";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
DatasourceConnectionInfo dsconInfo = new DatasourceConnectionInfo();
dsconInfo.Server = openFileDialog1.FileName;
dsconInfo.Alias = System.IO.Path.GetFileNameWithoutExtension(openFileDialog1.FileName);
bool test = D_workspace.Datasources.Contains(dsconInfo.Alias);
if (test)
{
MessageBox.Show("该数据源已打开!");
return;
}
dsconInfo.Password = "";
// 根据文件的扩展名来确定使用的引擎类型
if (Path.GetExtension(saveFileDialog1.FileName) == ".udb")
{
dsconInfo.EngineType = EngineType.UDB;
}
else
{
dsconInfo.EngineType = EngineType.UDBX;
}
D_workspace.Datasources.Open(dsconInfo);
//刷新工作空间树
this.D_workspaceControl.WorkspaceTree.Refresh();
}
}
}
(3)打开数据库型数据源
此处以打开PostgreSQL数据库为例,设置服务器名称、数据库名称、用户名和密码等连接信息,使用这些连接信息打开PostgreSQL数据库型数据源,其他数据引擎类型可自行编写。
private void OpenDatabaseDatasource_Click(object sender, EventArgs e)
{
if (D_workspace != null)
{
DatasourceConnectionInfo dsconInfo = new DatasourceConnectionInfo();
dsconInfo.EngineType = EngineType.PostgreSQL;
//自行设置服务器名称、数据库名称、用户名和密码等连接信息
dsconInfo.Server = "";
dsconInfo.Database = "";
dsconInfo.User = "";
dsconInfo.Password = "";
D_workspace.Datasources.Open(dsconInfo);
//刷新工作空间树
this.D_workspaceControl.WorkspaceTree.Refresh();
}
}
(4)关闭数据源
private void CloseDatasource_Click(object sender, EventArgs e)
{
//判断工作空间树中选择的节点是否是数据源节点的子节点
if (this.D_workspaceControl.WorkspaceTree.SelectedNode.Parent == this.D_workspaceControl.WorkspaceTree.DatasourcesNode)
{
D_workspace.Datasources[this.D_workspaceControl.WorkspaceTree.SelectedNode.Text].Close();
this.D_workspaceControl.WorkspaceTree.Refresh();
}
else
{
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;
}
}
六、完整实现代码
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 SuperMap.Data;
using SuperMap.Mapping;
using SuperMap.UI;
using SuperMap.Realspace;
using System.IO;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
private Workspace D_workspace;
private WorkspaceControl D_workspaceControl;
private MapControl D_mapControl;
private SceneControl D_sceneControl;
private LayersControl D_layersControl;
private WorkspaceConnectionInfo D_connectionInfo;
public Form1()
{
String mail = ""; // 需要替换为自己的SuperMap账号
String password = "";
bool login = SuperMap.Data.CloudLicense.Login(mail, password);
InitializeComponent();
D_workspace = new Workspace();
D_workspaceControl = new WorkspaceControl();
//控件始终填充整个父容器
D_workspaceControl.Dock = DockStyle.Fill;
//将指定的控件添加到panel1控件中
splitContainer1.Panel1.Controls.Add(D_workspaceControl);
D_layersControl = new LayersControl();
D_layersControl.Dock = DockStyle.Fill;
splitContainer1.Panel2.Controls.Add(D_layersControl);
D_mapControl = new MapControl();
D_mapControl.Dock = DockStyle.Fill;
//将指定的控件添加到panel1控件中
panel3.Controls.Add(D_mapControl);
D_sceneControl = new SceneControl();
D_sceneControl.Dock = DockStyle.Fill;
panel4.Controls.Add(D_sceneControl);
//为 D_workspaceControl控件的WorkspaceTree控件的NodeMouseClick事件添加了一个名为tree_NodeMouseClick的事件处理程序。
//当单击WorkspaceTree控件的节点时,将触发 tree_NodeMouseClick 事件处理程序,从而执行相关的操作或代码逻辑。
this.D_workspaceControl.WorkspaceTree.NodeMouseClick += new TreeNodeMouseClickEventHandler(tree_NodeMouseClick);
}
private void Form1_Load(object sender, EventArgs e)
{
//工作空间和控件联动
D_workspaceControl.WorkspaceTree.Workspace = D_workspace;
D_mapControl.Map.Workspace = D_workspace;
D_sceneControl.Scene.Workspace = D_workspace;
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
D_mapControl.Dispose();
D_layersControl.Dispose();
D_sceneControl.Dispose();
D_workspaceControl.Dispose();
D_workspace.Close();
D_workspace.Dispose();
}
private void OpenWorkspace_Click(object sender, EventArgs e)
{
//获取对话框
this.openFileDialog1.Title = "打开工作空间";
this.openFileDialog1.FileName = "";
//对打开文件进行格式过滤
this.openFileDialog1.Filter = "工作空间文件 (*.smwu)|*.smwu|工作空间文件 (*.sxwu)|*.sxwu";
//返回文件结果
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
//关闭存在的工作空间
D_workspace.Close();
//将文件名作为工作空间名称
string fileName = openFileDialog1.FileName;
//传递工作空间连接信息
WorkspaceConnectionInfo file = new WorkspaceConnectionInfo(fileName);
//打开工作空间
D_workspace.Open(file);
//刷新工作空间树
this.D_workspaceControl.WorkspaceTree.Refresh();
}
}
private void SaveWorkspace_Click(object sender, EventArgs e)
{
if (D_workspace.Save())
{
MessageBox.Show("工作空间保存成功!", "提示");
}
else
{
MessageBox.Show("工作空间保存失败!", "提示");
return;
}
}
private void SaveAsWorkspace_Click(object sender, EventArgs e)
{
//获取对话框
this.saveFileDialog1.Title = "保存工作空间";
//对另存文件进行格式过滤
this.saveFileDialog1.Filter = "SuperMap工作空间文件(*.smwu)|*.smwu|SuperMap工作空间文件(*.sxwu)|*.sxwu";
if (this.saveFileDialog1.FileName != null && this.saveFileDialog1.ShowDialog() == DialogResult.OK)
{
//从 SaveFileDialog控件中获取用户选择的文件名,并去除文件扩展名后赋值给变量name
//这个操作通常用于获取用户选择的文件的纯文件名,而不包括文件的扩展名部分
String name = System.IO.Path.GetFileNameWithoutExtension(this.saveFileDialog1.FileName);
//传递工作空间连接信息
WorkspaceConnectionInfo file = new WorkspaceConnectionInfo();
file.Server = this.saveFileDialog1.FileName;
file.Password = "";
//根据 SaveFileDialog 控件的 FilterIndex属性的值来判断文件的类型
if (this.saveFileDialog1.FilterIndex == 1)
{
file.Type = WorkspaceType.SMWU;
}
else
{
file.Type = WorkspaceType.SXWU;
}
D_workspace.Caption = name;
//另存于指定路径
if (D_workspace.SaveAs(file))
{
MessageBox.Show("工作空间另存成功!");
}
else
{
MessageBox.Show("另存工作空间失败!", "提示");
return;
}
}
}
private void CloseWorkspace_Click(object sender, EventArgs e)
{
this.D_workspace.Close();
}
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;
}
}
private void CreateDatasource_Click(object sender, EventArgs e)
{
SaveFileDialog saveFileDialog1 = new SaveFileDialog();
saveFileDialog1.Title = "新建文件型数据源";
saveFileDialog1.CheckPathExists = true;
saveFileDialog1.AddExtension = true;
saveFileDialog1.Filter = "SuperMap UDB文件(*.udb)|*.udb|SuperMap UDBX文件(*.udbx)|*.udbx";
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
//获取文件名并且去掉文件扩展名
String name = Path.GetFileNameWithoutExtension(saveFileDialog1.FileName);
for (int i = 0; i < D_workspace.Datasources.Count; i++)
{
//比较字符串"name"和数据源的别名是否相等
bool test = (String.Compare(name, D_workspace.Datasources[i].Alias) == 0);
if (test)
{
MessageBox.Show("指定数据源名称已存在!");
return;
}
}
//DatasourceConnectionInfo 构造函数(String, String, String)
DatasourceConnectionInfo dsconInfo = new DatasourceConnectionInfo(name, name, "");
//设置UDB文件的绝对路径,当绝对路径的长度超过 UTF-8 编码格式的260字节长度,该数据源无法打开
dsconInfo.Server = saveFileDialog1.FileName;
// 根据文件的扩展名来确定使用的引擎类型
if (Path.GetExtension(saveFileDialog1.FileName) == ".udb")
{
dsconInfo.EngineType = EngineType.UDB;
}
else
{
dsconInfo.EngineType = EngineType.UDBX;
}
//根据指定的数据源连接信息创建数据源
D_workspace.Datasources.Create(dsconInfo);
}
}
private void OpenFileDatasource_Click(object sender, EventArgs e)
{
if (D_workspace != null)
{
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.Filter = "SuperMap UDB文件(*.udb)|*.udb|SuperMap UDBX文件(*.udbx)|*.udbx";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
DatasourceConnectionInfo dsconInfo = new DatasourceConnectionInfo();
dsconInfo.Server = openFileDialog1.FileName;
dsconInfo.Alias = System.IO.Path.GetFileNameWithoutExtension(openFileDialog1.FileName);
bool test = D_workspace.Datasources.Contains(dsconInfo.Alias);
if (test)
{
MessageBox.Show("该数据源已打开!");
return;
}
dsconInfo.Password = "";
// 根据文件的扩展名来确定使用的引擎类型
if (Path.GetExtension(saveFileDialog1.FileName) == ".udb")
{
dsconInfo.EngineType = EngineType.UDB;
}
else
{
dsconInfo.EngineType = EngineType.UDBX;
}
D_workspace.Datasources.Open(dsconInfo);
//刷新工作空间树
this.D_workspaceControl.WorkspaceTree.Refresh();
}
}
}
private void OpenDatabaseDatasource_Click(object sender, EventArgs e)
{
if (D_workspace != null)
{
DatasourceConnectionInfo dsconInfo = new DatasourceConnectionInfo();
dsconInfo.EngineType = EngineType.PostgreSQL;
//自行设置服务器名称、数据库名称、用户名和密码等连接信息
dsconInfo.Server = "";
dsconInfo.Database = "";
dsconInfo.User = "";
dsconInfo.Password = "";
D_workspace.Datasources.Open(dsconInfo);
//刷新工作空间树
this.D_workspaceControl.WorkspaceTree.Refresh();
}
}
private void CloseDatasource_Click(object sender, EventArgs e)
{
//判断工作空间树中选择的节点是否是数据源节点的子节点
if (this.D_workspaceControl.WorkspaceTree.SelectedNode.Parent == this.D_workspaceControl.WorkspaceTree.DatasourcesNode)
{
D_workspace.Datasources[this.D_workspaceControl.WorkspaceTree.SelectedNode.Text].Close();
this.D_workspaceControl.WorkspaceTree.Refresh();
}
else
{
MessageBox.Show("请先选中要关闭的数据源!");
}
}
}
}
七、运行结果
总结
以上就是有关于SuperMap iObjects 11i .NET关于数据源操作的一些过程记录,我们下篇博文再见!