虽然有方便的GP工具FeatureVerticesToPoint。然而其需要最高权限,某些时候没法使用,可以用下面的函数作为替代。
/// <summary> /// 要素节点转点 /// </summary> /// <param name="IN_Featureclass">要转换的要素类</param> /// <param name="IN_FeatureDataset">要生成转换后要素类的要素数据集</param> /// <returns>生成的点要素类</returns> private IFeatureClass PRV_FeatureVerticesToPoints(IFeatureClass IN_Featureclass,IFeatureDataset IN_FeatureDataset) { //创建要素类 IFeatureClass Temp_VPFeatureClass =IN_FeatureDataset.CreateFeatureClass(IN_Featureclass.AliasName + "_VPoints", PRV_SetFields(IN_Featureclass), null, null, esriFeatureType.esriFTSimple, "Shape", ""); //提取所有要素 IFeatureCursor Temp_GetEachFeature = IN_Featureclass.Search(null, false); IFeature Temp_EachFeature = Temp_GetEachFeature.NextFeature(); if (Temp_EachFeature != null) { IWorkspaceEdit Temp_WorkspaceEdit = (IWorkspaceEdit) Temp_WorkspaceEdit.StartEditing(true); Temp_WorkspaceEdit.StartEditOperation(); IFeatureBuffer Temp_FeatureBuffer = Temp_VPFeatureClass.CreateFeatureBuffer(); IFeatureCursor Temp_FeatureCursor = Temp_VPFeatureClass.Insert(true); //将点存入要素类 while (Temp_EachFeature != null) { //获取要素的点集 IPointCollection Temp_Vertices = Temp_EachFeature.Shape as IPointCollection; for (int i = 0; i < Temp_Vertices.PointCount - 1; i++) { Temp_FeatureBuffer.Shape = Temp_Vertices.Point[i]; Temp_FeatureCursor.InsertFeature(Temp_FeatureBuffer); } Temp_EachFeature = Temp_GetEachFeature.NextFeature(); } Temp_FeatureCursor.Flush(); Temp_WorkspaceEdit.StopEditOperation(); Temp_WorkspaceEdit.StopEditing(true); //清理资源并返回 System.Runtime.InteropServices.Marshal.ReleaseComObject(Temp_GetEachFeature); } return Temp_VPFeatureClass; }
该函数的辅助函数
private IFields PRV_SetFields(IFeatureClass IN_Featureclass)//设字段的函数 { //创建必要字段 IFeatureClassDescription Temp_FeatureClassDescription = new FeatureClassDescriptionClass(); IObjectClassDescription Temp_ObjectClassDescription = (IObjectClassDescription)Temp_FeatureClassDescription; IFields Temp_Fields = Temp_ObjectClassDescription.RequiredFields; int Temp_ShapeFieldIndex = Temp_Fields.FindField(Temp_FeatureClassDescription.ShapeFieldName); IField Temp_RequiredField = Temp_Fields.get_Field(Temp_ShapeFieldIndex); //设定几合字段 IGeometryDef Temp_GeometryDef = Temp_RequiredField.GeometryDef; IGeometryDefEdit Temp_GeometryDefEdit = (IGeometryDefEdit)Temp_GeometryDef; Temp_GeometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint; ISpatialReferenceFactory Temp_SpatialRefFac = new SpatialReferenceEnvironmentClass(); //以备用点为模板构建空间参考 Temp_GeometryDefEdit.SpatialReference_2 = (IN_Featureclass as IGeoDataset).SpatialReference; //验证字段 IFieldChecker Temp_FieldChecker = new FieldCheckerClass(); IEnumFieldError Temp_FieldsError = null; IFields Temp_AllRightFields = null;//验证无误的字段集 Temp_FieldChecker.ValidateWorkspace = (IWorkspace)FDS_MainFeatureDataset.Workspace; Temp_FieldChecker.Validate(Temp_Fields, out Temp_FieldsError, out Temp_AllRightFields); //添加"原图形的OID"字段 IFieldsEdit Temp_FiledsEditor = Temp_AllRightFields as IFieldsEdit; IField Temp_OriginOIDFields = new FieldClass(); IFieldEdit2 Temp_FiledEditor = Temp_OriginOIDFields as IFieldEdit2; Temp_FiledEditor.Type_2 = esriFieldType.esriFieldTypeInteger; Temp_FiledEditor.Name_2 = "OriginClassOID"; Temp_FiledsEditor.AddField(Temp_OriginOIDFields); return Temp_AllRightFields; }
如果有好方法也可以分享一下。
附GP工具的函数:
//面转节点(GP法) private IFeatureClass PRV_FeatureVerticesToPoints_GP(IFeatureClass IN_Featureclass,IFeatureDataset FDS_MainFeatureDataset) { //要素数据集地址 string Temp_FeaturedatasetPath = FDS_MainFeatureDataset.Workspace.PathName + "\\" + FDS_MainFeatureDataset.Name + "\\"; //面转点 Geoprocessor GP_Tool = new Geoprocessor();//GP运行工具 FeatureVerticesToPoints GP_FeatureVerticesToPoint = new FeatureVerticesToPoints(); GP_FeatureVerticesToPoint.in_features = Temp_FeaturedatasetPath + IN_Featureclass.AliasName; GP_FeatureVerticesToPoint.point_location = "All"; GP_FeatureVerticesToPoint.out_feature_class = Temp_FeaturedatasetPath + IN_Featureclass.AliasName+"_VP"; GP_Tool.Execute(GP_FeatureVerticesToPoint, null); //获取生成的要素类 IFeatureClass Temp_FeatureClass = (FDS_MainFeatureDataset.Workspace as IFeatureWorkspace).OpenFeatureClass(IN_Featureclass.AliasName + "_VP"); return Temp_FeatureClass; }