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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:x++和++x的区别
下一篇:数据结构之基本概念

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年09月04日 19时47分01秒