工作空间、地图等的打开、保存、删除是最基本的操作,可我居然卡在保存工作空间的问题上了。
功能需求
需求很简单:打开工作空间中的某一地图,缩放一下,保存地图。(下次打开时,已经缩放到上次修改过的地方)
想得简单
按超图的模式,工作空间(Workspace)是通过其中的数据源集合对象( Datasources),地图集合对象( Maps)来管理其下的数据源和地图。工作空间中的地图集合( Maps)中存储的是地图的配置信息,如地图包含图层的个数,图层引用的数据集,地图范围,背景风格等。
那么我的操作是先保存Map,再保存Workspace,而Map没有Save相关方法,顺利找到了Workspace的Save,可能是Workspace保存时,会对所有的Map,Layout, Datasource等进行检查保存吧,经过测试,然并没有!
桌面测试
由于对桌面软件还不熟悉,于是,在桌面软件里来测试一下:
当缩放地图后,关闭地图窗口会弹出如下提示(菜单栏或右键并没有找到保存地图的按键,只能关闭地图窗口时,才有此提示)
如果不关闭修改过的地图窗口,直接保存工作空间,也会提示保存地图。
还有自动保存功能。
很显然,应该是我没有找到地图保存接口和方法。
官方帮助
官方的帮助文档,可谓是唯一的"药",可并不奏效。在Workspace类有一个示例代码:
public void OpenWorkspace() { // 打开工作空间,取出工作空间中名为“World”的数据集,查询其描述信息 Workspace workspace = new Workspace(); WorkspaceConnectionInfo workspaceConnectionInfo = new WorkspaceConnectionInfo(); workspaceConnectionInfo.Type=WorkspaceType.SXWU; String file = @"D:worldworld.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不要再进行大幅度的修改,或者修改了说一声。