ArcEngine 面要素类转点

虽然有方便的GP工具FeatureVerticesToPoint。然而其需要最高权限,某些时候没法使用,可以用下面的函数作为替代。

[csharp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1.         /// <summary>  
  2.         /// 要素节点转点  
  3.         /// </summary>  
  4.         /// <param name="IN_Featureclass">要转换的要素类</param>  
  5.         /// <param name="IN_FeatureDataset">要生成转换后要素类的要素数据集</param>  
  6.         /// <returns>生成的点要素类</returns>  
  7.         private IFeatureClass PRV_FeatureVerticesToPoints(IFeatureClass IN_Featureclass,IFeatureDataset IN_FeatureDataset)  
  8.         {  
  9.             //创建要素类  
  10.             IFeatureClass Temp_VPFeatureClass =IN_FeatureDataset.CreateFeatureClass(IN_Featureclass.AliasName + "_VPoints", PRV_SetFields(IN_Featureclass), nullnull, esriFeatureType.esriFTSimple, "Shape""");  
  11.             //提取所有要素  
  12.             IFeatureCursor Temp_GetEachFeature = IN_Featureclass.Search(nullfalse);  
  13.             IFeature Temp_EachFeature = Temp_GetEachFeature.NextFeature();  
  14.             if (Temp_EachFeature != null)  
  15.             {  
  16.                 IWorkspaceEdit Temp_WorkspaceEdit = (IWorkspaceEdit)  
  17.                 Temp_WorkspaceEdit.StartEditing(true);  
  18.                 Temp_WorkspaceEdit.StartEditOperation();  
  19.                 IFeatureBuffer Temp_FeatureBuffer = Temp_VPFeatureClass.CreateFeatureBuffer();  
  20.                 IFeatureCursor Temp_FeatureCursor = Temp_VPFeatureClass.Insert(true);  
  21.                 //将点存入要素类  
  22.                 while (Temp_EachFeature != null)  
  23.                 {  
  24.                     //获取要素的点集  
  25.                     IPointCollection Temp_Vertices = Temp_EachFeature.Shape as IPointCollection;  
  26.                     for (int i = 0; i < Temp_Vertices.PointCount - 1; i++)  
  27.                     {  
  28.                       Temp_FeatureBuffer.Shape = Temp_Vertices.Point[i];  
  29.                       Temp_FeatureCursor.InsertFeature(Temp_FeatureBuffer);  
  30.                     }  
  31.                     Temp_EachFeature = Temp_GetEachFeature.NextFeature();  
  32.                 }  
  33.                 Temp_FeatureCursor.Flush();  
  34.                 Temp_WorkspaceEdit.StopEditOperation();  
  35.                 Temp_WorkspaceEdit.StopEditing(true);  
  36.                 //清理资源并返回  
  37.                 System.Runtime.InteropServices.Marshal.ReleaseComObject(Temp_GetEachFeature);  
  38.             }  
  39.             return Temp_VPFeatureClass;  
  40.         }  

该函数的辅助函数

[csharp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. private IFields PRV_SetFields(IFeatureClass IN_Featureclass)//设字段的函数  
  2.       {  
  3.           //创建必要字段  
  4.           IFeatureClassDescription Temp_FeatureClassDescription = new FeatureClassDescriptionClass();  
  5.           IObjectClassDescription Temp_ObjectClassDescription = (IObjectClassDescription)Temp_FeatureClassDescription;  
  6.           IFields Temp_Fields = Temp_ObjectClassDescription.RequiredFields;  
  7.           int Temp_ShapeFieldIndex = Temp_Fields.FindField(Temp_FeatureClassDescription.ShapeFieldName);  
  8.           IField Temp_RequiredField = Temp_Fields.get_Field(Temp_ShapeFieldIndex);  
  9.           //设定几合字段  
  10.           IGeometryDef Temp_GeometryDef = Temp_RequiredField.GeometryDef;  
  11.           IGeometryDefEdit Temp_GeometryDefEdit = (IGeometryDefEdit)Temp_GeometryDef;  
  12.           Temp_GeometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint;  
  13.           ISpatialReferenceFactory Temp_SpatialRefFac = new SpatialReferenceEnvironmentClass();  
  14.           //以备用点为模板构建空间参考  
  15.           Temp_GeometryDefEdit.SpatialReference_2 = (IN_Featureclass as IGeoDataset).SpatialReference;  
  16.           //验证字段  
  17.           IFieldChecker Temp_FieldChecker = new FieldCheckerClass();  
  18.           IEnumFieldError Temp_FieldsError = null;  
  19.           IFields Temp_AllRightFields = null;//验证无误的字段集  
  20.           Temp_FieldChecker.ValidateWorkspace = (IWorkspace)FDS_MainFeatureDataset.Workspace;  
  21.           Temp_FieldChecker.Validate(Temp_Fields, out Temp_FieldsError, out Temp_AllRightFields);  
  22.           //添加"原图形的OID"字段  
  23.           IFieldsEdit Temp_FiledsEditor = Temp_AllRightFields as IFieldsEdit;  
  24.           IField Temp_OriginOIDFields = new FieldClass();  
  25.           IFieldEdit2 Temp_FiledEditor = Temp_OriginOIDFields as IFieldEdit2;  
  26.           Temp_FiledEditor.Type_2 = esriFieldType.esriFieldTypeInteger;  
  27.           Temp_FiledEditor.Name_2 = "OriginClassOID";  
  28.           Temp_FiledsEditor.AddField(Temp_OriginOIDFields);  
  29.           return Temp_AllRightFields;  
  30.       }  

经测试,该方法只在 数据量小时起作用,数据量过大会出错 (本人测试32000个面转到15000个面就报错了) 效率远远低于GP工具 。估计GP工具采取了某些底层算法,处理60万点在160秒内(i5-6500,8G),本函数处理15000个面也需要超过10分钟时间。

如果有好方法也可以分享一下。

附GP工具的函数:

[csharp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //面转节点(GP法)  
  2.        private IFeatureClass PRV_FeatureVerticesToPoints_GP(IFeatureClass IN_Featureclass,IFeatureDataset FDS_MainFeatureDataset)  
  3.        {  
  4.            //要素数据集地址  
  5.            string Temp_FeaturedatasetPath = FDS_MainFeatureDataset.Workspace.PathName + "\\" + FDS_MainFeatureDataset.Name + "\\";  
  6.            //面转点  
  7.           Geoprocessor GP_Tool = new Geoprocessor();//GP运行工具  
  8.            FeatureVerticesToPoints GP_FeatureVerticesToPoint = new FeatureVerticesToPoints();  
  9.            GP_FeatureVerticesToPoint.in_features = Temp_FeaturedatasetPath + IN_Featureclass.AliasName;  
  10.            GP_FeatureVerticesToPoint.point_location = "All";  
  11.            GP_FeatureVerticesToPoint.out_feature_class = Temp_FeaturedatasetPath + IN_Featureclass.AliasName+"_VP";  
  12.            GP_Tool.Execute(GP_FeatureVerticesToPoint, null);  
  13.            //获取生成的要素类  
  14.            IFeatureClass Temp_FeatureClass = (FDS_MainFeatureDataset.Workspace as IFeatureWorkspace).OpenFeatureClass(IN_Featureclass.AliasName + "_VP");  
  15.            return Temp_FeatureClass;  
  16.   
  17.        }  
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值