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;
}

效果图:

谢谢观看!本人初学GIS二次开发,如果有不对的地方,请多多包涵!

原文地址:https://www.cnblogs.com/edcoder/p/11824416.html

时间: 2024-08-29 16:54:52

ArcGIS Engine连接ArcSDE SQL Server(获得所有SDE图层)的相关文章

ArcSDE SQL Server 创建地图数据库

1.安装并破解: ArcGIS 10.2 ArcSDE 10.2 Sql Server 2008 R2 本文重点关注Sql Server和ArcSDE配置问题,安装破解过程略. 2.配置Sql Server,启用sa账号 (1)启用账户登录:点数据库属性,选安全性,在右边选中“SQL Server 和 Windows 身份验证模式” (2)启用sa账号 依次双击: 安全性 -> 登录名 -> sa,在弹出对话框中,点左侧“状态”,然后在右侧选中“授予”和“启用”.可以在常规选项卡中设置密码.

CSharp 连接本地SQL Server 数据库

本文将详细介绍如何使用Connection对象连接数据库.对于不同的.NET数据提供者,ADO.NET采用不同的Connection对象连接数据库.这些Connection对象为我们屏蔽了具体的实现细节,并提供了一种统一的实现方法. Connection类有四种:SqlConnection,OleDbConnection,OdbcConnection和OracleConnection. SqlConnection类的对象连接SQL Server数据库:OracleConnection 类的对象连

ArcSDE 10.1安装、配置、连接 (SQL Server 2008)

转自:http://blog.csdn.net/esrichinacd/article/details/8510224 1  概述 ArcSDE 10.1的安装配置相较于ArcSDE 10.0和之前版本,有了一些显著的变化,比如取消了Post Install向导,很多之前的管理操作改为使用地理处理工具来执行.很多用户初次接触很不适应,本文就为大家介绍如何安装.配置和连接ArcSDE 10.1,测试数据库选择的是Microsoft SQL Server 2008 R2 Enterprise Edi

使用C语言连接 ms sql server 2008 —— ODBC 编程

ODBC连接分为两个步骤: 1.配置本地ODBC环境 2.代码. 一.配置本地ODBC环境 1.启动 sql server 服务. 运行->net start mssqlserver 2.更该sql的登录方式为混合登录 步骤:(1)打开sql 2008,使用windows身份进入->右键点击->属性->安全性->选择混合身份验证 (2)确定后选择数据库下面的安全性->登录名->sa->修改密码->重新启动 3.新建一张表 数据库名字取名为 Test  

navica 连接本地 sql server

本地sql server主机名 navicat新建链接 原文地址:https://www.cnblogs.com/my2018/p/10638046.html

C#连接上sql server 2008 第一次实践

花了一早上的时间,终于连接上了我的本地数据库,我想应该记一下! 先贴个代码: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 using System.Data.SqlClient; 8 9 namespace ConsoleApplication1 10 { 11 class Prog

VS2010/VS2013项目创建及通过ADO.NET连接mysql/sql server步骤(VS2013连接成功步骤见上一篇随笔)

本随笔主要是对初学者通过ADO.NET连接数据库的步骤(刚开始我也诸多不顺,所以总结下,让初学者熟悉步骤) 1.打开VS新建一个项目(这里的VS版本不限,建项目都是一样的步骤) VS2010版本如图: VS2013版本如图: 2.非空项目创建后,右侧“解决方案管理器”中会有一个“models”文件,右键“models”,具体步骤如下: 2-1步骤 2-2步骤 2-3步骤 2-3-1  注意这个是VS2010版本的截图 2-4步骤 2-5步骤 2-6步骤 2-7步骤 2-8步骤 2-10步骤 2-

断开所有远程连接(sql server)

DECLARE @d VARCHAR(8000) SET @d = ' ' SELECT @d = @d + ' kill ' + CAST(spid AS VARCHAR) + CHAR(13)FROM MASTER.sys.sysprocessesWHERE dbid = DB_ID('ATMS ') EXEC (@d)

SQL Server 2005无法远程连接的解决方法

以前一直连接本地的数据库,连接SQL Server 2005是小菜的... 做项目也是老师搭好了服务器端,打上IP去访问就行...也不用考虑太多. 今天自己在公司搭SQL Server 2005服务器,客户端去访问问题就来了... 连接失败,SQL Server 2005不支持远程... 想想应该不会,于是想到老师以前说的,服务器端要做配置...哇哈哈!~~果然... 方法如下:  一.为 SQL Server 2005 启用远程连接 1. 单击"开始",依次选择"程序&qu