请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

ArcGIS Engine连接ArcSDE SQL Server(获得所有SDE图层)

[复制链接]
查看: 94|回复: 0

7870

主题

1万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
31892
发表于 2019-11-9 11:52 | 显示全部楼层 |阅读模式
ArcSDE是ESRI公司推出的基于SDE技术的空间数据库治理计划,它是在现有的关系或工具关系型数据库治理系统的根柢上举行利用扩大,可以将空间数据和非终间数据存储在现在绝大大都商用DBMS中,享用商用DBMS(IBMDB2、Informix、Oracle、PostgreSQL和SQLSever)带来的便当。
ArcSDE是数据库治理地理数据库的接口,经过该接口可以在关系数据库与ArcGIS之间建立一个数据存储、欣赏、编辑等操纵的通道。
ArcGIS Engine连接ArcSDE SQL Server(获得所有SDE图层)  游戏 1665796-20191109095718506-333668719

ArcSDE毗连贸易数据库的思绪大略为:
界说一个数据库毗连属性(IPropertySet)工具,设备属性参数。
接着界说一个工作空间,并用SdeWorkspaceFactoryClass()实例化。
挪用工作空间的Open()方式翻开数据(Feature Class),并表现,完成数据读取。
都必要用到的函数,我将它提取了方式为(SDEDirectConnection):
  1. /// /// SDE间接毗连函数/// /// 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):
  1. /// /// 获得单个要素/// 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();}
复制代码
ArcGIS Engine连接ArcSDE SQL Server(获得所有SDE图层)  游戏 1665796-20191109100423640-121191726

可是这样挺范围的,例如,我有一个要素集,我必要都表现出来,上面的代码就不能满足该需求了。
ArcGIS Engine连接ArcSDE SQL Server(获得所有SDE图层)  游戏 1665796-20191109101016197-2130183189

那末该怎样做呢?
简单地说,界说个string典范的泛型类,用来寄存要素类,再经过遍历这个泛型类,将每个要素类增加到图层中!
获得全数SDE图层GetAllSDELayer)
  1. /// /// 获得全数SDE图层/// private void GetAllSDELayer(){    //SDE间接毗连函数    IPropertySet propset = SDEDirectConnection();    //界说一个工作空间, 并实例化为SDE的工作空间类    IWorkspaceFactory workspaceFactroy = new SdeWorkspaceFactoryClass();    //翻开SDE工作空间    IWorkspace workspace = workspaceFactroy.Open(propset, 0);    //经过工作空间获得要素类,并寄存在List的泛型类中    List 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();}
复制代码
  1. /// /// 经过工作空间获得要素类/// /// /// private List GetFeatureClassByWorkspace(IWorkspace workspace){    //界说个string典范的泛型类,用来寄存要素类    List listFeatureClass = new List();    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;}
复制代码
结果图:
ArcGIS Engine连接ArcSDE SQL Server(获得所有SDE图层)  游戏 1665796-20191109101706323-862999313

ArcSDE 10 for SQL Server安装教程(含下载链接)

感谢旁观!本人初学GIS二次斥地,倘使有差池的地方,请多多包容!


免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 妈妈网-中国妈妈第一,是怀孕、育儿、健康等知识交流传播首选平台 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表