ArcGIS Engine連接ArcSDE SQL Server(獲得所有SDE圖層)


ArcSDE是ESRI公司推出的基於SDE技術的空間數據庫解決方案,它是在現有的關系或對象關系型數據庫管理系統的基礎上進行應用擴展,可以將空間數據和非空間數據存儲在目前絕大多數商用DBMS中,享受商用DBMS(IBMDB2、Informix、Oracle、PostgreSQL和SQLSever)帶來的便利。

ArcSDE是數據庫管理地理數據庫的接口,通過該接口可以在關系數據庫與ArcGIS之間建立一個數據存儲、瀏覽、編輯等操作的通道。

ArcSDE連接商業數據庫的思路大致為:

定義一個數據庫連接屬性(IPropertySet)對象,設置屬性參數。

接着定義一個工作空間,並用SdeWorkspaceFactoryClass()實例化。

調用工作空間的Open()方法打開數據(Feature Class),並顯示,完成數據讀取。

都需要用到的函數,我將它提取了方法為(SDEDirectConnection):

/// <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):

/// <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();
}

但是這樣挺局限的,例如,我有一個要素集,我需要都顯示出來,上面的代碼就不能滿足該需求了。

 

那么該如何做呢?

簡單地說,定義個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;
}

效果圖:

ArcSDE 10 for SQL Server安裝教程(含下載鏈接)

謝謝觀看!本人初學GIS二次開發,如果有不對的地方,請多多包涵!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM