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
- ArcGis Engine 要素折点转点的代码实现
- ArcGIS Engine代码共享-要素(Feature)操作
- ArcGIS Desktop和Engine中对点要素图层Graduated Symbols渲染的实现
- ArcGIS Engine 节点编辑,实现要素拖动、编辑、节点删除
- ArcGIS Engine中删除要素的几种方法总结
- ArcGIS Engine检索要素集、要素类和要素
- c#+ArcGIS Engine-矢量要素赋值
- arcgis engine 鹰眼的主要代码
- Arcgis Engine鹰眼功能的实现
- ArcGIS 10 影像分析工具及ArcGIS Engine的实现
- ArcGIS 10 影像分析工具及ArcGIS Engine的实现
- ArcGIS Engine效率探究——要素的添加和删除、属性的读取和更新
- ArcGIS Engine效率探究——要素的添加和删除、属性的读取和更新
- ArcGIS Engine效率探究——要素的添加和删除、属性的读取和更新
- ArcGIS Engine效率探究——要素的添加和删除、属性的读取和更新
- ArcGIS Engine中如何获取Map中已经选择的要素呢
- ArcGIS Engine二次开发——计算shapefile面图层要素的面积
- ArcGIS Engine要素渲染和专题图制作
- UVa1594 Ducci Sequence Ducci序列(习题5-2)
- 【WebService】CXF拦截器的设置以及自定义CXF拦截器
- Android Studio 错误 Duplicate files copied in APK META-INF/LICENSE.txt
- 关于安装arm-linux-gcc 的问题
- 日夜间模式转换
- ArcGis Engine 要素折点转点的代码实现
- 如何查看Java native 方法的实现
- Android测试内存泄露的注重点
- float double 在内存中的存储
- Java学习笔记(24)Implementing Lists,Stacks,Queues,and Priority Queues
- 1030. 完美数列(25)
- DFS-Find The Multiple
- 访问修饰符
- 整数中1出现的次数(从1到n整数中1出现的次数)