public void TestRadixSort() { var arr = new[] { 122, 39, 42, 547, 79, 48, 61, 62, 965, 55, 232 }; MaxGap.RadixSort(arr, 3); Assert.AreEqual(arr[0], 39); }
public void TestMaxGap() { var arr = new[] { 4, 10, 3, 100, 44 }; var r = MaxGap.GetGap(arr); Assert.AreEqual(r, 56); }
/// <summary> /// 拟合输出。 /// 当前策略,在众多数据源中,选择包含有效时间段内的进行计算并返回。 /// 待改进:如果有精密星历。。。。。 /// </summary> /// <param name="prn">卫星编号</param> /// <param name="gpsTime">时刻</param> /// <returns></returns> public override Ephemeris Get(SatelliteNumber prn, Time gpsTime) { if (!IsAvailable(gpsTime, prn.SatelliteType)) { return(null); } List <IEphemerisService> sources = this.dic[prn.SatelliteType]; //直接获取之 if (sources.Count == 0) { return(null); } bool caculated = false;//标记是否计算过 //获取星历并赋权 List <Ephemeris> results = new List <Ephemeris>(); foreach (var source in sources) { if (source.TimePeriod.Contains(gpsTime) || (source.TimePeriod.BufferedEnd >= gpsTime && source.TimePeriod.BufferedStart <= gpsTime)) { caculated = true; //是否包含这颗卫星 if (!source.Prns.Contains(prn)) { continue; } var result = source.Get(prn, gpsTime); if (result == null) { continue; } //赋权,只有一个就不用比较了。 if (sources.Count != 1 && result.Rms == null) { result.Rms = EphemerisUtil.GetRms(source.ServiceType); } results.Add(result); } } //别无二家,只能用它 if (results.Count == 1) { return(results[0]); } //根据权重进行选取 if (results.Count != 0) { var result = results[0]; foreach (var item in results) { if (result.Rms.Length > item.Rms.Length) { result = item; } } return(result); } //计算失败了,可能是根本就没有这颗卫星,继续计算仍然将失败。 if (caculated) { return(null); } //以上已经排除在单独文件有效范围内了。 //下面看是否在这些文件有效时间范围间隙内。 //如果在整体时间段内,但不在单独文件范围内,则前后联合起来加密, //如果间隔太远(如超过半天)则效果不好,因此在数据录入时应该判断。 //选择前后最接近的两个文件,这个时间段的起点部分在一个文件时间末尾,结束部分在一个文件的开始时间处。 //检查是否在可用的间隙内 var two = GetNearstService(gpsTime, prn.SatelliteType); IEphemerisService first = two[0]; IEphemerisService second = two[1]; double gap = (double)(two[1].TimePeriod.Start - two[0].TimePeriod.End); if (this.MaxGap.TotalSeconds < gap) { throw new Exception("星历间隙太大:" + TimeSpan.FromSeconds(gap).ToString() + ", 最大允许:" + MaxGap.ToString()); } //合并两者 //获取一个小时的数据,时间间隔为5分钟 List <Ephemeris> infosA = first.Gets(prn, first.TimePeriod.BufferedEnd - 3600, first.TimePeriod.BufferedEnd, 5 * 60); List <Ephemeris> infosB = second.Gets(prn, second.TimePeriod.BufferedStart, second.TimePeriod.BufferedStart + 3600, 5 * 60); List <Ephemeris> infosAList = new List <Ephemeris>(); foreach (var item in infosA) { if (item != null) { infosAList.Add(item); } } foreach (var item in infosB) { if (item != null) { infosAList.Add(item); } } //是否没有该星的服务 if (infosAList.Count == 0) { return(null); } EphemerisInterpolator interp = new EphemerisInterpolator(infosAList); var finalResult = interp.GetEphemerisInfo(gpsTime); return(finalResult);//怎样考虑精度信息????2014.12.26,czs //如果还不行 throw new NotImplementedException("数据源提供的信息暂不支持 " + prn + " 在 " + gpsTime + " 的解算。"); }