打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Personal Geodatabase数据(mdb格式)导入到ArcSDE Geodatabase中
userphoto

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;           
            }       
        }   
    }    
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
AE数据加载
ArcGIS Engine连接ArcSDE SQL Server(获得所有SDE图层)
(转)AE加载不同数据的方法(GeoDatabase空间数据管理)
ArcGIS Engine中的数据访问
SDE
ArcGIS Engine中初始化许可常见问题归纳,the application is ...
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服