Example #1
0
 public void CheckAndSet(FrequenceType phaseName, SatelliteNumber prn)
 {
     if (!Contians(phaseName, prn))
     {
         this.data[phaseName][prn] = new List <SlipMarker>();
     }
 }
Example #2
0
        /// <summary>
        /// 对载波距离进行修正,若超出一定的距离。
        /// </summary>
        /// <param name="prn"></param>
        /// <param name="freqType"></param>
        /// <param name="PhaseRangeMinusPseudorange"></param>
        /// <returns></returns>
        private double RevisePhaseRange(SatelliteNumber prn, FrequenceType freqType, double PhaseRangeMinusPseudorange)
        {
            if (!PreviousData.ContainsKey(prn))
            {
                PreviousData[prn] = new Dictionary <FrequenceType, double>();
            }

            if (!PreviousData[prn].ContainsKey(freqType))
            {
                PreviousData[prn][freqType] = 0;
            }
            else
            {
                var prevValue = PreviousData[prn][freqType];

                if (PhaseRangeMinusPseudorange < prevValue - 750.0)
                {
                    PhaseRangeMinusPseudorange += 1500.0;
                }
                else if (PhaseRangeMinusPseudorange > prevValue + 750.0)
                {
                    PhaseRangeMinusPseudorange -= 1500.0;
                }
            }

            PreviousData[prn][freqType] = PhaseRangeMinusPseudorange;

            return(PhaseRangeMinusPseudorange);
        }
Example #3
0
 public void CheckAndSet(FrequenceType phaseName)
 {
     if (!Contians(phaseName))
     {
         this.data[phaseName] = new Dictionary <SatelliteNumber, List <SlipMarker> >();
     }
 }
        /// <summary>
        /// 获取窗口
        /// </summary>
        /// <param name="prn"></param>
        /// <param name="frequenceType"></param>
        /// <returns></returns>
        public TimeNumeralWindowData GetBufferValues(SatelliteNumber prn, FrequenceType frequenceType)
        {
            TimeNumeralWindowData window = new TimeNumeralWindowData(WindowSize);
            var buffer = this.Buffers;
            //首先从过去的
            var lastWindowOfP1 = LastWindowDataManager.GetOrCreate(BuildKey(prn, frequenceType));

            window.Add(lastWindowOfP1);

            //然后从bufffer里面提取另一半
            var bufferOfEpoches = buffer.GetSubList(0, HalfWindowSize);

            foreach (var epoch in bufferOfEpoches)
            {
                if (epoch.Contains(prn))
                {
                    var sat  = epoch[prn];
                    var time = epoch.ReceiverTime;
                    var p    = sat[frequenceType].PseudoRange.Value;//原始数据

                    window.Add(time, p);
                }
            }
            return(window);
        }
Example #5
0
        public bool Revise(ref EpochInformation info)
        {
            this.Correct(info);
            Dictionary <RinexSatFrequency, NEU> frequencyDicCorrection = this.Correction;

            foreach (var sat in info.EnabledSats)//分别对指定卫星指定频率进行改正
            {
                var satFreqs = sat.RinexSatFrequences;
                //分别执行改正
                foreach (var freqCorretion in frequencyDicCorrection)
                {
                    if (satFreqs.Contains(freqCorretion.Key))//指定类型的卫星,该卫星包含指定频率
                    {
                        //改正等效距离
                        //double rangeCorretion = CoordUtil.GetDirectionLength(freqCorretion.Value, info.ApproxXyz, sat.Ephemeris.XYZ);

                        double rangeCorretion = CoordUtil.GetDirectionLength(freqCorretion.Value, sat.Polar);

                        FrequenceType       freqType = ObsCodeConvert.GetFrequenceType(freqCorretion.Key);
                        FreqenceObservation freObs   = sat[freqType];

                        if (rangeCorretion == 0)
                        {
                            continue;
                        }
                        //  //    freObs.AddCommonCorrection(this.Name, -freqCorretion.Value.U);//若为正,其让站星观测值变小了,作为近似值改正数,应该减去

                        freObs.AddCommonCorrection(this.Name, -rangeCorretion);  //若为正,其让站星观测值变小了,作为近似值改正数,应该减去
                        //作为公共距离,还是只作为载波的改正?
                    }
                }
            }
            return(true);
        }
Example #6
0
 public List <SlipMarker> GetClipeMarkers(FrequenceType phaseA, SatelliteNumber prn)
 {
     if (Contians(phaseA, prn))
     {
         return(data[phaseA][prn]);
     }
     return(new List <SlipMarker>());
 }
Example #7
0
        /// <summary>
        /// 获取 RINEX 频率编号。
        /// </summary>
        /// <param name="satType"></param>
        /// <param name="frequenceType"></param>
        /// <returns></returns>
        public static List <int> GetRinexFrequenceNumber(SatelliteType satType, FrequenceType frequenceType)
        {
            Dictionary <FrequenceType, List <int> > dic = GetRinexFreqIndexDic(satType);

            if (dic.ContainsKey(frequenceType))
            {
                return(dic[frequenceType]);
            }
            return(new List <int>());
        }
Example #8
0
 /// <summary>
 /// 通用构造函数
 /// </summary>
 /// <param name="band">频率</param>
 /// <param name="FrequenceType">频率类型</param>
 public FreqenceObservation(Frequence band, FrequenceType FrequenceType)
 {
     this.FrequenceType       = FrequenceType;
     this.Frequence           = band;
     this.CommonCorrection    = new NumerialCorrectionDic();
     this.PhaseOnlyCorrection = new NumerialCorrectionDic();
     this.RangeOnlyCorrection = new NumerialCorrectionDic();
     this.Enabled             = true;
     this.Message             = "";
 }
        /// <summary>
        /// 设置改正的误差
        /// </summary>
        /// <param name="sat"></param>
        /// <param name="frequenceType"></param>
        private void SetPolyFitCorrection(EpochSatellite sat, FrequenceType frequenceType)
        {
            var prn = sat.Prn;
            var sp  = GetBufferValues(prn, frequenceType).GetPolyFitValue(sat.ReceiverTime, 2);

            if (sp.Rms > 10)
            {
                log.Warn("多项式平滑伪距效果差! RMS: " + sp.Rms);
                return;
            }
            var correctionOfP = sp.Value - sat[frequenceType].PseudoRange.Value;

            sat[frequenceType].PseudoRange.Corrections.Add("PolyFit", correctionOfP);
        }
Example #10
0
        /// <summary>
        /// 获取无电离层组合量,双频无电离层距离组合,返回已改正后的值。s
        /// </summary>
        /// <param name="type1"></param>
        /// <param name="type2"></param>
        /// <param name="isPsuedoOrPhaseRange">是否伪距或相位距离</param>
        /// <returns></returns>
        public PhaseCombination GetIonoFreeRangeOf(FrequenceType type1, FrequenceType type2, bool isPsuedoOrPhaseRange)
        {
            var       freA     = EpochSat[type1];
            var       freB     = EpochSat[type2];
            Frequence A        = freA.Frequence;
            Frequence B        = freB.Frequence;
            Frequence freqence = GetIonoFreeComPhaseFrequence(A, B);

            double rangeA = 0;
            double rangeB = 0;

            if (isPsuedoOrPhaseRange)
            {
                rangeA = freA.PseudoRange.CorrectedValue;
                rangeB = freB.PseudoRange.CorrectedValue;
            }
            else
            {
                rangeA = freA.PhaseRange.CorrectedValue;
                rangeB = freB.PhaseRange.CorrectedValue;
            }
            if (rangeA == 0)
            {
                if (rangeB == 0)
                {
                    log.Debug(this.EpochSat.Prn + ", " + this.EpochSat.ReceiverTime + ", 载波 “" + type1 + "”和载波 “" + type2 + "”的" + (isPsuedoOrPhaseRange?"伪距":"载波") + "都为 0 。");
                    return(new PhaseCombination(0, freqence));

                    throw new ArgumentNullException("载波 1 和载波 2 的伪距都为 0 。");
                }
                else
                {
                    return(new PhaseCombination(rangeB, freqence));
                }
            }
            else if (rangeB == 0)
            {
                return(new PhaseCombination(rangeA, freqence));
            }

            double[] facs  = GetIonoFreeRangeCombFactors(A, B);
            double   fac1  = facs[0];
            double   fac2  = facs[1];
            double   range = GetCombinationValue(fac1, rangeA, fac2, rangeB);
            //伪距也用组合
            var val = new PhaseCombination(range, freqence);

            return(val);
        }
Example #11
0
 /// <summary>
 /// 构造函数
 /// </summary>
 /// <param name="IsUseGNSSerSmoothRangeMethod"></param>
 /// <param name="ObsDataType"></param>
 /// <param name="WindowSize"></param>
 /// <param name="isWeighted"></param>
 /// <param name="FrequenceType"></param>
 /// <param name="isDeltaIonoFit"></param>
 /// <param name="OrderOfDeltaIonoPolyFit"></param>
 /// <param name="BufferSize"></param>
 /// <param name="ionoFitEpochCount"></param>
 /// <param name="SmoothRangeType"></param>
 /// <param name="IndicatedIonoDeltaFilePath"></param>
 public SingleFreqSelfIonoRangeReviser(bool IsUseGNSSerSmoothRangeMethod,
                                       SatObsDataType ObsDataType,
                                       int WindowSize,
                                       bool isWeighted,
                                       FrequenceType FrequenceType,
                                       IonoDifferCorrectionType isDeltaIonoFit,
                                       int OrderOfDeltaIonoPolyFit, int BufferSize, int ionoFitEpochCount, SmoothRangeSuperpositionType SmoothRangeType, string IndicatedIonoDeltaFilePath)
     : this(IsUseGNSSerSmoothRangeMethod,
            ObsDataType,
            WindowSize, isWeighted,
            new List <FrequenceType>() { FrequenceType },
            isDeltaIonoFit,
            OrderOfDeltaIonoPolyFit, BufferSize, ionoFitEpochCount, SmoothRangeType, IndicatedIonoDeltaFilePath)
 {
 }
Example #12
0
        /// <summary>
        /// 获取电离层格网模型延迟
        /// </summary>
        /// <param name="sat"></param>
        /// <param name="frequenceType"></param>
        /// <param name="IonoService"></param>
        /// <returns></returns>
        public static double GetGridModelCorrection(EpochSatellite sat, FrequenceType frequenceType, IIonoService IonoService)
        {
            //计算穿刺点获取电离层浓度
            var punctPoint       = sat.GetIntersectionXyz(IonoService.HeightOfModel);
            var geocentricLonLat = Geo.Coordinates.CoordTransformer.XyzToSphere(punctPoint);
            var tec = IonoService.GetSlope(sat.ReceiverTime, geocentricLonLat, sat.SphereElevation);

            if (tec == null || tec.Value == 0)
            {
                return(0);
            }
            Frequence freq            = sat[frequenceType].Frequence;
            double    slopeDelayFreqA = 1.0 * GetIonoDelayRange(tec.Value, freq.Value);//斜方向延迟

            return(slopeDelayFreqA);
        }
Example #13
0
        /// <summary>
        /// 通过前两个预报当前值。预报值采用上一段差值。
        /// </summary>
        /// <param name="prev1"></param>
        /// <param name="prev2"></param>
        /// <param name="commonPrns"></param>
        /// <param name="frequenceType"></param>
        /// <returns></returns>
        public BaseDictionary <SatelliteNumber, double> GetPredicted(
            EpochInformation prev2,
            EpochInformation prev1,
            List <SatelliteNumber> commonPrns,
            FrequenceType frequenceType)
        {
            //从前和后,两个方向预报当前星和上一个的大小
            var predictedCurrent = new BaseDictionary <SatelliteNumber, double>();

            foreach (var item in commonPrns)
            {
                var prev2Val = prev2[item][frequenceType].PhaseRange.Value;
                var prev1Val = prev1[item][frequenceType].PhaseRange.Value;
                predictedCurrent[item] = prev1Val + (prev1Val - prev2Val);//上一减去上二,得钟跳前差,以此差预报下一个
            }

            return(predictedCurrent);
        }
Example #14
0
        public static Frequence GetFrequence(SatelliteNumber prn, ObsPhaseType ObsPhaseType, Geo.Times.Time time = default(Geo.Times.Time))
        {
            FrequenceType ft = FrequenceType.A;

            switch (ObsPhaseType)
            {
            case ObsPhaseType.L1:
                ft = FrequenceType.A;
                break;

            case ObsPhaseType.L2:
                ft = FrequenceType.B;
                break;

            default:
                break;
            }
            return(GetFrequence(prn, ft, time));
        }
Example #15
0
        /// <summary>
        /// 获取,优先匹配第一个
        /// </summary>
        /// <param name="frequenceType"></param>
        /// <param name="prefix"></param>
        /// <returns></returns>
        private RinexObsValue GetRinexObsValue(FrequenceType frequenceType, params string [] prefix)
        {
            List <int> builedFreq = ObsCodeConvert.GetRinexFrequenceNumber(Prn.SatelliteType, frequenceType);

            foreach (var item in this)
            {
                foreach (var freq in builedFreq)
                {
                    foreach (var pre in prefix)
                    {
                        var keyCode = pre + freq;
                        if (item.Key.Contains(keyCode) && item.Value.Value != 0)
                        {
                            return(item.Value);
                        }
                    }
                }
            }
            return(null);
        }
Example #16
0
        public EBAFrequenceAttribute(FrequenceType type, double unit)
        {
            switch (type)
            {
            case FrequenceType.Second:
                seconds = unit;
                break;

            case FrequenceType.Minute:
                seconds = unit * 60;
                break;

            case FrequenceType.Hour:
                seconds = unit * 60 * 60;
                break;

            case FrequenceType.Day:
                seconds = unit * 60 * 60 * 24;
                break;
            }
        }
Example #17
0
        /// <summary>
        /// 通过前两个历元,预报当前历元,并与当前历元实际数值作差。返回预报差值。
        /// </summary>
        /// <param name="prev2"></param>
        /// <param name="prev1"></param>
        /// <param name="current"></param>
        /// <param name="commonPrns"></param>
        /// <param name="frequenceType"></param>
        /// <returns></returns>
        public BaseDictionary <SatelliteNumber, double> GetPredictedDiffer(
            EpochInformation prev2,
            EpochInformation prev1,
            EpochInformation current,
            List <SatelliteNumber> commonPrns,
            FrequenceType frequenceType)
        {
            var predictedCurrent = GetPredicted(prev2, prev1, commonPrns, frequenceType);
            //最后比较预报与实际二者之差
            var currentPreditceDiffer = new BaseDictionary <SatelliteNumber, double>();

            foreach (var item in commonPrns)
            {
                var predictValue = predictedCurrent[item];
                var trueVal      = current[item][frequenceType].PhaseRange.Value;

                var differ = predictValue - trueVal;

                currentPreditceDiffer[item] = differ;
            }
            return(currentPreditceDiffer);
        }
Example #18
0
        /// <summary>
        /// 通过卫星和观测类型获取频率。注意:无电离层组合默认采用L1频率
        /// </summary>
        /// <param name="prn"></param>
        /// <param name="SatObsDataType"></param>
        /// <param name="time">时间,历元,GLONASS或频分多址需要</param>
        /// <returns></returns>
        public static Frequence GetFrequence(SatelliteNumber prn, SatObsDataType SatObsDataType, Geo.Times.Time time = default(Geo.Times.Time))
        {
            FrequenceType ft = FrequenceType.A;

            switch (SatObsDataType)
            {
            case SatObsDataType.PhaseRangeA:
            case SatObsDataType.PseudoRangeA:
            case SatObsDataType.PhaseA:
            case SatObsDataType.IonoFreePhaseRange:
            case SatObsDataType.IonoFreeRange:
            case SatObsDataType.AlignedIonoFreePhaseRange:
            case SatObsDataType.AlignedIonoFreePhaseRangeOfTriFreq:
            case SatObsDataType.IonoFreePhaseRangeOfTriFreq:
            case SatObsDataType.IonoFreeRangeOfTriFreq:
                ft = FrequenceType.A;      //注意:无电离层组合默认采用L1频率,2018.11.05, czs, hmx
                break;

            case SatObsDataType.PhaseRangeB:
            case SatObsDataType.PseudoRangeB:
            case SatObsDataType.PhaseB:
                ft = FrequenceType.B;
                break;

            case SatObsDataType.PhaseRangeC:
            case SatObsDataType.PseudoRangeC:
            case SatObsDataType.PhaseC:
                ft = FrequenceType.C;
                break;

            default:
                log.Warn("无法得到可行的频率" + prn.SatelliteType + " " + SatObsDataType + " ,默认采用 " + ft);
                break;
            }
            return(GetFrequence(prn, ft, time));
        }
Example #19
0
 private static string BuildSatFreqName(EpochSatellite sat, FrequenceType freq)
 {
     return(sat.Prn + "_" + freq);
 }
Example #20
0
 /// <summary>
 /// 构造函数
 /// </summary>
 /// <param name="Prn"></param>
 /// <param name="Time"></param>
 /// <param name="ObservationNames"></param>
 public SlipMarker(SatelliteNumber Prn, Time GpsTime, FrequenceType PhaseName)
 {
     this.Prn       = Prn;
     this.GpsTime   = GpsTime;
     this.PhaseName = PhaseName;
 }
Example #21
0
        /// <summary>
        /// 获取频率带宽
        /// </summary>
        /// <param name="type">系统类型</param>
        /// <param name="freqType">频率类型</param>
        /// <param name="satNumber">卫星编号,GLONASS 系统需要</param>
        /// <param name="time">time,GLONASS 系统需要</param>
        /// <returns></returns>
        public static Frequence GetFrequenceBand(GnssType type, FrequenceType freqType, int satNumber = -1, Time time = default(Time))
        {
            switch (type)
            {
            case GnssType.GPS:
            case GnssType.SBAS:
                switch (freqType)
                {
                case FrequenceType.A: return(Frequence.GpsL1);

                case FrequenceType.B: return(Frequence.GpsL2);

                case FrequenceType.C: return(Frequence.GpsL5);

                default:
                    return(null);
                    // throw new ArgumentException("GPS 有三个频率。分别以编号1、2、3表示。");
                }

            case GnssType.Galileo:
                switch (freqType)
                {
                case FrequenceType.A: return(Frequence.GalileoE1);

                case FrequenceType.B: return(Frequence.GalileoE5a);

                case FrequenceType.C: return(Frequence.GalileoE5b);

                case FrequenceType.D: return(Frequence.GalileoE5);

                case FrequenceType.E: return(Frequence.GalileoE6);

                default:
                    return(null);
                    //  throw new ArgumentException("Galileo 有5个频率。分别以编号 1-5 表示。");
                }

            case GnssType.BeiDou:     //215786
                switch (freqType)
                {
                case FrequenceType.A: return(Frequence.CompassB1);

                case FrequenceType.B: return(Frequence.CompassB2);

                case FrequenceType.C: return(Frequence.CompassB3);

                default:
                    return(null);
                    //   throw new ArgumentException("BeiDou 有三个频率。分别以编号1、2、3表示。");
                }

            case GnssType.GLONASS:
                if (satNumber == -1)
                {
                    throw new ArgumentException("GLONASS是频分多址,需要指定卫星编号,此处有待改进!!!!请联系开发人员。");
                }
                var prn = new SatelliteNumber(satNumber, SatelliteType.R);
                var k   = (int)GlobalGlonassSlotFreqService.Instance.Get(prn, time);
                //   var k = Setting.GnsserConfig.GlonassSlotFrequences[prn];

                switch (freqType)
                {
                case FrequenceType.A: return(Frequence.GetGlonassG1(k));

                case FrequenceType.B: return(Frequence.GetGlonassG2(k));

                case FrequenceType.C: return(Frequence.GlonassG3);

                default:
                    return(null);
                    //  throw new ArgumentException("GLONASS 有2个载波。分别以编号1、2表示。");
                }

            case GnssType.QZSS:
                switch (freqType)
                {
                case FrequenceType.A: return(Frequence.GpsL1);

                case FrequenceType.B: return(Frequence.GpsL2);

                case FrequenceType.C: return(Frequence.GpsL5);

                case FrequenceType.D: return(Frequence.QzssL6);

                default:
                    return(null);
                }

            case GnssType.NAVIC:
                switch (freqType)
                {
                case FrequenceType.A: return(Frequence.NavicL5);

                default:
                    return(null);
                }

            default:

                switch (freqType)
                {
                case FrequenceType.A: return(Frequence.GpsL1);

                case FrequenceType.B: return(Frequence.GpsL2);

                case FrequenceType.C: return(Frequence.GpsL5);

                default:
                    return(null);
                }
            }

            throw new ArgumentException(type + "尚不支持,请联系管理员。");
        }
Example #22
0
 /// <summary>
 /// 设置频率类型
 /// </summary>
 /// <param name="FrequenceType"></param>
 /// <returns></returns>
 public RinexFreqObsBuilder SetFrequenceType(FrequenceType FrequenceType)
 {
     this.FrequenceType = FrequenceType; return(this);
 }
Example #23
0
        /// <summary>
        /// 校正其中一个。
        /// </summary>
        /// <param name="sat"></param>
        /// <param name="freq"></param>
        /// <param name="obsFreq"></param>
        private void ReviseOneFreq(EpochSatellite sat, FrequenceType freq, FreqenceObservation obsFreq)
        {
            double       correction       = 0;
            RmsedNumeral corredRange      = RmsedNumeral.Zero;
            var          rangeObservation = obsFreq.PseudoRange;
            double       rawRange         = rangeObservation.Value;
            double       rawPhase         = obsFreq.PhaseRange.Value;

            var PS = PhaseSmoothedRangeBuilderManager.GetOrCreate(BuildSatFreqName(sat, freq));

            double ionoDiffer = 0;

            switch (this.PhaseSmoothedRangeBuilderManager.IonoDifferCorrectionType)
            {
            case IonoDifferCorrectionType.No:
                break;

            case IonoDifferCorrectionType.DualFreqCarrier:
                ionoDiffer = sat.GetIonoLenByDifferPhase(freq);
                break;

            case IonoDifferCorrectionType.WindowPolyfit:
                break;

            case IonoDifferCorrectionType.WindowWeightedAverage:
                break;

            case IonoDifferCorrectionType.IndicatedFile:
                if (IonoDeltaTable == null)
                {
                    log.Warn("电离层延迟变化表格为NULL!无法改正");
                }
                else
                {
                    var dat = InputedIonoDelta.Get(sat.Prn.ToString());
                    if (dat != null)
                    {
                        var win = dat.GetNumeralWindowData(sat.ReceiverTime);

                        if (win != null)
                        {
                            ionoDiffer = win.GetPolyFitValue(sat.ReceiverTime, 1, 2).Value;
                        }
                    }
                }
                break;

            default:
                break;
            }

            corredRange = PS.SetReset(sat.IsUnstable)
                          .SetRawValue(sat.ReceiverTime, rawRange, rawPhase, ionoDiffer)
                          .Build();
            correction = corredRange.Value - rawRange;

            //规定:原生观测量改正到观测值上【在观测方程的左边,因此符号不变】。 //2018.05.29, czs, int hmx
            CorrectionNames name = CorrectionNames.PhaseSmoothRange;

            switch (freq)
            {
            case FrequenceType.A:
                name = CorrectionNames.PhaseSmoothRangeA;
                break;

            case FrequenceType.B:
                name = CorrectionNames.PhaseSmoothRangeB;
                break;

            case FrequenceType.C:
                name = CorrectionNames.PhaseSmoothRangeC;
                break;

            default:
                name = CorrectionNames.PhaseSmoothRange;
                break;
            }

            rangeObservation.SetCorrection(name, correction);

            sat.StdDevOfRange = corredRange.StdDev;

            //检查更新电离层改正
            if (PS is GnsserWindowedPhaseSmoothedRangeBuilder)
            {
                obsFreq.TempAmbiguityAndIonoLength = ((GnsserWindowedPhaseSmoothedRangeBuilder)PS).SmoothRangeWindow.CurrentIonoAndHalfLambdaLen;
            }
        }
Example #24
0
        /// <summary>
        /// 最简单的4历元钟跳修复法,返回改正数。
        /// </summary>
        /// <param name="prev2"></param>
        /// <param name="prev1"></param>
        /// <param name="current"></param>
        /// <param name="next"></param>
        /// <param name="frequenceType"></param>
        /// <returns></returns>
        public double GetClockJumpSeconds(EpochInformation prev2, EpochInformation prev1, EpochInformation current, EpochInformation next, FrequenceType frequenceType)
        {
            List <SatelliteNumber> commonPrns = Geo.Utils.ListUtil.GetCommons <SatelliteNumber>(current.Keys, prev1.Keys, prev2.Keys, next.Keys);

            //比较二者预报之差求后平均
            var currentPreditceDiffer = GetPredictedDiffer(prev2, prev1, current, commonPrns, frequenceType);
            //var aveVal0 = Geo.Utils.DoubleUtil.Average(currentPreditceDiffer.Values);

            //var seconds0 = 1.0 * aveVal0 / GnssConst.LIGHT_SPEED;
            //return seconds0;

            var prevPreditceDiffer = GetPredictedDiffer(next, current, prev1, commonPrns, frequenceType);//这个符号是反的
            //求预报平均值
            var aves = new BaseDictionary <SatelliteNumber, double>();

            foreach (var item in commonPrns)
            {
                aves[item] = (currentPreditceDiffer[item] - prevPreditceDiffer[item]) / 2.0;
            }
            var aveVal = Geo.Utils.DoubleUtil.Average(aves);

            var seconds = aveVal / GnssConst.LIGHT_SPEED;

            return(seconds);
        }
 string BuildKey(SatelliteNumber prn, FrequenceType frequenceType)
 {
     return(prn + "_" + frequenceType);
 }
Example #26
0
 public bool Contians(FrequenceType phaseName, SatelliteNumber prn, Time time)
 {
     return(Contians(phaseName, prn) && data[phaseName][prn].Exists(m => m.GpsTime.Equals(time)));
 }
Example #27
0
        /// <summary>
        /// 构建,如果可以,默认支持3个频率
        /// </summary>
        /// <returns></returns>
        public override EpochSatellite Build(RinexSatObsData observtion)
        {
            EpochSatellite epochSat = new EpochSatellite(this.EpochInfo, prn);
            //需要重新修改,RINEX 3.0 有的对 BDS 是 C1,C7, C6,3.02 明确规定是 C2, C7, C6
            Dictionary <FrequenceType, List <int> > freqDic = ObsCodeConvert.GetRinexFreqIndexDic(observtion.Prn.SatelliteType);
            //新算法,2018.09.24,hmx
            var freqNums = observtion.GetFrequenceNums();

            foreach (var num in freqNums)
            {
                var           prn      = observtion.Prn;
                FrequenceType freqType = ObsCodeConvert.GetFrequenceType(freqDic, num);
                Frequence     band     = Frequence.GetFrequence(prn, freqType, Time);
                if (band == null)
                {
                    band = Frequence.Default;
                    log.Warn("系统并未设置 " + prn.SatelliteType + " 的第 " + freqType + " 频率, 以 " + band + " 代替 !");
                }

                FreqenceObservation freqObs1 = FreqObsBuilder
                                               .SetFrequenceType(freqType)
                                               .SetFrequence(band)
                                               .SetRinexFrequenceNumber(num)
                                               .Build(observtion);
                epochSat.Set(freqObs1.FrequenceType, freqObs1);
            }

            //次新算法,比较繁琐,2018
            //List<FrequenceType> builded = new List<FrequenceType>();
            //foreach (var item in observtion)
            //{
            //    var num = Geo.Utils.StringUtil.GetNumber(item.Key);
            //    FrequenceType freqType = ObsCodeConvert.GetFrequenceType(freqDic, num);//   (FrequenceType)(builedFreq.IndexOf(num) + 1);

            //    if (!builded.Contains(freqType)) { builded.Add(freqType); }
            //    else { continue; }

            //    FreqenceObservation freqObs1 = FreqObsBuilder
            //                        .SetFrequenceType(freqType)
            //                        .SetRinexFrequenceNumber(num)
            //                        .Build(observtion);
            //    epochSat.Set(freqObs1.FrequenceType, freqObs1);
            //}

            /** //老算法,只支持3个频率
             #region 转换观测值到频率A、频率B、频率C的基本观测值
             * //第一频率
             * FreqenceObservation freqObs = FreqObsBuilder
             *  .SetFrequenceType(FrequenceType.A).Build(observtion);
             * epochSat.Set(freqObs.FrequenceType, freqObs);
             *
             * //第二频率
             * freqObs = FreqObsBuilder
             *  .SetFrequenceType(FrequenceType.B).Build(observtion);
             * if (freqObs != null) epochSat.Set(freqObs.FrequenceType, freqObs);
             *
             * //第三频率
             * freqObs = FreqObsBuilder
             *  .SetFrequenceType(FrequenceType.C).Build(observtion);
             * if (freqObs != null) epochSat.Set(freqObs.FrequenceType, freqObs);
             #endregion
             */

            return(epochSat);
        }
Example #28
0
 /// <summary>
 /// 获取已知卫星的频率带宽
 /// </summary>
 /// <param name="type"></param>
 /// <param name="freqtType"></param>
 /// <param name="satNumber">卫星编号,GLONASS需要</param>
 /// <returns></returns>
 public static Frequence GetFrequence(SatelliteType type, FrequenceType freqtType, int satNumber = -1, Geo.Times.Time time = default(Geo.Times.Time))
 {
     return(ObsCodeConvert.GetFrequenceBand(GnssSystem.GetGnssType(type), freqtType, satNumber, time));
 }
Example #29
0
 /// <summary>
 /// Common constructor
 /// </summary>
 /// <param name="watchFlag">cycle slip flag to be watched,默认的是L1频率的周跳标识</param>
 /// <param name="delUnstableSats">whether unstable satellites will be deleted.</param>
 /// <param name="unstableTime">unmber of fraction since last arc change that a satellite will be considered as unstable</param>
 public SatArcMarkerFilter(FrequenceType watchFlag, bool delUnstableSats, double unstableTime)
 {
     WatchCsFlag       = watchFlag;    //默认的是L1频率的周跳标识
     DeleteUnstableSat = delUnstableSats;
     UnstablePeriod    = unstableTime; //unstableTime value
 }
Example #30
0
 /// <summary>
 /// 获取频率
 /// </summary>
 /// <param name="prn"></param>
 /// <param name="frequenceType"></param>
 /// <param name="time">时间,历元,GLONASS或频分多址需要</param>
 /// <returns></returns>
 public static Frequence GetFrequence(SatelliteNumber prn, FrequenceType frequenceType, Geo.Times.Time time = default(Geo.Times.Time))
 {
     return(GetFrequence(prn.SatelliteType, frequenceType, prn.PRN, time));
 }