分享

Personal Geodatabase数据(mdb格式)导入到ArcSDE Geodatabase中

 bubbi7 2016-02-28

//将上传的mdb文件保存至sde数据库中
   protected void btnSaveToSDE_Click(object sender, EventArgs e)
   {
        //获取服务器上下文
       IServerContext serverContext = GetServerContext();
       //打开mdb文件所在的工作空间
       ESRI.ArcGIS.Geodatabase.IWorkspaceFactory wf = serverContext.CreateObject("esriDataSourcesGDB.AccessWorkspaceFactory") as IWorkspaceFactory;
       string fileName = @"F:\MyGeodatabase.mdb";
       IFeatureWorkspace pFeatureWorkspaceMDB = wf.OpenFromFile(fileName, 0) as IFeatureWorkspace;
       IWorkspace pWorkspaceMDB = pFeatureWorkspaceMDB as IWorkspace;
      //打开sde空间数据库的工作空间
       IFeatureWorkspace pFeatureWorkspaceSDE = OpenWorkspace(serverContext);
       IWorkspace pWorkspaceSDE = pFeatureWorkspaceSDE as IWorkspace;
       #region //获得mdb所有的要素数据集并进行转换复制
       IEnumDataset pEnumDataset = pWorkspaceMDB.get_Datasets(esriDatasetType.esriDTFeatureDataset);
       IDataset pDataset = pEnumDataset.Next();
      //遍历mdb中每一个数据集
       string nameOfSourceFeatureDataset = null;// 源数据集名称
       string nameOfTargetFeatureDataset = null;// 目标数据集名称
       while (pDataset != null)
       {
           nameOfSourceFeatureDataset = pDataset.Name;
           nameOfTargetFeatureDataset = nameOfSourceFeatureDataset + "_SDE";
           ConvertMDBFeatureDatasetToSDE(serverContext, pWorkspaceMDB, pWorkspaceSDE, nameOfSourceFeatureDataset, nameOfTargetFeatureDataset);
           pDataset = pEnumDataset.Next();
       }
       #endregion
       #region // 获得mdb中所有的独立要素类并进行转换复制
       IEnumDataset enumDataset = pWorkspaceMDB.get_Datasets(esriDatasetType.esriDTFeatureClass) as IEnumDataset;
       IDataset dataset = enumDataset.Next();
       // 遍历mdb的每一个独立要素类
       string nameOfSourceFeatureClass = null;// 源要素类名称
       string nameOfTargetFeatureClass= null;// 目标要素类名称
       while (dataset != null)
       {
           if (dataset.Type == esriDatasetType.esriDTFeatureClass)
           {
               IFeatureClass pFeatureClass = dataset as IFeatureClass;
               nameOfSourceFeatureClass = pFeatureClass.AliasName;
               nameOfTargetFeatureClass = nameOfSourceFeatureClass + "_SDE";
               ConvertMDBFeatureClassToSDE(serverContext, pWorkspaceMDB, pWorkspaceSDE, nameOfSourceFeatureClass, nameOfTargetFeatureClass);
               dataset = enumDataset.Next();
           }
           else
           {
               return;
           }
       }
       #endregion
      //释放服务器上下文
       serverContext.ReleaseContext();
   }
//获得服务器上下文
   public IServerContext GetServerContext()
   {
       #region 通过IGISServerConnection来创建服务器上下文
       IGISServerConnection gisServerConnection = new GISServerConnection();
       gisServerConnection.Connect("服务器名");
       IServerObjectManager4 serverObjectManager = (IServerObjectManager4)gisServerConnection.ServerObjectManager;
       IServerContext serverContext = serverObjectManager.CreateServerContext("", "");
       #endregion
       return serverContext;
   }
//打开sde数据库
public IFeatureWorkspace OpenWorkspace(IServerContext serverContext)
{
      //sde数据库连接属性设置
    IPropertySet pProperty = serverContext.CreateObject("esriSystem.PropertySet") as IPropertySet;
    pProperty.SetProperty("Server", "fms");// 服务器名称或者IP
    pProperty.SetProperty("Instance", "esri_sde");//
    pProperty.SetProperty("Database", "sde数据库名");// sde数据库名称
    pProperty.SetProperty("user", "用户名");// 用户名称
    pProperty.SetProperty("password", "密码");// 用户密码
    pProperty.SetProperty("version", "sde.DEFAULT");// 连接版本
    //创建IWorkspaceFactory对象
    ESRI.ArcGIS.Geodatabase.IWorkspaceFactory2 wf = serverContext.CreateObject("esriDataSourcesGDB.SdeWorkspaceFactory") as IWorkspaceFactory2;
    //打开IFeatureWorkspace对象
    IFeatureWorkspace fws = wf.Open(pProperty, 0) as IFeatureWorkspace;
    return fws;
}
//将mdb中的要素数据集转换到sde数据库中
    public void ConvertMDBFeatureDatasetToSDE(IServerContext serverContext,IWorkspace sourceWorkspace, IWorkspace targetWorkspace, string nameOfSourceFeatureDataset, string nameOfTargetFeatureDataset)   
    {
        if (sourceWorkspace == null || targetWorkspace == null)
        {
            return;
        }
        //创建源工作空间名      
        IDataset sourceWorkspaceDataset = (IDataset)sourceWorkspace;       
        IWorkspaceName sourceWorkspaceName = (IWorkspaceName)sourceWorkspaceDataset.FullName;
        //创建源数据集名
        IFeatureDatasetName sourceFeatureDatasetName = serverContext.CreateObject("esriGeoDatabase.FeatureDatasetName") as IFeatureDatasetName;
        IDatasetName sourceDatasetName = (IDatasetName)sourceFeatureDatasetName;       
        sourceDatasetName.WorkspaceName = sourceWorkspaceName;       
        sourceDatasetName.Name = nameOfSourceFeatureDataset;
        //创建目标工作空间名
        IDataset targetWorkspaceDataset = (IDataset)targetWorkspace;       
        IWorkspaceName targetWorkspaceName = (IWorkspaceName)targetWorkspaceDataset.FullName;
       //创建目标数据集名
        IFeatureDatasetName targetFeatureDatasetName = serverContext.CreateObject("esriGeoDatabase.FeatureDatasetName") as IFeatureDatasetName;
        IDatasetName targetDatasetName = (IDatasetName)targetFeatureDatasetName;       
        targetDatasetName.WorkspaceName = targetWorkspaceName;       
        targetDatasetName.Name = nameOfTargetFeatureDataset;
        //转换(复制)源数据集到目标数据集
        IFeatureDataConverter featureDataConverter = serverContext.CreateObject("esriGeoDatabase.FeatureDataConverter") as IFeatureDataConverter;
        featureDataConverter.ConvertFeatureDataset(sourceFeatureDatasetName, targetFeatureDatasetName, null, "", 1000, 0);       
    }
//将mdb中要素类转换复制到sde数据库中
   public void ConvertMDBFeatureClassToSDE(IServerContext serverContext,IWorkspace sourceWorkspace, IWorkspace targetWorkspace, string nameOfSourceFeatureClass, string nameOfTargetFeatureClass)   
    {       
        // 创建源工作空间名称     
        IDataset sourceWorkspaceDataset = (IDataset)sourceWorkspace;       
        IWorkspaceName sourceWorkspaceName = (IWorkspaceName)sourceWorkspaceDataset.FullName;
       //创建源数据集名称        
        IFeatureClassName sourceFeatureClassName = serverContext.CreateObject("esriGeoDatabase.FeatureClassName") as IFeatureClassName;
        IDatasetName sourceDatasetName = (IDatasetName)sourceFeatureClassName;       
        sourceDatasetName.WorkspaceName = sourceWorkspaceName;       
        sourceDatasetName.Name = nameOfSourceFeatureClass;
      //创建目标工作空间名称    
        IDataset targetWorkspaceDataset = (IDataset)targetWorkspace;       
        IWorkspaceName targetWorkspaceName = (IWorkspaceName)targetWorkspaceDataset.FullName;
       //创建目标数据集名称    
        IFeatureClassName targetFeatureClassName = serverContext.CreateObject("esriGeoDatabase.FeatureClassName") as IFeatureClassName;
        IDatasetName targetDatasetName = (IDatasetName)targetFeatureClassName;       
        targetDatasetName.WorkspaceName = targetWorkspaceName;       
        targetDatasetName.Name = nameOfTargetFeatureClass;
       //打开输入的要素类以得到字段定义      
        ESRI.ArcGIS.esriSystem.IName sourceName = (ESRI.ArcGIS.esriSystem.IName)sourceFeatureClassName;       
        IFeatureClass sourceFeatureClass = (IFeatureClass)sourceName.Open();//打开源要素类
        //验证字段名称,因为你正在不同类型的工作空间之间进行数据转换
        IFieldChecker fieldChecker = serverContext.CreateObject("esriGeoDatabase.FieldChecker") as IFieldChecker;       
        IFields sourceFeatureClassFields = sourceFeatureClass.Fields;
        IFields targetFeatureClassFields;       
        IEnumFieldError enumFieldError;
       //最重要的设置输入和验证工作空间
        fieldChecker.InputWorkspace = sourceWorkspace;       
        fieldChecker.ValidateWorkspace = targetWorkspace;       
        fieldChecker.Validate(sourceFeatureClassFields, out enumFieldError, out targetFeatureClassFields);
       //遍历所有输出字段找到几何字段
        IField geometryField;       
        for (int i = 0; i < targetFeatureClassFields.FieldCount; i++)       
        {           
            if (targetFeatureClassFields.get_Field(i).Type == esriFieldType.esriFieldTypeGeometry)           
            {               
                geometryField = targetFeatureClassFields.get_Field(i);               
                //得到几何字段的几何定义                
                IGeometryDef geometryDef = geometryField.GeometryDef;
                //赋予几何定义一个空间索引格网数目和格网大小值
                IGeometryDefEdit targetFCGeoDefEdit = (IGeometryDefEdit)geometryDef;
                targetFCGeoDefEdit.GridCount_2 = 1;               
                targetFCGeoDefEdit.set_GridSize(0, 0);
                //允许ArcGIS为数据加载确定一个有效的格网大小
                targetFCGeoDefEdit.SpatialReference_2 = geometryField.GeometryDef.SpatialReference;
               //转换要素类中所有的要素
                IQueryFilter queryFilter = serverContext.CreateObject("esriGeoDatabase.QueryFilter") as IQueryFilter; ;               
                queryFilter.WhereClause = "";
               //加载要素类               
                IFeatureDataConverter fctofc = serverContext.CreateObject("esriGeoDatabase.FeatureDataConverter") as IFeatureDataConverter;               
                IEnumInvalidObject enumErrors = fctofc.ConvertFeatureClass(sourceFeatureClassName, queryFilter, null, targetFeatureClassName, geometryDef, targetFeatureClassFields, "", 1000, 0);               
                break;           
            }       
        }   
    }    

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多