没有删除原来的图形。
误区
双重foreach
对原始数据foreach后又对最终数据进行foreach,这样会多出许多的多段线
Key:从列表中找到与新加入的图形相邻的图形。列表中的图形都是不需要合并的,因为在之前已经验证了他们之间的关系,只需要对新加入的图形进行判断即可。之前的方法是每次都对列表中图元之间的关系进行判断,需要考虑的因素太多,而且没有找到正确的解决方案。
合并:
list1,原始数据
list2,最终数据
循环list1
向list2中添加成员
判断list2的个数是否大于1
小于1,继续循环
大于1,调用方法,在list2中找到新加入的成员相邻的图元
若不为空,则将新加入的成员和与新加入的成员相邻的图元传入合并图元的方法
向list2中加入合并完成后的豫园
在list2中去除合并的两个图元
完成
/// <summary>
/// 得到合并相邻的图形后的图形列表
/// </summary>
/// <param name="hPlyList"></param>
/// <returns></returns>
private List<Polyline> GetMergePolylineList(List<Polyline> hPlyList)
{
List<Polyline> plys = new List<Polyline>();
PolylineEditService service = new PolylineEditService();
//循环所有多段线
foreach (Polyline ply in hPlyList)
{
plys.Add(ply);
if (plys.Count < 2)
{
continue;
}
Polyline plyIntersect = this.GetIntersectPly(ply, plys);
//判断多段线是否相邻
if (plyIntersect != null)
{
List<Polyline> list = new List<Polyline>();
list.Add(ply);
list.Add(plyIntersect);
//合并多段线
Polyline plyUnion = service.GetUnionPolylines(list);
plys.Add(plyUnion);
plys.Remove(ply);
plys.Remove(plyIntersect);
}
}
return plys;
}
/// <summary>
/// 从列表中找到相邻的图形
/// </summary>
/// <param name="ply"></param>
/// <param name="plys"></param>
/// <returns></returns>
private Polyline GetIntersectPly(Polyline ply, List<Polyline> plys)
{
foreach (var item in plys)
{
if (item.Handle.Value.ToString().Equals(ply.Handle.Value.ToString()))
{
continue;
}
//判断多段线是否相邻
if (item.IsIntersectPolyline(ply))
{
return item;
}
}
return null;
}
/// <summary>
/// 得到合并之后的多段线
/// </summary>
/// <param name="plyList"></param>
/// <returns></returns>
public Polyline GetUnionPolylines(List<Polyline> plyList)
{
List<GeoAPI.Geometries.IGeometry> polygons = new List<GeoAPI.Geometries.IGeometry>();
foreach (var ply in plyList)
{
PolylineObject plyObj = new PolylineObject(ply);
List<PointModel> points = plyObj.GetPointModelList();
if (points.Count > 0)
{
GeoAPI.Geometries.IPolygon polygon = PolygonUtil.GetPolygon(points);
polygons.Add(polygon);
}
}
List<PointModel> pts = PolygonUtil.GetUninonPolygon(polygons);
if (pts == null || pts.Count == 0)
{
return null;
}
Polyline plyUnion = new Polyline(pts.Count);
for (int i = 0; i < pts.Count; i++)
{
PointModel ptModel = pts[i];
Point2d pt = new Point2d(ptModel.X, ptModel.Y);
plyUnion.AddVertexAt(i, pt, 0, 0, 0);
}
return plyUnion;
}