Arcgis Engine 加载Oracle数据库
发布日期:2021-05-28 17:03:24
浏览次数:23
分类:技术文章
本文共 5035 字,大约阅读时间需要 16 分钟。
Arcgis Engine 加载Oracle数据库
前言
在我的博客Arcgis类别中,有一篇文章介绍了,Arcgis如何连接Oracle数据库以及如何将Arcgis的要素导入到Oracle数据中。我们都知道Oracle数据库中的数据Arcgis是无法直接识别的,需要通过一个中间件(空间数据库引擎SDE),首先将Oracle数据库中的数据转换为Arcgis可识别的格式,然后再加载到arcgis中。本篇讲解如何将通过SDE连接到Arcgis的Oracle数据库中的数据通过AE加载到地图中。实现代码如下:
//打开SDE数据库 public IWorkspace getSDEWorkspace(String _pServerIP, String _pInstance, String _pUser, String _pPassword, String _pDatabase, String _pVersion) { try { IWorkspace pWkspace = null; ESRI.ArcGIS.Geodatabase.IWorkspaceFactory2 workspaceFactory = null; ESRI.ArcGIS.esriSystem.IPropertySet pPropertySet = new ESRI.ArcGIS.esriSystem.PropertySetClass(); pPropertySet.SetProperty("SERVER", _pServerIP);//本机服务IP pPropertySet.SetProperty("INSTANCE", _pInstance);//数据库实例(sde:oracle11g:+数据库实例名),数据库实例名即前面文章安装Oracle11g数据库时的全局数据库名; pPropertySet.SetProperty("AUTHENTICATION_MODE", _pDatabase); pPropertySet.SetProperty("USER", _pUser);//前文中Arcgis连接Oracle数据库时设置的SDE用户名 pPropertySet.SetProperty("PASSWORD", _pPassword);前文中Arcgis连接Oracle数据库时设置的SDE用户密码 pPropertySet.SetProperty("VERSION", _pVersion); workspaceFactory = (ESRI.ArcGIS.Geodatabase.IWorkspaceFactory2)new ESRI.ArcGIS.DataSourcesGDB.SdeWorkspaceFactoryClass(); pWkspace = workspaceFactory.Open(pPropertySet, 0); return pWkspace; } catch (Exception ex) { MessageBox.Show(ex.Message); return null; } } ////// 添加数据集到Map /// /// /// public void AddAllDataset(IWorkspace pWorkspace, AxMapControl mainMap) { IEnumDataset pEnumDataset = pWorkspace.get_Datasets(esriDatasetType.esriDTAny); //加载各种类型的数据 IDataset pDataset = pEnumDataset.Next(); while (pDataset != null) { if (pDataset is IFeatureDataset) //要素数据集 { IFeatureWorkspace pFeatureworkspace = (IFeatureWorkspace)pWorkspace; IFeatureDataset pFeatureDataset = pFeatureworkspace.OpenFeatureDataset(pDataset.Name); IEnumDataset pEnumDataset1 = pFeatureDataset.Subsets; //获取要素集合 IDataset pDataset1 = pEnumDataset1.Next(); while (pDataset1 != null) { if (pDataset1 is IFeatureClass) //要素类 { IFeatureLayer pFeatureLayer = new FeatureLayer(); pFeatureLayer.FeatureClass = pFeatureworkspace.OpenFeatureClass(pDataset1.Name); pFeatureLayer.Name = pFeatureLayer.FeatureClass.AliasName; if (pFeatureLayer.FeatureClass != null) { mainMap.AddLayer(pFeatureLayer); } } pDataset1 = pEnumDataset1.Next(); } } else if (pDataset is IFeatureClass) //要素类 { IFeatureWorkspace pFeatureworkspace = pWorkspace as IFeatureWorkspace; IFeatureLayer pFlyr = new FeatureLayer(); pFlyr.FeatureClass = pFeatureworkspace.OpenFeatureClass(pDataset.Name); pFlyr.Name = pDataset.Name; if (pFlyr != null) { mainMap.AddLayer(pFlyr); } } else if (pDataset is IRasterDataset) //栅格数据集 { IRasterWorkspaceEx pRasterworkspace = pWorkspace as IRasterWorkspaceEx; //转为栅格空间 IRasterDataset pRasterDataset = pRasterworkspace.OpenRasterDataset(pDataset.Name); if (pRasterDataset != null) { IRasterLayer pRasterLayer = new RasterLayer(); pRasterLayer.CreateFromDataset(pRasterDataset); pRasterLayer.Name = pDataset.Name; mainMap.AddLayer(pRasterLayer); } } pDataset = pEnumDataset.Next(); } } //在事件中调用以上两个方法即可 IWorkspace pWorkspace = LoadMap.getSDEWorkspace("locahost", "sde:oracle11g:orcl", "sde", "sde", "DBMS", "SDE.DEFAULT");//在此将参数写死,写的是我的Oracle数据的参数,为了方便学习者了解参数内容。 AddAllDataset(pWorkspace, mainMap);
----------------------------大神忽略以下----------------------------
后记
Arcgis engine开发涉及接口非常庞大,我觉得使用者一定要学会查看Esri提供的开发文档,这样才能在理论之上熟练运用各个接口的使用。例如本篇通过getSDEWorkspace方法可以得到IWorkspace接口的实现,那么要想将Oracle中的数据加载到MAP中,如果是要素类的话,还需要将IWorkspace转化为IFeatureLayer,这也是很多AE开发初学者的难点所在,如果有一定的基础,会使用开发文档的话,这个问题也就好解决多了。 1、首先查看IWorkspace中的成员,发现有Datasets属性 2、查看其get方法,可得到IEnumDataset 3、查看IEnumDataset接口成员,发现它的Next方法,通过该方法得到 IDataset 4、再类似便可将IDataset转化为IFeatureLayer大多数情况下,一般复杂的,还需要查看接口的实现类,以及实现类中又包括哪些接口,这样一层套一层的实现最终目的。
转载地址:https://blog.csdn.net/qq_34720818/article/details/86488572 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
感谢大佬
[***.8.128.20]2024年09月04日 19时47分01秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
链表:利用二级指针删除单向链表
2019-05-24
数组指针和指针数组的区别
2019-05-24
常量指针与指针常量的区别
2019-05-24
求二叉树的高度(非递归) .----美团二面=----硬伤 当时没有答上来
2019-05-24
面试总结 --系统
2019-05-24
c++ virtual 实例分析
2019-05-24
c++ 析构函数为虚函数 可以防止内存泄露
2019-05-24
c++ 内联函数
2019-05-24
c++ 抽象类 纯虚函数
2019-05-24
C++ 虚函数 笔试题目--绿盟科技
2019-05-24
c++ 内存管理:5、指针参数是如何传递内存的
2019-05-24
c++ 内存管理:6、杜绝“野指针”
2019-05-24
c++ 内存管理:7、有了malloc/free为什么还要new/delete?
2019-05-24
c++ 内存管理:8、内存耗尽怎么办
2019-05-24
c++ 内存管理:9、malloc/free的使用要点 new/delete的使用要点
2019-05-24
STL中map用法详解
2019-05-24
面试之网络问题
2019-05-24
2014校园招聘总结 .
2019-05-24
Linux C编程--main函数参数解析 .
2019-05-24
Socket send函数和recv函数详解
2019-05-24