示例#1
0
        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);
        }
示例#2
0
        public void TestMaxGap()
        {
            var arr = new[] { 4, 10, 3, 100, 44 };
            var r   = MaxGap.GetGap(arr);

            Assert.AreEqual(r, 56);
        }
示例#3
0
        /// <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 + " 的解算。");
        }