/// <summary> /// 观测量构造函数。 /// </summary> /// <param name="rawPhaseValue">相位观测值</param> /// <param name="Frequence">频率</param> /// <param name="ObservationCode"></param> /// <param name="LossLockIndicator"></param> /// <param name="SignalStrength"></param> public PhaseRangeObservation(double rawPhaseValue, ObservationCode ObservationCode, Frequence Frequence, int SignalStrength = 50, LossLockIndicator LossLockIndicator = LossLockIndicator.OK) : base(rawPhaseValue * Frequence.WaveLength, ObservationCode) { this.Frequence = Frequence; this.RawPhaseValue = rawPhaseValue; this.LossLockIndicator = LossLockIndicator; this.SignalStrength = SignalStrength; }
/// <summary> /// 创建,转换为RINEX格式 /// </summary> /// <param name="epochSat"></param> /// <returns></returns> public override RinexSatObsData Build(EpochSatellite epochSat) { RinexSatObsData rinex = new RinexSatObsData(); rinex.Prn = epochSat.Prn; foreach (var observtion in epochSat) { //C1 ,可能有多种伪距的情况 var cc = observtion.GetPseudoRanges(); foreach (var c in cc) { RinexObsValue C = new RinexObsValue(c.Value, c.ObservationCode); var obsCode = c.ObservationCode; if (IsUseCorrectedOfRange) //观测值更新 { C.Value = c.CorrectedValue; if (c.ContainsCorrection(CorrectionNames.DcbP1C1.ToString())) { ObservationCode.ChagngeCaToP(ref obsCode); } } var rinexCode = c.ObservationCode.GetRinexCode(RinexVersion); rinex.Add(rinexCode, C); } //L1 var l = observtion.PhaseRange; RinexObsValue L = new RinexObsValue(l.RawPhaseValue, l.ObservationCode); L.LossLockIndicator = observtion.PhaseRange.LossLockIndicator; //还给你 if (epochSat.IsUnstable) //如果探测出周跳,则重新标记为有周跳。 { L.LossLockIndicator = LossLockIndicator.CyclePossible1; } L.SignalStrength = observtion.PhaseRange.SignalStrength; var lcode = l.ObservationCode.GetRinexCode(RinexVersion); rinex.Add(lcode, L); } return(rinex); }
private static void BuildObsCodeLineRinexV3(RinexObsFileHeader header, StringBuilder sb) { //每一类型卫星遍历 foreach (var satType in header.SatelliteTypes) { //第一行 var types = header.GetOrInitObsCodes(satType); StringBuilder lineSb = new StringBuilder(); lineSb.Append(StringUtil.FillSpaceRight(satType.ToString(), 3)); var count = types.Count; lineSb.Append(StringUtil.FillSpaceLeft(count + "", 3)); double lineCount = Math.Ceiling(count / 13.0d); //一行最多13个 int i = 0; foreach (var valType in types) { //此处还需要做转换 var val = new ObservationCode(valType).GetRinexCode(3); lineSb.Append(StringUtil.FillSpaceLeft(val, 4)); i++; if (i % 13 == 0 && i != 0) { sb.AppendLine(StringUtil.FillSpaceRight(lineSb.ToString(), 60) + RinexHeaderLabel.SYS_OBS_TYPES); lineSb.Clear(); lineSb.Append(StringUtil.FillSpaceLeft("", 6)); } } if (lineSb.Length != 0) { sb.AppendLine(StringUtil.FillSpaceRight(lineSb.ToString(), 60) + RinexHeaderLabel.SYS_OBS_TYPES); lineSb.Clear(); } } }
/// <summary> /// RTCM MSM文件信息转换为观测文件信息.此处返回的是RINEX3.0的数据类型。 /// </summary> /// <param name="msg"></param> /// <param name="HeaderOfMSM"></param> /// <returns></returns> public RinexEpochObservation GetRinexEpochObservation(BaseMSM msg, HeaderOfMSM HeaderOfMSM) { RinexEpochObservation RinexEpochObservation = new RinexEpochObservation(); uint messageNumber = HeaderOfMSM.MessageNumber; double wavelength = 0; int frequencyBand = 0; string str = null; string attribute = null; double P = 0, L = 0, D = 0, S = 0; int j = 0; int index = 0; double p = 0; SatelliteType satType = SatelliteType.G; for (int i = 0; i < HeaderOfMSM.SatCount; i++) { RinexSatObsData SatObsData = new RinexSatObsData(); for (int k = 0; k < HeaderOfMSM.Nsig; k++) { if (HeaderOfMSM.CellMask[index++] == 0) { continue; } if (messageNumber >= 1071 && messageNumber <= 1077)//GPS { satType = SatelliteType.G; SatObsData.Prn = new SatelliteNumber(HeaderOfMSM.SatlliteMask[i], SatelliteType.G); str = msm_sig_gps[HeaderOfMSM.SignalMask[k] - 1]; frequencyBand = int.Parse(str.Substring(0, 1)); attribute = str.Substring(1, 1); if (frequencyBand == 1) { wavelength = Frequence.GpsL1.WaveLength; } else if (frequencyBand == 2) { wavelength = Frequence.GpsL2.WaveLength; } else if (frequencyBand == 5) { wavelength = Frequence.GpsL5.WaveLength; } } else if (messageNumber >= 1081 && messageNumber <= 1087)//GLONASS { satType = SatelliteType.R; SatObsData.Prn = new SatelliteNumber(HeaderOfMSM.SatlliteMask[i], SatelliteType.R); } else if (messageNumber >= 1091 && messageNumber <= 1097)//GALILEO { satType = SatelliteType.E; SatObsData.Prn = new SatelliteNumber(HeaderOfMSM.SatlliteMask[i], SatelliteType.E); } else if (messageNumber >= 1101 && messageNumber <= 1017)//SBS { satType = SatelliteType.S; SatObsData.Prn = new SatelliteNumber(HeaderOfMSM.SatlliteMask[i], SatelliteType.S); } else if (messageNumber >= 1111 && messageNumber <= 1117)//QZS { satType = SatelliteType.J; SatObsData.Prn = new SatelliteNumber(HeaderOfMSM.SatlliteMask[i], SatelliteType.J); } else if (messageNumber >= 1121 && messageNumber <= 1127)//BDS { satType = SatelliteType.C; SatObsData.Prn = new SatelliteNumber(HeaderOfMSM.SatlliteMask[i], SatelliteType.C); str = msm_sig_gps[HeaderOfMSM.SignalMask[k] - 1]; frequencyBand = int.Parse(str.Substring(0, 1)); attribute = str.Substring(1, 1); if (frequencyBand == 2) { wavelength = Frequence.CompassB1.WaveLength; } else if (frequencyBand == 6) { wavelength = Frequence.CompassB3.WaveLength; } else if (frequencyBand == 7) { wavelength = Frequence.CompassB2.WaveLength; } } var ObservationCodeOfC = new ObservationCode(ObservationType.C, frequencyBand, attribute); var ObservationCodeOfL = new ObservationCode(ObservationType.L, frequencyBand, attribute); var ObservationCodeOfS = new ObservationCode(ObservationType.S, frequencyBand, attribute); var ObservationCodeOfD = new ObservationCode(ObservationType.D, frequencyBand, attribute); if (msg.NumberOfIntegerMsInSatRoughRange.Count != 0) { p = msg.NumberOfIntegerMsInSatRoughRange[i] * 0.001 + msg.SatelliteRoughRangesModulo1ms[i] * Math.Pow(2, -13); } else { p = msg.SatelliteRoughRangesModulo1ms[i] * Math.Pow(2, -13); } if (msg.SignalFinePseudorange.Count != 0) { P = msg.SignalFinePseudorange[j] * Math.Pow(2, -24) + p; } else if (msg.SignalFinePseudorangeWithExtendedResolution.Count != 0) { P = msg.SignalFinePseudorangeWithExtendedResolution[j] * Math.Pow(2, -29) + p; } P = P * RtcmConst.LightSpeedPerMillisecond; if (msg.SignalFinePhaseRange.Count != 0) { L = msg.SignalFinePhaseRange[j] * Math.Pow(2, -29) + p; } else if (msg.SignalFinePhaseRangeWithExtendedResolution.Count != 0) { L = msg.SignalFinePhaseRangeWithExtendedResolution[j] * Math.Pow(2, -31) + p; } L = L * RtcmConst.LightSpeedPerMillisecond / wavelength; if (msg.PhaseRangeLockTimeIndicator.Count != 0) { S = msg.PhaseRangeLockTimeIndicator[j]; } else if (msg.PhaseRangeLockTimeIndicatorWithExtendedRangeAndResolution[j] != 0) { S = msg.PhaseRangeLockTimeIndicatorWithExtendedRangeAndResolution[j]; } if (messageNumber % 10 == 5 || messageNumber % 10 == 7 && msg.SatRoughPhaseRangeRate.Count != 0) { if (msg.SatRoughPhaseRangeRate[i] > -1638.4) { D = -(msg.SatRoughPhaseRangeRate[i] * 0.001 + msg.SignalFinePhaseRangeRate[j] * 0.0001) / wavelength; } } SatObsData.Add(ObservationCodeOfC.ToString(), P); SatObsData.Add(ObservationCodeOfL.ToString(), L); SatObsData.Add(ObservationCodeOfS.ToString(), S); SatObsData.Add(ObservationCodeOfD.ToString(), D); //更新头部信息 var obsCodes = new List <string>(); obsCodes.Add(ObservationCodeOfC.ToString()); obsCodes.Add(ObservationCodeOfL.ToString()); obsCodes.Add(ObservationCodeOfS.ToString()); obsCodes.Add(ObservationCodeOfD.ToString()); if (ObsHeader != null) { ObsHeader.ObsCodes[satType] = obsCodes; } j++; } RinexEpochObservation.Add(SatObsData.Prn, SatObsData); } RinexEpochObservation.Header = ObsHeader; RinexEpochObservation.ReceiverTime = HeaderOfMSM.EpochTime; return(RinexEpochObservation); }
/// <summary> /// 观测量构造函数。 /// </summary> /// <param name="val">改正值</param> /// <param name="CommonCorrection">改正器,也可以后来赋值</param> public ObservationWithCommonCorrection(double val, NumerialCorrectionDic CommonCorrection, ObservationCode ObservationCode) : base(val, ObservationCode) { this.CommonCorrection = CommonCorrection; }
/// <summary> /// 观测量构造函数。 /// </summary> /// <param name="val">数值</param> /// <param name="ObservationCode"> RINEX 码类型</param> public Observation(double val, ObservationCode ObservationCode) : base(val) { this.GnssCodeType = ObservationTypeHelper.GetGnssCodeType(ObservationCode); this.ObservationCode = ObservationCode; }
/// <summary> /// 构造函数 /// </summary> /// <param name="Value"></param> /// <param name="ObservationCode"></param> public RinexObsValue(double Value, ObservationCode ObservationCode) { this.Value = Value; this.ObservationCode = ObservationCode; }
/// <summary> /// 构造函数 /// </summary> /// <param name="Value"></param> /// <param name="observationCode"></param> public RinexObsValue(double Value, string observationCode) { this.Value = Value; this.ObservationCode = ObservationCode.Parse(observationCode); }