• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
bobird的学习笔记
博客园    首页    新随笔    联系   管理    订阅  订阅
ShapeFile 导入 Geodatabase
        /// <summary>
        /// 将ShapeFile的数据导入到FeatureClass中
        /// </summary>
        /// <param name="strShapeFileFolder">ShapeFile工作路径</param>
        /// <param name="strShapeFileFeatureClassName">ShapeFile要素类名称</param>
        /// <param name="targetFeatureClass">目标要素类</param>
        public bool ConvertShapeFileToFeatureClass(string strShapeFileFolder,
            string strShapeFileFeatureClassName, IFeatureClass targetFeatureClass)
        {

            // 打开源工作空间
            IWorkspaceFactory sourceWorkspaceFactory = new ShapefileWorkspaceFactoryClass();
            IWorkspace sourceWorkspace = sourceWorkspaceFactory.OpenFromFile(strShapeFileFolder, 0);
            IDataset sourceWorkspaceDataset = (IDataset)sourceWorkspace;
            IName sourceWorkspaceDatasetName = sourceWorkspaceDataset.FullName;
            IWorkspaceName sourceWorkspaceName = (IWorkspaceName)sourceWorkspaceDatasetName;

            // 创建源要素类的名字
            IFeatureClassName sourceFeatureClassName = new FeatureClassNameClass();
            IDatasetName sourceDatasetName = (IDatasetName)sourceFeatureClassName;
            sourceDatasetName.Name = strShapeFileFeatureClassName;
            sourceDatasetName.WorkspaceName = sourceWorkspaceName;

            // 打开源要素类
            IName sourceName = (IName)sourceFeatureClassName;
            IFeatureClass sourceFeatureClass = (IFeatureClass)sourceName.Open();

            // 获取查询游标
            IFeatureCursor sourceFeatureSearchCursor = sourceFeatureClass.Search(null, true);
            IFeature sourceFeature = sourceFeatureSearchCursor.NextFeature();

            // 获取源要素类字段
            IFields sourceFeatureClassFields = sourceFeatureClass.Fields;

            // 获取目标工作空间.  
            IWorkspace targetWorkspace = ((IDataset)targetFeatureClass).Workspace;
            IWorkspaceEdit targetWorkspaceEdit = (IWorkspaceEdit)targetWorkspace;

            // 获取目标要素类的字段
            IFields targetFeatureClassfields = targetFeatureClass.Fields;

            // 获取目标要素类插入游标和FeatureBuffer
            IFeatureCursor targetFeatureInsertCursor = targetFeatureClass.Insert(true);
            IFeatureBuffer targetFeatureBuffer = targetFeatureClass.CreateFeatureBuffer();

            // 获取目标要素类的Shape字段
            string strTargetShapeFieldName = targetFeatureClass.ShapeFieldName;
            int nTargetShapelFieldIndex = targetFeatureClass.FindField(strTargetShapeFieldName);
            IField targetShapeField = targetFeatureClassfields.Field[nTargetShapelFieldIndex];

            // 开始对目标工作空间进行编辑.
            targetWorkspaceEdit.StartEditing(true);
            targetWorkspaceEdit.StartEditOperation();

            // 对源数据进行迭代
            while (sourceFeature != null)
            {
                try
                {
                    targetFeatureBuffer.Shape = sourceFeature.ShapeCopy;
                }
                catch (Exception e1) {
                    MessageBox.Show("导入空间要素失败," + e1.Message, "导入ShapeFile");
                    return false;
                }
               

                for (int i = 0; i < targetFeatureClassfields.FieldCount; ++i)
                {
                    IField field = targetFeatureClassfields.Field[i];

                    if ((field.Type == esriFieldType.esriFieldTypeOID)
                        || (field.Type == esriFieldType.esriFieldTypeGeometry))
                        continue;

                    int sourceFieldIndex = sourceFeatureClassFields.FindField(field.Name);
                    int targetFieldIndex = targetFeatureClassfields.FindField(field.Name);
                    if (sourceFieldIndex < 0 || targetFieldIndex < 0)
                    {
                        continue;
                    }

                    object obj = sourceFeature.get_Value(sourceFieldIndex);
                    targetFeatureBuffer.set_Value(targetFieldIndex, obj);
                }
                targetFeatureInsertCursor.InsertFeature(targetFeatureBuffer);
                sourceFeature = sourceFeatureSearchCursor.NextFeature();
            }

            // Calling flush allows you to handle any errors at a known time rather then on the cursor destruction. 
            targetFeatureInsertCursor.Flush();

            // Explicitly release the cursor.  
            Marshal.ReleaseComObject(targetFeatureInsertCursor);

            // 停止编辑.  
            targetWorkspaceEdit.StopEditOperation();
            targetWorkspaceEdit.StopEditing(true);

            MessageBox.Show("导入结束", "导入Shapefile...");
            return true;
        }

注意:Geodatabase会自动为数据添加长度字段和面积字段等。

posted on 2013-07-18 11:43  bobird  阅读(478)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3