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

来源:互联网 发布:淘宝联盟如何做推广 编辑:程序博客网 时间:2024/04/28 13:11

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

1 0
原创粉丝点击