导入导出数据高效的方法

忘记在哪抄的了,比调用GP工具和insert,buffer的方式快多了。

    /// <summary>
    /// 要素类的转移
    /// </summary>
    /// <param name="sourceWorkspace">源数据工作空间(shp)</param>
    /// <param name="targetWorkspace">目标数据工作空间(mdb)</param>
    /// <param name="nameOfSourceFeatureClass">源要素类名</param>
    /// <param name="nameOfTargetFeatureClass">目标要素类名</param>
    /// <param name="queryFilter"></param>
    /// <returns></returns>
    private bool IFeatureDataConverter_ConvertFeatureClass(IWorkspace sourceWorkspace, IWorkspace targetWorkspace,
string nameOfSourceFeatureClass, string nameOfTargetFeatureClass, IQueryFilter queryFilter)
    {
        //创建一个源数据的工作空间的name
        IDataset sourceWorkspaceDataset = (IDataset)sourceWorkspace;
        IWorkspaceName sourceWorkspaceName = (IWorkspaceName)sourceWorkspaceDataset.FullName;
        //创建源数据Name作为转换参数
        IFeatureClassName sourceFeatureClassName = new FeatureClassNameClass();
        IDatasetName sourceDatasetName = (IDatasetName)sourceFeatureClassName;
        sourceDatasetName.WorkspaceName = sourceWorkspaceName;
        //这个参数不能乱填(shp文件就是文件名没后缀,FeatureClass或者FeatureDataset就是AliasName)  
        sourceDatasetName.Name = nameOfSourceFeatureClass;

        //创建目标(导出)数据空间的name
        IDataset targetWorkspaceDataset = (IDataset)targetWorkspace;
        IWorkspaceName targetWorkspaceName = (IWorkspaceName)targetWorkspaceDataset.FullName;
        //创建目标数据Name作为转换参数
        IFeatureClassName targetFeatureClassName = new FeatureClassNameClass();
        IDatasetName targetDatasetName = (IDatasetName)targetFeatureClassName;
        targetDatasetName.WorkspaceName = targetWorkspaceName;
        //这个命名也很重要,如果是mdb,那么这个命名在数据库中必须是本来不存在的(当然你可以先清空数据库)
        targetDatasetName.Name = nameOfTargetFeatureClass;
        //根据FetureClassName打开数据
        ESRI.ArcGIS.esriSystem.IName sourceName = (ESRI.ArcGIS.esriSystem.IName)sourceFeatureClassName;
        IFeatureClass sourceFeatureClass = (IFeatureClass)sourceName.Open();

        //在两个不同的工作空间转换数据要检查字段的有效性
        //一些检查有效性的参数
        IFieldChecker fieldChecker = new FieldCheckerClass();
        IFields targetFeatureClassFields;
        IFields sourceFeatureClassFields = sourceFeatureClass.Fields;
        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);
                //保证空间参考      SpatialReference_2属性字段才是可写的,SpatialReference属性只可读  
                targetFCGeoDefEdit.SpatialReference_2 = geometryField.GeometryDef.SpatialReference;
                //开始转换  
                IFeatureDataConverter myConvert = new FeatureDataConverterClass();
                myConvert.ConvertFeatureClass(sourceFeatureClassName, queryFilter, null, targetFeatureClassName, geometryDef, targetFeatureClassFields, "", 1000, 0);
                return true;
            }

        }
        return false;
    }  

猜你喜欢

转载自www.cnblogs.com/lLazy/p/10662227.html
今日推荐