ArcGIS Engine连接ArcSDE SQL Server(获得所有SDE图层)
2024-10-10 06:54:19
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二次开发,如果有不对的地方,请多多包涵!
最新文章
- fuelphp 问题1
- mongodb 释放磁盘空间
- 科技来电:不容错过的win10轻度美化攻略
- 2016年11月6日 星期日 --出埃及记 Exodus 19:22
- 1:CSS中一些@规则的用法小结 2: @media用法详解
- win7刷新图标缓存
- mysql CASE WHEN的基础和多种用法
- chkconfig命令核心案列及核心原理
- eclipse中查看字节码
- Python title()、upper()、lower()方法--string
- 两种语言实现设计模式(C++和Java)(一:工厂模式)
- oracle分区表的使用和查询
- Confluence 6 连接到 Jira 用户管理的限制
- 机器学习基石笔记:07 The VC Dimension
- Java基础知识中的注意事项
- BroadcastReceiver的使用,动态注册和注销,优先级和中断控制
- Mybatis-Plus 实战完整学习笔记(九)------条件构造器核心用法大全(上)
- Fading Like a Flower
- JavaWeb总结(八)
- [CSAcademy]Connected Tree Subgraphs
热门文章
- ServiceStack.Redis高效封装和简易破解
- hover和position共用出现的问题
- Django默认权限机制介绍及实践
- Joomla 3.0.0 -3.4.6远程代码执行(RCE)漏洞复现
- Lab_0操作系统实验准备(全)
- python编程基础之八
- e课表项目第二次冲刺周期第四天
- PHP array_replace_recursive
- Cocos2d-x 学习笔记(11.4) ScaleTo ScaleBy
- std::to_string