ArcGis Engine 要素折点转点的代码实现

ArcGIS中的GP工具要素折点转点使用起来十分方便,速度也十分快,但是也存在一些问题,比如要求最高权限,转点时会对一些过近的点进行合并(待深入考察)。

因此在某些时候需要用代码实现该功能,在以前因为代码缺陷未实现该功能,只能用GP去实现

代码如下:

 /// <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 + "折点转点", 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)IN_FeatureDataset.Workspace;
                //Temp_WorkspaceEdit.StartEditing(true);
                //Temp_WorkspaceEdit.StartEditOperation();
                IFeatureBuffer Temp_FeatureBuffer = Temp_VPFeatureClass.CreateFeatureBuffer();
                IFeatureCursor Temp_FeatureCursor = Temp_VPFeatureClass.Insert(true);
                //尽量不在循环中创建变量
                IPointCollection Temp_Vertices;
                IPoint Each_Point = new PointClass();
                int i;
                //将点存入要素类
                while (Temp_EachFeature != null)
                {
                    //获取要素的点集
                    Temp_Vertices = Temp_EachFeature.Shape as IPointCollection;
                    for (i= 0; i < Temp_Vertices.PointCount - 1; i++)
                    {
                        Temp_Vertices.QueryPoint(i,Each_Point);
                        //据说get_Point(i)方法回比QueryPoint(i,Each_Point)方法速度慢,但是实际使用没感觉出来
                        //Each_Point = Temp_Vertices.get_Point(i);
                        Temp_FeatureBuffer.Shape = Each_Point;
                        Temp_FeatureCursor.InsertFeature(Temp_FeatureBuffer);
                    } Temp_EachFeature = Temp_GetEachFeature.NextFeature();
                }
                Temp_FeatureCursor.Flush();
                //清理资源并返回
                System.Runtime.InteropServices.Marshal.FinalReleaseComObject(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)IN_Featureclass.FeatureDataset.Workspace;
            Temp_FieldChecker.Validate(Temp_Fields, out Temp_FieldsError, out Temp_AllRightFields);
            //本例添加"OriginClassOID"字段
            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;
        }

经过验证,处理30000个地块的时间需要192秒(i5-6400,8G)。

在插入feature时,如果开启了工作空间编辑(IWorkSpaceEdit.StartEditing),因为要满足对每次操作可以撤销,工作空间并不会自动释放存储的改变信息。随着insert的要素越来越多而不store,内存就泄露了,因此会报错。

参考 http://www.cnblogs.com/GISRSMAN/p/4571831.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值