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. CSS技巧 (1) · 结构和布局

     前言 这一篇主要是总结关于结构和布局的一些技巧,不管什么,一个网页上来,最重要的是先确定他的结构和布局,实现基本的布局之后,我们再进行局部的优化和交互特效. 这一篇主要讲 关于 自适应内部元素 的内 ...

  2. ELK 学习笔记之 elasticsearch基本概念和CRUD

    elasticsearch基本概念和CRUD: 基本概念: CRUD: 创建索引: curl -XPUT 'http://192.168.1.151:9200/library/' -d '{" ...

  3. 【Java】支付宝获取人脸采集认证的图片base64格式

    人脸识别结果查询接口zoloz.identification.user.web.query返回的imgStr图片字符串并不是标准的base64格式,解析不出图片. 由于标准的Base64并不适合直接放 ...

  4. vue使用vant-ui实现上拉加载、下拉刷新和返回顶部

    vue使用vant-ui实现上拉加载.下拉刷新和返回顶部 vue现在在移动端常用的ui库有vant-ui和mint-ui,上拉加载.下拉刷新和返回顶部也是移动端最基础最常见的功能.下面就用vant-u ...

  5. vue中图片放大镜功能

    仿淘宝详情页图片鼠标移过去可对图片放大显示在右侧 效果图如下图,此功能支持PC端与移动端 接下来进入代码实现环节: 先准备两张图片,一张小图片叫 '土味.jpg',大小160*91:一张大图片叫 ' ...

  6. 利用pyecharts将数据可视化

    可视化展示在数据分析领域中是一个至关重要的点,好的可视化展示对我们的结果分析有更好的支持作用. 一.问题 在数据分析的时代里面我们需要将数据的可视化展现出来,更加方便用户的观察.如下图 有些时候我们需 ...

  7. c语言中double类型数据的输入和输出

    double a;scanf("%f",&a);   //应用scanf("%lf",&a);执行上面语句时,发现double类型的输入不能使用 ...

  8. 【Java 基础】谈谈集合.List

    目录 1. ArrayList 1.1 ArrayList的构造 1.2 add方法 1.3 remove方法 1.4 查询方法 1.5 一些其他常用方法 1.6 ArrayList小结 2. Vec ...

  9. PHP会话机制---session的基本使用

    登录网站后,在每个网页都能拿到用户信息 (1) 使用超链接传递用户名,这样太繁琐了,不建议使用 . (2) 使用数据库,每打开一个页面都查询一次用户信息表,这样网页加载速度变慢,用户体验变差. (3) ...

  10. pytorch笔记

    Tensor slice Tensor的indices操作 以[2,3]矩阵为例,slice后可以得到任意shape的矩阵,并不是说一定会小于2行3列. import torch truths=tor ...