/// <summary>递归找到对应河流,同时记录对应支流对应交汇点</summary>
        /// <param name="CCorrespondRiverLt">对应河流记录列</param>
        /// <param name="pBSRiver">大比例尺表达河流</param>
        /// <param name="pSSRiver">小比例尺表达河流</param>
        /// <param name="pParameterThreshold">阈值参数</param>
        /// <remarks ></remarks>
        private void RecursiveFindCorrespondRiverLt(ref List <CCorrespondRiver> CCorrespondRiverLt, CRiver pBSRiver, CRiver pSSRiver, CParameterThreshold pParameterThreshold)
        {
            //建立河流对应关系
            pBSRiver.CCorrRiver = pSSRiver;
            pSSRiver.CCorrRiver = pBSRiver;
            CCorrespondRiver pCorrespondRiver = new CCorrespondRiver(pSSRiver, pBSRiver);

            pCorrespondRiver.blnCorr = true;
            CCorrespondRiverLt.Add(pCorrespondRiver);

            //如果小比例尺表达河流分支不存在
            if (pSSRiver.CTributaryLt == null)
            {
                return;
            }

            //数据准备
            pBSRiver.CCorrTriJunctionPtLt = new List <CPoint>();
            pSSRiver.CCorrTriJunctionPtLt = new List <CPoint>();
            List <CRiver> pBSTributaryLt = pBSRiver.CTributaryLt;
            List <CRiver> pSSTributaryLt = new List <CRiver>();

            pSSTributaryLt.AddRange(pSSRiver.CTributaryLt);

            //遍历寻找对应河流
            for (int i = 0; i < pBSTributaryLt.Count; i++)
            {
                bool blnIsOverlap = false;
                for (int j = 0; j < pSSTributaryLt.Count; j++)
                {
                    blnIsOverlap = CGeoFunc.IsOverlap(pBSTributaryLt[i], pSSTributaryLt[j], pParameterThreshold.dblOverlapRatio);  //判断两河流是否重叠
                    if (blnIsOverlap == true)
                    {
                        pBSRiver.CCorrTriJunctionPtLt.Add(pBSTributaryLt[i].Tocpt2);
                        pSSRiver.CCorrTriJunctionPtLt.Add(pSSTributaryLt[j].Tocpt2);
                        RecursiveFindCorrespondRiverLt(ref CCorrespondRiverLt, pBSTributaryLt[i], pSSTributaryLt[j], pParameterThreshold); //递归找到对应河流
                        pSSTributaryLt.RemoveAt(j);
                        break;
                    }
                }
            }

            //记录对应交汇点的目的是有助于将原河流进行对应分割以提高精度
            //大多数情况下,交汇点都是“三叉路口”,此时数组"CCorrTriJunctionPtLt"中不会有重合点
            //但当交汇点为“四、五甚至更多叉路口”时,数组"CCorrTriJunctionPtLt"中有重合点,应只保留其中一个点
            for (int i = pBSRiver.CCorrTriJunctionPtLt.Count - 1; i > 0; i--)
            {
                if (pBSRiver.CCorrTriJunctionPtLt[i].Equals2D(pBSRiver.CCorrTriJunctionPtLt[i - 1]))
                {
                    pBSRiver.CCorrTriJunctionPtLt.RemoveAt(i);
                    pSSRiver.CCorrTriJunctionPtLt.RemoveAt(i);
                }
            }
        }
Пример #2
0
        /// <summary>找对应河流</summary>
        /// <param name="CBSRiverLt">大比例尺表达河流</param>
        /// <param name="CSSRiverLt">小比例尺表达河流</param>
        /// <param name="pParameterThreshold">阈值参数</param>
        /// <returns>对应河流列</returns>
        /// <remarks>对应河流的数据记录在对应河网</remarks>
        private List <CCorrespondRiver> FindCorrespondRiverLt(List <CRiver> CBSRiverLt, List <CRiver> CSSRiverLt, CParameterThreshold pParameterThreshold)
        {
            List <CCorrespondRiver> pCorrespondRiverLt = new List <CCorrespondRiver>();

            for (int i = 0; i < CBSRiverLt.Count; i++)
            {
                for (int j = 0; j < CSSRiverLt.Count; j++)
                {
                    bool blnIsOverlap = CGeoFunc.IsOverlap(CBSRiverLt[i], CSSRiverLt[j], pParameterThreshold.dblOverlapRatio);
                    if (blnIsOverlap == true)
                    {
                        CBSRiverLt[i].CCorrRiver = CSSRiverLt[j];
                        CSSRiverLt[j].CCorrRiver = CBSRiverLt[i];
                        CCorrespondRiver pCorrespondRiver = new CCorrespondRiver(CBSRiverLt[i], CSSRiverLt[j]);
                        pCorrespondRiverLt.Add(pCorrespondRiver);
                        CSSRiverLt.RemoveAt(j);
                        break;
                    }
                }
            }
            return(pCorrespondRiverLt);
        }