Esempio n. 1
0
        /// <summary>
        /// 初探
        /// </summary>
        /// <param name="info"></param>
        public override void RawRevise(RinexEpochObservation info)
        {
            if (Option.IsAmendBigCs)
            {
                foreach (var sat in info)
                {
                    var  wlen     = Frequence.GetFrequence(sat.Prn, 1, info.ReceiverTime).WaveLength;
                    var  window   = this.PhaseACycleSlipAmender.GetOrCreate(sat.Prn);
                    var  referVal = sat.RangeA.Value / wlen;
                    bool isRested = false;
                    sat.PhaseA.Value = window.FitCheckAddAndAlignWithStep(info.ReceiverTime, sat.PhaseA.Value, out isRested, referVal, 2, 50, 100);
                    //若重置,则应该标记周跳或失锁
                    if (isRested)
                    {
                        sat.PhaseA.LossLockIndicator = LossLockIndicator.Bad;
                    }
                }
            }

            if (Option.IsEnableAlignPhase)
            {
                foreach (var sat in info)
                {
                    var NumericalAligner = NumericalAlignerManagerPhaseA.GetOrCreate(sat.Prn);
                    var phaseA           = sat.PhaseA;
                    var rangeA           = sat.RangeA.Value / Frequence.GetFrequence(sat.Prn, 1, info.ReceiverTime).WaveLength;

                    phaseA.Value = NumericalAligner.GetAlignedValue(info.ReceiverTime, phaseA.Value, rangeA);
                }
            }

            base.RawRevise(info);
            CheckAndFiltSmallSpan(info);
        }
Esempio n. 2
0
        /// <summary>
        /// 相等否
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public override bool Equals(object obj)
        {
            Frequence o = obj as Frequence;

            if (o == null)
            {
                return(false);
            }

            return(Name == (o.Name) && Value == o.Value);
        }
Esempio n. 3
0
        /// <summary>
        /// 注册
        /// </summary>
        /// <param name="result"></param>
        public void Regist(TwoSitePeriodDifferPositionResult result)
        {
            //单位化为周,若是GLONASS 将重新考虑!!2018.09.26, czs, hmx
            Vector vector = result.FloatAmbiguities / Frequence.GetFrequence(result.Material.EnabledPrns[0], SatObsDataType, result.ReceiverTime).WaveLength;

            var vector2 = AmbiguityFixer.GetFixedAmbiguities(new WeightedVector(vector));
            //var vector3 = vector2 * Frequence.WaveLength;
            var time = result.MaterialObj.Last.ReceiverTime;

            Regist(time, vector2);
        }
Esempio n. 4
0
 /// <summary>
 /// 对应的频率
 /// </summary>
 /// <param name="satNum">卫星编号,如果码分多址则不需要,频分多址则需要,如GLONASS</param>
 /// <returns></returns>
 public Frequence GetFrequence(int satNum = -1, Time time = default(Time))
 {
     return(Frequence.GetFrequence(SatelliteType, RinexCarrierNumber, satNum, time));
 }
Esempio n. 5
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, Geo.Times.Time time = default(Geo.Times.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:
                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);
                }
                break;
            }

            throw new ArgumentException(type + "尚不支持,请联系管理员。");
        }
Esempio n. 6
0
        /// <summary>
        /// 处理过程
        /// </summary>
        /// <param name="current"></param>
        public override void Process(RinexEpochObservation current)
        {
            if (current.Count == 0)
            {
                return;
            }

            //需要缓存支持,建立头文件
            if (this.CurrentIndex == 0 || CurrentHeader == null)
            {
                //首次建立头文件,需要缓存支持
                this.CurrentHeader = BuildOutputHeader(OldHeader);
            }


            //移除观测值为 0 的载波相位
            if (Option.IsRemoveZeroPhaseSat)
            {
                List <SatelliteNumber> tobeDeletes = new List <SatelliteNumber>();
                foreach (var sat in current)
                {
                    foreach (var item in CurrentHeader.ObsCodes)
                    {
                        if (sat.Prn.SatelliteType == item.Key)
                        {
                            foreach (var code in item.Value)
                            {
                                if (code.StartsWith("L") && sat.TryGetValue(code) == 0)
                                {
                                    tobeDeletes.Add(sat.Prn);
                                }
                            }
                        }
                    }
                }
                current.Remove(tobeDeletes);
            }


            //移除观测值为 0 的伪距
            if (Option.IsRemoveZeroRangeSat)
            {
                List <SatelliteNumber> tobeDeletes = new List <SatelliteNumber>();
                foreach (var sat in current)
                {
                    foreach (var item in CurrentHeader.ObsCodes)
                    {
                        if (sat.Prn.SatelliteType == item.Key)
                        {
                            foreach (var code in item.Value)
                            {
                                if ((code.StartsWith("C") || code.StartsWith("P")) && sat.TryGetValue(code) == 0)
                                {
                                    tobeDeletes.Add(sat.Prn);
                                }
                            }
                        }
                    }
                }
                current.Remove(tobeDeletes);
            }

            //修复大周跳
            if (Option.IsAmendBigCs)
            {
                foreach (var sat in current)
                {
                    //第一频率
                    var  wlenA    = Frequence.GetFrequence(sat.Prn, 1, current.ReceiverTime).WaveLength;
                    var  window   = this.PhaseACycleSlipAmender.GetOrCreate(sat.Prn);
                    var  referVal = sat.RangeA.Value / wlenA;
                    bool isRested = false;
                    sat.PhaseA.Value = window.FitCheckAddAndAlignWithStep(current.ReceiverTime, sat.PhaseA.Value, out isRested, referVal, 2, 50, 100);
                    //若重置,则应该标记周跳或失锁
                    if (isRested)
                    {
                        sat.PhaseA.LossLockIndicator = LossLockIndicator.Bad;
                    }
                    //第二频率
                    var phaseB = sat.PhaseB;
                    if (phaseB != null)
                    {
                        var  wlenB     = Frequence.GetFrequence(sat.Prn, 2, current.ReceiverTime).WaveLength;
                        var  windowB   = this.PhaseBCycleSlipAmender.GetOrCreate(sat.Prn);
                        var  referValB = sat.RangeB.Value / wlenB;
                        bool isRestedB = false;
                        sat.PhaseB.Value = windowB.FitCheckAddAndAlignWithStep(current.ReceiverTime, sat.PhaseB.Value, out isRested, referValB, 2, 50, 100);
                        //若重置,则应该标记周跳或失锁
                        if (isRestedB)
                        {
                            sat.PhaseB.LossLockIndicator = LossLockIndicator.Bad;
                        }
                    }
                }
            }

            //是否启用A B 相位对齐
            if (Option.IsEnableAlignPhase)
            {
                foreach (var sat in current)
                {
                    var NumericalAligner = NumericalAlignerManagerPhaseA.GetOrCreate(sat.Prn);
                    var phaseA           = sat.PhaseA;
                    var rangeA           = sat.RangeA.Value / Frequence.GetFrequence(sat.Prn, 1, current.ReceiverTime).WaveLength;

                    phaseA.Value = NumericalAligner.GetAlignedValue(current.ReceiverTime, phaseA.Value, rangeA);


                    var phaseB = sat.PhaseB;
                    if (phaseB != null)
                    {
                        var NumericalAlignerB = NumericalAlignerManagerPhaseB.GetOrCreate(sat.Prn);
                        var rangeB            = sat.RangeB.Value / Frequence.GetFrequence(sat.Prn, 2, current.ReceiverTime).WaveLength;

                        phaseB.Value = NumericalAlignerB.GetAlignedValue(current.ReceiverTime, phaseB.Value, rangeB);
                    }
                }
            }
            //载波相位相位转换为距离
            if (Option.IsConvertPhaseToLength)
            {
                foreach (var item in current)
                {
                    if (item.Prn.SatelliteType == SatelliteType.G)
                    {
                        foreach (var val in item)
                        {
                            if (val.Key.Contains("L1"))
                            {
                                val.Value.Value = val.Value.Value * Frequence.GpsL1.WaveLength;
                            }
                            if (val.Key.Contains("L2"))
                            {
                                val.Value.Value = val.Value.Value * Frequence.GpsL2.WaveLength;
                            }
                        }
                    }
                }
            }

            //update
            PrevOkEpoch    = current.ReceiverTime;
            current.Header = this.CurrentHeader;

            //判断并写入文件
            WriteToFile(current);
        }