/// <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); } } }
/// <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); }