ArcGis Engine 要素折点转点的代码实现
2016-07-28 15:29
387 查看
ArcGIS中的GP工具要素折点转点使用起来十分方便,速度也十分快,但是也存在一些问题,比如要求最高权限,转点时会对一些过近的点进行合并(待深入考察)。
因此在某些时候需要用代码实现该功能,在以前因为代码缺陷未实现该功能,只能用GP去实现。
代码如下:
经过验证,处理30000个地块的时间需要192秒(i5-6400,8G)。
在插入feature时,如果开启了工作空间编辑(IWorkSpaceEdit.StartEditing),因为要满足对每次操作可以撤销,工作空间并不会自动释放存储的改变信息。随着insert的要素越来越多而不store,内存就泄露了,因此会报错。
参考 http://www.cnblogs.com/GISRSMAN/p/4571831.html
因此在某些时候需要用代码实现该功能,在以前因为代码缺陷未实现该功能,只能用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
相关文章推荐
- C#实现字符串倒叙方法整理
- c语言和c++的输入,输出和异常
- thinkphp3.2.3 分页代码分享
- Django笔记---用户注册和登录验证(1)--Post请求
- C++Operator
- Ftp上传文件
- 使用git将代码存入远程仓库github和从github上克隆代码到本地
- 第一讲 go 语言简介
- spring boot 整合Freemarker
- 转:推荐的编程字体
- python 把函数作为参数 ---高阶函数
- TQEditor logo网页在线编辑器 TQEditor
- eclipse新建workspace如何保留之前的相关设置
- Java enum的用法详解
- Java实现链式队列
- 三种JAVA常用实现字符串反转(Reverse)的方法
- 能够提高开发效率的Eclipse实用操作
- 【C++学习之路】VS2015中cout、cin未声明的标识符错误的处理
- Java程序编写的常用类
- 代码重构之路