ArcGIS Engine连接ArcSDE SQL Server(获得所有SDE图层)
2019-11-09 10:21
2391 查看
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(); //定义一 576 个工作空间, 并实例化为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二次开发,如果有不对的地方,请多多包涵!
相关文章推荐
- SQL SERVER 2000 遍历父子关系数据的表(二叉树)获得所有子节点 所有父节点及节点层数函数
- ArcSDE10.2在SQL Server上的配置与连接
- ArcGIS Engine断开其他ArcSDE用户连接的解决方案
- SQL Server 断开某个数据库所有连接(还原的时候需要)
- 收藏 不显示删除回复显示所有回复显示星级回复显示得分回复 用户 '' 登录失败。该用户与可信 SQL Server 连接无关联
- SQL SERVER 2008 删除某个数据库的所有连接进程
- VC+MO2.0连接ArcSDE并且读出SDE中的空间数据(一)
- ArcGIS Engine 连接SQL Server并建立关联
- 【AE】SDE图层断开后重新连接的解决方法
- ArcGIS Engine断开其他ArcSDE用户连接的解决方案
- 清除arcsde空间垃圾数据以及解决sde图层名称被占用的问题
- Sql server 获得某一部门下的所有子部门。根据子部门获得它的上级部门。
- 断开所有远程连接(sql server)
- 请问怎么获得当前连接到网上邻居的用户名啊?怎样完全断开所有网上邻居的连接?
- 杀掉SQL SERVER目标库的所有连接
- ArcCatalog连接ArcSDE时提示“SDE not accepting connection requests“的解决办法
- VC+MO2.0连接ArcSDE并且读出SDE中的空间数据(二)
- 清除arcsde空间垃圾数据以及解决sde图层名称被占用的问题
- 将数据库常用的操作(连接数据库,获得所有数据,获得一条记录,获得一列记录,获得一条索引数组,获得一条关联数组)都给封装到db.class.php里面,谁需要谁继承这个类 注意:提交封装的类文件
- SQL Server中获得所有表相关信息的方法