工作空間、地圖等的打開、保存、刪除是最基本的操作,可我居然卡在保存工作空間的問題上了。
功能需求
需求很簡單:打開工作空間中的某一地圖,縮放一下,保存地圖。(下次打開時,已經縮放到上次修改過的地方)
想得簡單
按超圖的模式,工作空間(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:\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不要再進行大幅度的修改,或者修改了說一聲。

