ArcEngine 删除线、面重叠节点

23 篇文章 5 订阅
//删除要素重叠节点
public bool DelOverlapVertex(IWorkspace workspace, string strTable, IProgressor progressor)
{
	bool result;
	try
	{
		IWorkspaceEdit workspaceEdit = null;
		IFeatureWorkspace featureWorkspace = workspace as IFeatureWorkspace;
		IFeatureClass featureClass = featureWorkspace.OpenFeatureClass(strTable);
		switch (featureClass.ShapeType)
		{
		case 3:
			this.DelLineOverlapVertex(featureClass, progressor);
			break;
		case 4:
			this.DelAreaOverlapVertex(featureClass, progressor);
			break;
		default:
			MessageBox.Show("删除多余节点,不支持的要素类型");
			break;
		}
		if (workspaceEdit != null)
		{
			workspaceEdit.StopEditOperation();
			workspaceEdit.StopEditing(true);
			ComReleaser.ReleaseCOMObject(workspaceEdit);
		}
		return true;
	}
	catch (Exception ex)
	{
		Trace.WriteLine(ex.Message);
		result = false;
	}
	return result;
}





///删除面要素重复节点
public string DelAreaOverlapVertex(IFeatureClass featureClass, IProgressor progressor)
{
	progressor.Message = "删除重叠节点";
	featureClass.FeatureCount(null);
	StringBuilder stringBuilder = new StringBuilder();
	IFeatureCursor featureCursor = featureClass.Search(null, true);
	int num = featureCursor.FindField("OBJECTID");
	for (IFeature feature = featureCursor.NextFeature(); feature != null; feature = featureCursor.NextFeature())
	{
		progressor.Step();
		int num2 = (int)feature.get_Value(num);
		IPolygon4 polygon = feature.ShapeCopy as IPolygon4;
		IGeometryBag exteriorRingBag = polygon.ExteriorRingBag;
		IEnumGeometry enumGeometry = exteriorRingBag as IEnumGeometry;
		enumGeometry.Reset();
		int num3 = -1;
		for (IRing ring = enumGeometry.Next() as IRing; ring != null; ring = (enumGeometry.Next() as IRing))
		{
			IGeometryBag geometryBag = polygon.get_InteriorRingBag(ring);
			int num4 = polygon.get_InteriorRingCount(ring);
			IEnumGeometry enumGeometry2 = geometryBag as IEnumGeometry;
			enumGeometry2.Reset();
			bool flag = false;
			for (;;)
			{
				ISegmentCollection segmentCollection;
				if (flag)
				{
					if (num4 == 0)
					{
						break;
					}
					IRing ring2 = enumGeometry2.Next() as IRing;
					if (ring2 == null)
					{
						break;
					}
					num3++;
					segmentCollection = (ring2 as ISegmentCollection);
				}
				else
				{
					num3++;
					segmentCollection = (ring as ISegmentCollection);
				}
				IPointCollection pointCollection = segmentCollection as IPointCollection;
				IPoint point = pointCollection.get_Point(0);
				for (int i = 1; i < pointCollection.PointCount; i++)
				{
					IPoint point2 = pointCollection.get_Point(i);
					double num5 = Math.Sqrt(Math.Pow(point2.X - point.X, 2.0) + Math.Pow(point2.Y - point.Y, 2.0));
					if (num5 <= 0.001)
					{
						pointCollection.RemovePoints(i, 1);
						stringBuilder.AppendLine(string.Concat(new object[]
						{
							num2,
							"号图形part",
							num3,
							"删除了第",
							i,
							"个节点。"
						}));
						i--;
					}
					else
					{
						point = point2;
					}
				}
				polygon.SimplifyPreserveFromTo();
				flag = true;
			}
		}
		feature.Shape = polygon;
		feature.Store();
	}
	ComReleaser.ReleaseCOMObject(featureCursor);
	return stringBuilder.ToString();
}

///删除线重叠节点
public string DelLineOverlapVertex(IFeatureClass featureClass, IProgressor progressor)
{
	progressor.Message = "删除重叠节点";
	featureClass.FeatureCount(null);
	StringBuilder stringBuilder = new StringBuilder();
	IFeatureCursor featureCursor = featureClass.Search(null, true);
	int num = featureCursor.FindField("OBJECTID");
	int num2 = 0;
	for (IFeature feature = featureCursor.NextFeature(); feature != null; feature = featureCursor.NextFeature())
	{
		progressor.Step();
		int num3 = (int)feature.get_Value(num);
		IPolyline4 polyline = feature.ShapeCopy as IPolyline4;
		polyline.SimplifyNetwork();
		IPointCollection pointCollection = polyline as IPointCollection;
		IPoint point = pointCollection.get_Point(0);
		for (int i = 1; i < pointCollection.PointCount; i++)
		{
			IPoint point2 = pointCollection.get_Point(i);
			double num4 = Math.Sqrt(Math.Pow(point2.X - point.X, 2.0) + Math.Pow(point2.Y - point.Y, 2.0));
			if (num4 <= 0.001)
			{
				pointCollection.RemovePoints(i, 1);
				stringBuilder.AppendLine(string.Concat(new object[]
				{
					num3,
					"号图形删除了第",
					i,
					"个节点。"
				}));
				i--;
				num2++;
			}
			else
			{
				point = point2;
			}
		}
		polyline.SimplifyNetwork();
		feature.Shape = polyline;
		feature.Store();
	}
	ComReleaser.ReleaseCOMObject(featureCursor);
	stringBuilder.AppendLine("共有" + num2.ToString() + "个节点被删除");
	return stringBuilder.ToString();
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

QQ359677345

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值