Arcgis Engine 加载Oracle数据库
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
大多数情况下,一般复杂的,还需要查看接口的实现类,以及实现类中又包括哪些接口,这样一层套一层的实现最终目的。