/// <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); }
/// <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); }
/// <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); }
/// <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)); }
/// <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 + "尚不支持,请联系管理员。"); }
/// <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); }