Arcgis Engine 加载Oracle数据库

版权声明:转载请注明 https://blog.csdn.net/qq_34720818/article/details/86488572

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;
            }
        } 


        /// <summary>
        /// 添加数据集到Map
        /// </summary>
        /// <param name="pWorkspace"></param>
        /// <param name="mainMap"></param>
        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

大多数情况下,一般复杂的,还需要查看接口的实现类,以及实现类中又包括哪些接口,这样一层套一层的实现最终目的。

猜你喜欢

转载自blog.csdn.net/qq_34720818/article/details/86488572