ArcSDE是ESRI公司推出的基於SDE技術的空間數據庫解決方案,它是在現有的關係或對象關係型數據庫管理系統的基礎上進行應用擴展,能夠將空間數據和非空間數據存儲在目前絕大多數商用DBMS中,享受商用DBMS(IBMDB二、Informix、Oracle、PostgreSQL和SQLSever)帶來的便利。html
ArcSDE是數據庫管理地理數據庫的接口,經過該接口能夠在關係數據庫與ArcGIS之間創建一個數據存儲、瀏覽、編輯等操做的通道。
sql
ArcSDE鏈接商業數據庫的思路大體爲:數據庫
定義一個數據庫鏈接屬性(IPropertySet)對象,設置屬性參數。服務器
接着定義一個工做空間,並用SdeWorkspaceFactoryClass()實例化。函數
調用工做空間的Open()方法打開數據(Feature Class),並顯示,完成數據讀取。sqlserver
都須要用到的函數,我將它提取了方法爲(SDEDirectConnection):post
/// <summary> /// SDE直接鏈接函數 /// </summary> /// <returns></returns> private static IPropertySet SDEDirectConnection() { //定義一個數據庫鏈接屬性 IPropertySet propset = new PropertySetClass(); //採用SDE鏈接 //設置數據庫服務器名, 服務器所在的名稱(即實例) propset.SetProperty("SERVER", @"USER-20190915QG\SQLEXPRESS"); //設置SDE的端口,這是安裝時指定的 propset.SetProperty("INSTANCE", @"sde:sqlserver:USER-20190915QG\SQLEXPRESS"); //SDE的用戶名 propset.SetProperty("USER", "sa"); //SDE的密碼 propset.SetProperty("PASSWORD", "root"); //設置數據庫的名字,只有SQL Server Informix數據庫才須要設置 propset.SetProperty("DATABASE", "sde"); //SDE的版本, 這裏爲默認版本 propset.SetProperty("VERSION", "sde.Default"); return propset; }
獲取單個要素(GetSingleSDELayer):url
/// <summary> /// 獲取單個要素 /// </summary> private void GetSingleSDELayer() { //SDE直接鏈接函數 IPropertySet propset = SDEDirectConnection(); //定義一個工做空間, 並實例化爲SDE的工做空間類 IWorkspaceFactory workspaceFactroy = new SdeWorkspaceFactoryClass(); //打開SDE工做空間,並強轉成要素工做空間 IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspaceFactroy.Open(propset, 0); //經過要素空間打開要素類「sde.DBO.河流」並存放在要素類中 IFeatureClass featureClass = featureWorkspace.OpenFeatureClass("sde.DBO.河流"); //新建一個要素圖層 IFeatureLayer featureLayer = new FeatureLayerClass(); //將要素類存放在剛定義好的要素圖層的要素類中 featureLayer.FeatureClass = featureClass; //設置要素圖層名字 featureLayer.Name = featureClass.AliasName; //axMapControl1增長圖層 axMapControl1.AddLayer(featureLayer); //刷新axMapControl1 axMapControl1.Refresh(); }
可是這樣挺侷限的,例如,我有一個要素集,我須要都顯示出來,上面的代碼就不能知足該需求了。spa
那麼該如何作呢?3d
簡單地說,定義個string類型的泛型類,用來存放要素類,再經過遍歷這個泛型類,將每一個要素類增長到圖層中!
得到全部SDE圖層(GetAllSDELayer)
/// <summary> /// 得到全部SDE圖層 /// </summary> private void GetAllSDELayer() { //SDE直接鏈接函數 IPropertySet propset = SDEDirectConnection(); //定義一個工做空間, 並實例化爲SDE的工做空間類 IWorkspaceFactory workspaceFactroy = new SdeWorkspaceFactoryClass(); //打開SDE工做空間 IWorkspace workspace = workspaceFactroy.Open(propset, 0); //經過工做空間獲取要素類,並存放在List<string>的泛型類中 List<string> listFeatureClass = GetFeatureClassByWorkspace(workspace); //定義個變量i,用來獲取圖層 int i = 0; //使用foreach循環來遍歷listFeatureClass foreach (var item in listFeatureClass) { //將工做空間強轉成要素工做空間 IFeatureWorkspace featureWorkspace = workspace as IFeatureWorkspace; //經過要素空間打開要素類並存放在要素類中 IFeatureClass featureClass = featureWorkspace.OpenFeatureClass(item); //新建一個要素圖層 IFeatureLayer featureLayer = new FeatureLayer(); //將要素類存放在剛定義好的要素圖層的要素類中 featureLayer.FeatureClass = featureClass; //設置要素圖層名字 featureLayer.Name = featureClass.AliasName; //axMapControl1增長圖層 axMapControl1.AddLayer(featureLayer, i); //自增i i++; } //刷新axMapControl1 axMapControl1.Refresh(); }
/// <summary> /// 經過工做空間獲取要素類 /// </summary> /// <param name="workspace"></param> /// <returns></returns> private List<string> GetFeatureClassByWorkspace(IWorkspace workspace) { //定義個string類型的泛型類,用來存放要素類 List<string> listFeatureClass = new List<string>(); try { //將工做空間強轉成要素工做空間 IFeatureWorkspace pFeatureWorkspace = workspace as IFeatureWorkspace; //經過工做空間的get_Datasets方法得到全部數據集並強轉成枚舉數據集並存放在枚舉數據集中 IEnumDataset pEnumDataset = workspace.get_Datasets(esriDatasetType.esriDTAny) as IEnumDataset; //調用枚舉數據集中的Next()方法指向單條數據集(第一條) IDataset pDataset = pEnumDataset.Next(); //當數據集不爲空時,遍歷工做空間下的要素類或要素集 while (pDataset != null) { //判斷數據集的類型是否和esri中的要素類類型相同 if (pDataset.Type == esriDatasetType.esriDTFeatureClass) { //數據集的名字加入到泛型要素類中 listFeatureClass.Add(pDataset.Name); } //判斷數據集的類型是否和esri中的要素數據集相同 else if (pDataset.Type == esriDatasetType.esriDTFeatureDataset) { //將該要素集的子集賦值給枚舉要素類 IEnumDataset pSubEnumDataset = pDataset.Subsets; //調用枚舉數據集中的Next()方法指向下一個單條數據集(爲子集) IDataset pSubDataset = pSubEnumDataset.Next(); //當數據集不爲空時 while (pSubDataset != null) { //數據集的名字加入到泛型要素類中 listFeatureClass.Add(pSubDataset.Name); //調用枚舉數據集中的Next()方法指向下一個單條數據集 pSubDataset = pSubEnumDataset.Next(); } } //調用枚舉數據集中的Next()方法指向單條數據集 pDataset = pEnumDataset.Next(); } } catch (Exception ex) { return null;//出錯返回null } //返回listFeatureClass泛型類 return listFeatureClass; }
效果圖:
謝謝觀看!本人初學GIS二次開發,若是有不對的地方,請多多包涵!