SuperMap开发入门4——保存的坑

时间:2021-08-21 05:47:30

工作空间、地图等的打开、保存、删除是最基本的操作,可我居然卡在保存工作空间的问题上了。

功能需求

需求很简单:打开工作空间中的某一地图,缩放一下,保存地图。(下次打开时,已经缩放到上次修改过的地方)

想得简单

按超图的模式,工作空间(Workspace)是通过其中的数据源集合对象( Datasources),地图集合对象( Maps)来管理其下的数据源和地图。工作空间中的地图集合( Maps)中存储的是地图的配置信息,如地图包含图层的个数,图层引用的数据集,地图范围,背景风格等。

那么我的操作是先保存Map,再保存Workspace,而Map没有Save相关方法,顺利找到了Workspace的Save,可能是Workspace保存时,会对所有的Map,Layout, Datasource等进行检查保存吧,经过测试,然并没有!

桌面测试

由于对桌面软件还不熟悉,于是,在桌面软件里来测试一下:

当缩放地图后,关闭地图窗口会弹出如下提示(菜单栏或右键并没有找到保存地图的按键,只能关闭地图窗口时,才有此提示)

SuperMap开发入门4——保存的坑

如果不关闭修改过的地图窗口,直接保存工作空间,也会提示保存地图。

SuperMap开发入门4——保存的坑

还有自动保存功能。

SuperMap开发入门4——保存的坑

很显然,应该是我没有找到地图保存接口和方法。

官方帮助

官方的帮助文档,可谓是唯一的"药",可并不奏效。在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();
}

  

这里面的玄机真的很深,官方也是这样保存的,难道与数据、环境有关?经过测试,然并没有!

技术支持

无奈,请求官方的技术支持,终于告诉我保存地图的奥秘:

string xml = map.ToXML();
mapctrl.Maps.SetMapXML(mapName, xml);
workspace.Save();

  

我可以理解地图是由XML配置而成,展现时按规则解析即可,但这个保存方式符合哪国人的习惯?workspace的Save方法为什么不把前两步包括进去,不包括为什么没有任何官方资料这样介绍?6C的保存接口已经废弃;记住9D的保存方式,不要问为什么;希望以后的10X不要再进行大幅度的修改,或者修改了说一声。

SuperMap开发入门4——保存的坑