/// <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会自动为数据添加长度字段和面积字段等。
浙公网安备 33010602011771号