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

编程入门 行业动态 更新时间:2024-10-14 02:20:26

ArcGis Engine <a href=https://www.elefans.com/category/jswz/34/1767714.html style=要素折点转点的代码实现"/>

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,内存就泄露了,因此会报错。

参考 .html

更多推荐

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

本文发布于:2024-03-23 18:40:53,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1741504.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:要素   代码   ArcGis   Engine   折点转点

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!