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, );
//通过要素空间打开要素类“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, );
//通过工作空间获取要素类,并存放在List<string>的泛型类中
List<string> listFeatureClass = GetFeatureClassByWorkspace(workspace);
//定义个变量i,用来获取图层
int i = ;
//使用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二次开发,如果有不对的地方,请多多包涵!

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

  1. Jmeter—8 连接microsoft sql server数据库取数据

    本文以Jmeter 连接microsoft sql server为例. 1 从微软官网下载Microsoft SQL Server JDBC Driver 地址:http://www.microsof ...

  2. Linux下安装SQL Server 2016(连接篇SQL Server on linux)

    连接数据库 (1)设置防火墙 要连接数据库,首先要打开防火墙上1433端口,也就是,增加tcp端口1433到公共区域,并且永久生效. [root@localhost Desktop]# firewal ...

  3. Jmeter入门8 连接microsoft sql server数据库取数据

    本文以Jmeter 连接microsoft sql server为例. 1 从微软官网下载Microsoft SQL Server JDBC Driver 地址:http://www.microsof ...

  4. 1433端口无法连接(sql server 数据库无法访问问题)解决思路

    登录远程SQL服务器一 看ping 服务器IP能否ping通. 这个实际上是看和远程sql server 2000服务器的物理连接是否存在.如果不行,请检查网络,查看配置,当然得确保远程sql ser ...

  5. 无法打开到SQL Server的连接 (Microsoft SQL Server, 错误:53) .

    标题: 连接到服务器 ------------------------------ 无法连接到 MSSQLSERVER. ------------------------------ 其他信息: 在与 ...

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

    转自:http://blog.csdn.net/esrichinacd/article/details/8510224 1  概述 ArcSDE 10.1的安装配置相较于ArcSDE 10.0和之前版 ...

  7. java连接ms sql server各类问题解析

    首先先来说下使用微软自己开发的架包进行ms sql server数据库的连接时,sql 2000与sql 2005的连接方式略有不同: 1.首先驱动不一样,sql 2000的连接驱动包有三个,分别是: ...

  8. ArcSDE SQL Server 创建地图数据库

    1.安装并破解: ArcGIS 10.2 ArcSDE 10.2 Sql Server 2008 R2 本文重点关注Sql Server和ArcSDE配置问题,安装破解过程略. 2.配置Sql Ser ...

  9. vs连接服务器sql server数据库 web.config和代码

    方法一.在web.config里面配置,后连接数据库 (1)web.config文件:加在<connectionStrings>和</connectionStrings> 之间 ...

随机推荐

  1. bootstrap具体知识点(2)

    3.以移动设备为优先 <meta name=”viewport” content=”width=device-width,initial-scale=1,user-scalable=no”> ...

  2. Spring MVC学习 ( RESTful)

    是一套规则,不同的系统之间(Vue java Python C#  PHP)具体四种不同类型的HTTP 请求分别表示四种基本操作(CRUD) GET :查询(R) POST:添加(C) PUT:修改( ...

  3. Requests实践详解

    Requests是什么 Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库 如果你看过上篇文章关于urllib库的使用,你会发现, ...

  4. CyclicBarrier 是如何做到等待多线程到达一起执行的?

    我们有些场景,是需要使用 多线各一起执行某些操作的,比如进行并发测试,比如进行多线程数据汇总. 自然,我们可以使用 CountDownLatch, CyclicBarrier, 以及多个 Thread ...

  5. Python制作有道翻译小工具

    该工具主要是利用了爬虫,爬取web有道翻译的内容. 然后利用简易GUI来可视化结果. 首先我们进入有道词典的首页,并点击翻译结果的审查元素 之后request响应网页,并分析网页,定位到翻译结果. 使 ...

  6. fiddler抓包-快速找到准确的接口与断点介绍

    前言: 相信有不少小伙伴提出,如果一堆杂七杂八的接口在fiddler显示,眼花缭乱的该怎么办?本篇文章小编给大家带来的内容是: 1.fiddler中设置域名过滤,使得快速定位你需要的接口: 2.断点, ...

  7. 支撑微博亿级社交平台,小白也能玩转Redis集群(原理篇)

    Redis作为一款性能优异的内存数据库,支撑着微博亿级社交平台,也成为很多互联网公司的标配.这里将以Redis Cluster集群为核心,基于最新的Redis5版本,从原理再到实战,玩转Redis集群 ...

  8. Qt5教程: (1) Hello World 程序

    1. 新建工程 在Welcome界面选择New Project --> Application --> Qt Widgets Application --> Choose 输入工程名 ...

  9. 流包装器实现WebShell免杀

    说明: 本文首发自 https://www.secpulse.com/archives/73391.html ,转载请注明出处. 前言 本文是看PHP使用流包装器实现WebShell有感,权当做个笔记 ...

  10. Python开发【第九篇】字典

    字典 字典是一种可变的容器,可以存储任意类型的数据 字典中的每个数据都是用键进行索引,而不像序列容器(str,list,tuole)可以用整数进行索引 字典中的数据没有先后顺序,字典的存储是无序的 字 ...