您的位置:首页 > 编程语言

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

2016-07-28 15:29 387 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: