多个图元合并其中相邻的图元

没有删除原来的图形。

误区
双重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;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值