private void GetClockData(bool fillWithZero, int intervalSec, int ModelLength, int PredictedLength, Time end, SatelliteNumber prn, List <AtomicClock> all, ArrayMatrix OringalClock, ArrayMatrix CompareClock, int number, int DataNumberIndex, int ModelDataNumberIndex, int PredictedDataNumberIndex) { IsNeedFilling = false; for (Time i = coll.TimePeriod.Start + number * 24 * 3600; i <= end; i = i + intervalSec) { var find = all.SingleOrDefault(m => m.Time == i); if (find == null) { if (!fillWithZero) { continue; } IsNeedFilling = true; find = new AtomicClock() { Time = i, Prn = prn }; } if (DataNumberIndex < ModelLength) { OringalClock[ModelDataNumberIndex, 0] = find.ClockBias; ModelDataNumberIndex++; DataNumberIndex++; } else if (DataNumberIndex < ModelLength + PredictedLength) { CompareClock[PredictedDataNumberIndex, 0] = find.ClockBias; PredictedDataNumberIndex++; DataNumberIndex++; } //writer.WriteLine(find.GetTabValues()); } }
protected void OnSSRClkRecordReceived(AtomicClock obj) { if (obj == null) { return; } if (SSRClkRecordReceived != null) { SSRClkRecordReceived(obj); } }
/// <summary> /// 根据接收机时间和位置,获取计算卫星发射时刻的位置。不计算相对地面的延迟。 /// </summary> /// <param name="nameOrPrn">卫星编号</param> /// <param name="gpsTime">时间</param> /// <returns>如果返回 null,在表示计算失败</returns> public override AtomicClock Get(string nameOrPrn, Time gpsTime) { ClockInterpolator clockInterpolator = GetClockInterpolator(nameOrPrn); if (clockInterpolator == null || !clockInterpolator.IsAvailable(gpsTime)) { return(null); } #region czs AtomicClock fittedClock = clockInterpolator.GetAtomicClock(gpsTime); #endregion return(fittedClock); }
private void ReadSSRofRevisedBNC(ref Time start0, ref Time end0, StreamReader sr, string line) { bool IsNotEnd = true; while (IsNotEnd) { if (line == null || line == "") { break; } if (line.Length > 10000) { throw new Exception("Line too long"); } if (line.Length == 0) { IsNotEnd = false; } AtomicClock item = new AtomicClock(); string[] tmp = SplitByBlank(line); item.ClockBias = double.Parse(tmp[3]); item.Time = new Time(int.Parse(tmp[0]), double.Parse(tmp[1])); item.Prn = SatelliteNumber.TryParse(tmp[2]); item.ClockType = Data.Rinex.ClockType.Satellite; item.Name = item.Prn.ToString(); OriginalSSR.GetClockItems(item.Prn).Add(item); if (item.Time < start0) { start0 = item.Time; } if (item.Time > end0) { end0 = item.Time; } line = sr.ReadLine(); } }
public override bool Revise(ref EpochInformation info) { foreach (var item in info) { #region 相对论改正 不加算的很差 XYZ SatXyz = item.Ephemeris.XYZ; XYZ SatSpeed = item.Ephemeris.XyzDot; double relativeTime = GetRelativeCorrection(SatXyz, SatSpeed); #endregion AtomicClock clock = ClockDataSource.Get(item.Prn, item.EmissionTime); item.Ephemeris.ClockBias = clock.ClockBias + relativeTime; //如果钟漂不为 0 ,则赋值。 if (clock.ClockDrift != 0) { item.Ephemeris.ClockDrift = clock.ClockDrift; } } return(info.EnabledPrns.Count > 0); }
private void Init() { int count = sortedRecords.Count; double[] x = new double[count]; double[] yOffset = new double[count]; double[] yDrift = new double[count]; for (int i = 0; i < count; i++) { AtomicClock clk = sortedRecords[i]; // x[i] = (double)(clk.Time.DateTime - minDataTime.DateTime).TotalSeconds;//Y为秒。 x[i] = (clk.Time - minDataTime);//Y为秒。 yOffset[i] = clk.ClockBias; yDrift[i] = clk.ClockDrift; } Order = Math.Min(Order, count); interpError = new LagrangeInterplation(x, yOffset, Order); interpDrift = new LagrangeInterplation(x, yDrift, Order); }
private void button_read_Click(object sender, EventArgs e) { bool fillWithZero = checkBox1.Checked; var directory = this.directorySelectionControl1.Path; Geo.Utils.FileUtil.CheckOrCreateDirectory(directory); var prns = SatelliteNumber.ParsePRNsBySplliter(textBox_satPrns.Text, new char[] { ',' }); Dictionary <SatelliteNumber, StreamWriter> prnWritersOfBroadcast = new Dictionary <SatelliteNumber, StreamWriter>(); Dictionary <SatelliteNumber, StreamWriter> prnWritersOfBroadcastError = new Dictionary <SatelliteNumber, StreamWriter>(); FileEphemerisService coll; FileEphemerisService coll0; ClockService collOfPrecise; string[] pathes = this.textBox_Broadcast.Lines; string[] pathesOfPrecise = this.textBox_Pathes.Lines; string firstDayOfWeek = GetDayOfWeekFromBroadcastFileName(pathes[0]); string lastDayOfWeek = GetDayOfWeekFromBroadcastFileName(pathes[pathes.Length - 1]); string filename = Path.GetFileNameWithoutExtension(pathesOfPrecise[0]).Substring(0, 3) + GetFileEphemerisTypeFromPath(pathesOfPrecise[0]).ToString();; foreach (var item in prns) { var pathOfBroadcast = Path.Combine(directory, item.ToString() + "Broadcast" + "-" + firstDayOfWeek + "-" + lastDayOfWeek + ".txt"); var pathOfBroadcastError = Path.Combine(directory, item.ToString() + "BroadcastError" + "-" + filename + firstDayOfWeek + "-" + lastDayOfWeek + ".txt"); prnWritersOfBroadcast[item] = new StreamWriter(new FileStream(pathOfBroadcast, FileMode.Create)); prnWritersOfBroadcastError[item] = new StreamWriter(new FileStream(pathOfBroadcastError, FileMode.Create)); } List <string> listPath = new List <string> (); for (int i = 0; i < pathesOfPrecise.Length; i++) { listPath.Add(pathesOfPrecise[i]); } #region coll0 = EphemerisDataSourceFactory.Create(pathes[0]); foreach (var pathItem in pathes) { coll = EphemerisDataSourceFactory.Create(pathItem); string dayOfWeek = GetDayOfWeekFromBroadcastFileName(pathItem); for (int index = 0; index < listPath.Count; index++) { if (listPath[index].Contains(dayOfWeek)) { collOfPrecise = new ClockService(listPath[index]); Time end = collOfPrecise.TimePeriod.End; foreach (var prn in prns) { var writerOfBroadcast = prnWritersOfBroadcast[prn]; var writerOfBroadcastError = prnWritersOfBroadcastError[prn]; var allOfBroadcast = coll.Gets(prn, coll.TimePeriod.Start, end); var allOfBroadcast0 = coll0.Gets(prn, coll0.TimePeriod.Start, coll0.TimePeriod.End); var allOfPrecise = collOfPrecise.GetClocks(prn); if (allOfBroadcast == null)// || allOfPrecise == null || allOfPrecise.Count==0) { continue; } allOfBroadcast.Sort(); allOfBroadcast0.Sort(); if (prn.SatelliteType == SatelliteType.E) { } int interval = 0; Time start0 = collOfPrecise.TimePeriod.Start; switch (prn.SatelliteType) { case SatelliteType.E: interval = 600; break; case SatelliteType.C: interval = 3600; break; case SatelliteType.G: interval = 7200; break; case SatelliteType.R: interval = 1800; start0 = collOfPrecise.TimePeriod.Start + 900; break; case SatelliteType.J: interval = 896; break; default: break; } for (Time i = start0; i <= end; i += interval) { var findOfPrecise = allOfPrecise.SingleOrDefault(m => m.Time == i); var findOfBroadcast = allOfBroadcast.SingleOrDefault(m => m.Time == i); if (findOfBroadcast == null) { findOfBroadcast = allOfBroadcast0.SingleOrDefault(m => m.Time == i); } if (findOfPrecise == null || findOfBroadcast == null) { findOfPrecise = new AtomicClock() { Time = i, Prn = prn, ClockBias = 9999999999.0 }; if (findOfBroadcast == null) { findOfBroadcast = new Ephemeris() { Time = i, Prn = prn, ClockBias = 9999999999.0 } } ; } else { findOfPrecise.ClockBias = findOfPrecise.ClockBias - findOfBroadcast.ClockBias; } if (findOfBroadcast.ClockBias == 9999999999.0 && prn.SatelliteType == SatelliteType.G) { findOfBroadcast = allOfBroadcast.FirstOrDefault(m => Math.Abs((m.Time - i) * 1.0) < 60); if (findOfBroadcast == null) { findOfBroadcast = allOfBroadcast0.FirstOrDefault(m => Math.Abs((m.Time - i) * 1.0) < 60); } if (findOfBroadcast == null) { findOfBroadcast = new Ephemeris() { Time = i, Prn = prn, ClockBias = 9999999999.0 } } ; } writerOfBroadcast.WriteLine(findOfBroadcast.GetSimpleTabValues()); writerOfBroadcastError.WriteLine(findOfPrecise.GetTabValues()); } //for (Time i = collOfPrecise.TimePeriod.Start; i <= end1; i = i + intervalSec) //{ // var findOfBroadcast = allOfBroadcast.SingleOrDefault(m => m.Time == i); // var findOfPrecise = allOfBroadcast.SingleOrDefault(m => m.Time == i); // if (findOfBroadcast == null || findOfPrecise == null) // { // if (!fillWithZero) continue; // findOfBroadcast = new Ephemeris() { Time = i, Prn = prn }; // } // writerOfBroadcast.WriteLine(findOfBroadcast.GetTabValues()); // findOfPrecise.ClockBias = findOfPrecise.ClockBias - findOfBroadcast.ClockBias; // writerOfBroadcastError.WriteLine(findOfPrecise.GetTabValues()); //} } coll0 = EphemerisDataSourceFactory.Create(pathItem); listPath.RemoveAt(index); break; } } } #endregion foreach (var item in prnWritersOfBroadcast) { item.Value.Flush(); item.Value.Close(); } foreach (var item in prnWritersOfBroadcastError) { item.Value.Flush(); item.Value.Close(); } Geo.Utils.FileUtil.OpenDirectory(directory); }
private void calculate_Click(object sender, EventArgs e) { bool fillWithZero = checkBox1.Checked; var intervalSec = double.Parse(textBox_interval.Text) * 60; var directory = this.directorySelectionControl1.Path; Geo.Utils.FileUtil.CheckOrCreateDirectory(directory); string[] SSRsp3Pathes = this.textBox_SSRsp3Pathes.Lines; string[] NavPathes = this.textBox_NavPathes.Lines; string[] ClockPathes = this.textBox1.Lines; if (SSRsp3Pathes.Length != NavPathes.Length) { return; } int fileCount = SSRsp3Pathes.Length; if (!System.IO.Directory.Exists(@"D:\Temp\SSR1\")) { System.IO.Directory.CreateDirectory(@"D:\Temp\SSR1\"); } EpochCountTableTextManager = new ObjectTableManager(); EpochCountTableTextManager.OutputDirectory = "D:\\Temp\\SSR1\\"; var SatEpochCountTable = EpochCountTableTextManager.GetOrCreate("BNCSatEpochCount");// + OriginalSSR.Header.Name); SatEpochCountTable.NewRow(); for (int i = 0; i < fileCount; i++) { #region 读取SSR产品 Time start0 = Time.MaxValue; Time end0 = Time.MinValue; OriginalSSR = new ClockFile(); OriginalSSRMinusPreciseClockOutput = new ClockFile(); OriginalSSRPlusNavOutput = new ClockFile(); using (StreamReader sr = new StreamReader(SSRsp3Pathes[i])) { string line = sr.ReadLine(); if (line.Substring(0, 1) == "!") { ReadSSRofBNC(ref start0, ref end0, sr, line); } else if (line.Substring(0, 1) == ">") { bool IsNotEnd = true; while (IsNotEnd) { if (line == null || line == "") { break; } if (line.Length > 10000) { throw new Exception("Line too long"); } if (line.Length == 0) { IsNotEnd = false; } if (line.Substring(2, 5) == "CLOCK") { Time time = Time.Parse(line.Substring(8, 21)); int satCount = int.Parse(line.Substring(31, 3)); for (int index = 0; index < satCount; index++) { line = sr.ReadLine(); AtomicClock item = new AtomicClock(); item.Prn = SatelliteNumber.TryParse(line.Substring(0, 3)); item.ClockBias = double.Parse(line.Substring(12, 5)) / GnssConst.LIGHT_SPEED; item.Time = time; item.ClockType = Data.Rinex.ClockType.Satellite; item.Name = item.Prn.ToString(); OriginalSSR.GetClockItems(item.Prn).Add(item); } if (time < start0) { start0 = time; } if (time > end0) { end0 = time; } } line = sr.ReadLine(); } } else { ReadSSRofRevisedBNC(ref start0, ref end0, sr, line); } } OriginalSSR.TimePeriod = new BufferedTimePeriod(start0, end0); Dictionary <string, int> SatEpochCount = new Dictionary <string, int>(); foreach (var item in OriginalSSR.Names) { SatEpochCount.Add(item, OriginalSSR.GetClockItems(item).Count); } SatEpochCountTable.AddItem("Day", start0.GetGpsWeekAndDay()); foreach (var item in SatEpochCount) { SatEpochCountTable.AddItem(item.Key, item.Value); } SatEpochCountTable.EndRow(); #endregion #region 读取广播星历 ParamNavFileReader NavReader = new ParamNavFileReader(NavPathes[i]); ephemeris = new SingleParamNavFileEphService(NavReader.ReadGnssNavFlie()); #endregion #region 读取钟差文件 ClockFileReader reader = new ClockFileReader(ClockPathes[i], false); ClockFile = reader.ReadAll(); if (ClockFile.ClockCount == 0) { return; } #endregion this.bindingSource1.DataSource = OriginalSSR.AllItems; this.comboBox_name.DataSource = OriginalSSR.Names; List <AtomicClock> OriginalSSRDataSource = new List <AtomicClock>(); List <AtomicClock> ClockFileDataSource = new List <AtomicClock>(); foreach (var item in OriginalSSR.Names) { //OriginalSSRDataSource = OriginalSSR.GetClockItems(key); ClockFileDataSource = ClockFile.GetClockItems(item); if (ClockFileDataSource == null) { continue; } List <AtomicClock> ErrorResult = new List <AtomicClock>(); List <AtomicClock> SSRPlusNavResult = new List <AtomicClock>(); foreach (var item1 in ClockFileDataSource) { AtomicClock item2 = new AtomicClock(); var clk = OriginalSSR.GetClockItem(item1.Prn.ToString(), item1.Time); if (item1.ClockBias == 9999999999.0 || clk == null) { item1.ClockBias = 9999999999.0; item2.Time = item1.Time; item2.Prn = item1.Prn; item2.Name = item1.Name; item2.ClockType = item1.ClockType; item2.ClockBias = 9999999999.0; } else { var NavItem = ephemeris.Get(item1.Prn, item1.Time); item2.Time = item1.Time; item2.Prn = item1.Prn; item2.Name = item1.Name; item2.ClockType = item1.ClockType; item2.ClockBias = NavItem.ClockBias - NavItem.RelativeCorrection + clk.ClockBias; item1.ClockBias = item2.ClockBias - item1.ClockBias; } SSRPlusNavResult.Add(item2); ErrorResult.Add(item1); } OriginalSSRMinusPreciseClockOutput.Add(item, ErrorResult); OriginalSSRPlusNavOutput.Add(item, SSRPlusNavResult); } double interval = double.Parse(this.textBox_interval.Text); ClockEstimationFrom = this.dateTimePicker_from.Value; ClockEstimationTo = this.dateTimePicker_to.Value; OriginalSSR.Header = ClockFile.Header; OriginalSSR.Header.SourceName = "SSR" + OriginalSSR.Header.SourceName; OriginalSSR.Header.CreationDate = DateTime.Now.ToString(); OriginalSSR.Header.CreationAgence = "Gnsser"; OriginalSSR.Header.ANALYSIS_CENTER = "Gnsser"; OriginalSSR.Header.CreationProgram = "Gnsser"; OriginalSSR.Header.TYPES_OF_DATA.Clear(); OriginalSSR.Header.TYPES_OF_DATA.Add("AS"); OriginalSSR.Header.COUNT_OF_TYPES_OF_DATA = 1; OriginalSSR.Header.ClockSolnStations.Clear(); OriginalSSRMinusPreciseClockOutput.Header = OriginalSSR.Header; OriginalSSRPlusNavOutput.Header = OriginalSSR.Header; var resutlPath = Path.Combine("D:\\Temp\\SSR1\\", OriginalSSR.Header.SourceName); var errorResutlPath = Path.Combine("D:\\Temp\\SSR1\\", "error" + OriginalSSR.Header.SourceName); ClockFileWriter ClockFileWriter = new ClockFileWriter(resutlPath, OriginalSSRPlusNavOutput); ClockFileWriter.SaveToFile(); ClockFileWriter errorClockFileWriter = new ClockFileWriter(errorResutlPath, OriginalSSRMinusPreciseClockOutput); errorClockFileWriter.SaveToFile(); TableTextManager = new ObjectTableManager(); TableTextManager.OutputDirectory = "D:\\Temp\\SSR1\\"; var paramTable = TableTextManager.GetOrCreate(OriginalSSRMinusPreciseClockOutput.Name + "errorSSRSat"); int count = 0; SatelliteNumber prnIndex = new SatelliteNumber(); foreach (var item in OriginalSSRMinusPreciseClockOutput) { if (item.Count > count) { count = item.Count; prnIndex = item[0].Prn; } } var standard = OriginalSSRMinusPreciseClockOutput.GetClockItems(prnIndex); double DoubleDiffer = 0; foreach (var item in standard) { paramTable.NewRow(); paramTable.AddItem("Epoch", item.Time); foreach (var item1 in OriginalSSRMinusPreciseClockOutput.Names) { if (item1 == item.Name.ToString()) { continue; } var ss = OriginalSSRMinusPreciseClockOutput.GetClockItem(item1, item.Time); if (ss == null) { continue; } if (item.ClockBias == 9999999999.0 || ss.ClockBias == 9999999999.0) { DoubleDiffer = 0; } else { DoubleDiffer = item.ClockBias - ss.ClockBias; } paramTable.AddItem(ss.Prn + "-" + item.Prn, DoubleDiffer * 1E9); } paramTable.EndRow(); } TableTextManager.WriteAllToFileAndCloseStream(); } EpochCountTableTextManager.WriteAllToFileAndCloseStream(); Geo.Utils.FileUtil.OpenDirectory("D:\\Temp\\SSR1\\"); }
private void button_read_Click(object sender, EventArgs e) { bool fillWithZero = checkBox1.Checked; var directory = this.directorySelectionControl1.Path; Geo.Utils.FileUtil.CheckOrCreateDirectory(directory); string[] SSRsp3Pathes = this.textBox_SSRsp3Pathes.Lines; string[] NavPathes = this.textBox_NavPathes.Lines; string[] ClockPathes = this.textBox1.Lines; if (SSRsp3Pathes.Length != NavPathes.Length) { return; } int fileCount = SSRsp3Pathes.Length; #region 照时间顺序合并 for (int i = 0; i < fileCount; i++) { ErrorSSRsp3 = new Sp3File(); SSRMinusPreciseClockOutput = new ClockFile(); SSRPlusNavOutput = new ClockFile(); Sp3Reader SSRsp3Reader = new Sp3Reader(SSRsp3Pathes[i]); ParamNavFileReader reader = new ParamNavFileReader(NavPathes[i]); SSRsp3 = SSRsp3Reader.ReadAll(); ephemeris = new SingleParamNavFileEphService(reader.ReadGnssNavFlie()); #region 读取钟差文件 ClockFileReader ClockReader = new ClockFileReader(ClockPathes[i], false); ClockFile = ClockReader.ReadAll(); if (ClockFile.ClockCount == 0) { return; } #endregion #region 以sp3的格式进行比较,发现比较麻烦 //foreach (Sp3Section sec in SSRsp3) //{ // Sp3Section ErrorResult = new Sp3Section(); // Time t = sec.Time; // foreach (Sp3Record rec in sec) // { // Sp3Record error = new Sp3Record(); // if (!ephemeris.Prns.Contains(rec.Prn)) // { // rec.ClockBias = 999999.999999 * 1e6; // error.Time = rec.Time; // error.Prn = rec.Prn; // error.ClockBias = 999999.999999 * 1e6; // ErrorResult.Add(error.Prn, error); // continue; // } // var key = ephemeris.Get(rec.Prn, t); // rec.ClockBias = key.ClockBias - key.RelativeTime + rec.ClockBias; // var clock=ClockFile.GetClockItem(rec.Prn.ToString(), t); // error.Time = rec.Time; // error.Prn = rec.Prn; // error.ClockBias = clock.ClockBias - rec.ClockBias; // ErrorResult.Add(error.Prn,error); // } // ErrorSSRsp3.Add(ErrorResult); //} #endregion #region 以clock文件格式进行比较 List <AtomicClock> ClockFileDataSource = new List <AtomicClock>(); foreach (var item in SSRsp3.Prns) { ClockFileDataSource = ClockFile.GetClockItems(item); List <AtomicClock> ErrorResult = new List <AtomicClock>(); List <AtomicClock> SSRPlusNavResult = new List <AtomicClock>(); foreach (var item1 in ClockFileDataSource) { AtomicClock item2 = new AtomicClock(); var clk = SSRsp3.Get(item1.Time); if (item1.ClockBias == 9999999999.0 || clk == null || !clk.Contains(item1.Prn)) { if (clk != null) { } item1.ClockBias = 9999999999.0; item2.Time = item1.Time; item2.Prn = item1.Prn; item2.Name = item1.Name; item2.ClockType = item1.ClockType; item2.ClockBias = 9999999999.0; } //else if (!clk.Contains(item1.Prn)) //{ // item1.ClockBias = 9999999999.0; // item2.Time = item1.Time; // item2.Prn = item1.Prn; // item2.Name = item1.Name; // item2.ClockType = item1.ClockType; // item2.ClockBias = 9999999999.0; //} else { var NavItem = ephemeris.Get(item1.Prn, item1.Time); item2.Time = item1.Time; item2.Prn = item1.Prn; item2.Name = item1.Name; item2.ClockType = item1.ClockType; item2.ClockBias = NavItem.ClockBias - NavItem.RelativeCorrection + clk.Data[item1.Prn].ClockBias; item1.ClockBias = item2.ClockBias - item1.ClockBias; } SSRPlusNavResult.Add(item2); ErrorResult.Add(item1); } SSRMinusPreciseClockOutput.Add(item.ToString(), ErrorResult); SSRPlusNavOutput.Add(item.ToString(), SSRPlusNavResult); } #endregion SSRMinusPreciseClockOutput.Header = ClockFile.Header; SSRMinusPreciseClockOutput.Header.SourceName = "errorSSR" + ClockFile.Header.SourceName; SSRMinusPreciseClockOutput.Header.CreationDate = DateTime.Now.ToString(); SSRMinusPreciseClockOutput.Header.CreationAgence = "Gnsser"; SSRMinusPreciseClockOutput.Header.ANALYSIS_CENTER = "Gnsser"; SSRMinusPreciseClockOutput.Header.CreationProgram = "Gnsser"; SSRMinusPreciseClockOutput.Header.TYPES_OF_DATA.Clear(); SSRMinusPreciseClockOutput.Header.TYPES_OF_DATA.Add("AS"); SSRMinusPreciseClockOutput.Header.COUNT_OF_TYPES_OF_DATA = 1; SSRMinusPreciseClockOutput.Header.ClockSolnStations.Clear(); SSRPlusNavOutput.Header = SSRMinusPreciseClockOutput.Header; if (!System.IO.Directory.Exists(@"D:\Temp\errorSSR\")) { System.IO.Directory.CreateDirectory(@"D:\Temp\errorSSR\"); } var errorResutlPath = Path.Combine("D:\\Temp\\errorSSR\\", "errorSSR" + ClockFile.Header.SourceName); ClockFileWriter errorClockFileWriter = new ClockFileWriter(errorResutlPath, SSRMinusPreciseClockOutput); errorClockFileWriter.SaveToFile(); var SSRPlusNavResutlPath = Path.Combine("D:\\Temp\\errorSSR\\", "SSR+Nav" + ClockFile.Header.SourceName); ClockFileWriter SSRPlusNavWriter = new ClockFileWriter(SSRPlusNavResutlPath, SSRPlusNavOutput); SSRPlusNavWriter.SaveToFile(); TableTextManager = new ObjectTableManager(); TableTextManager.OutputDirectory = "D:\\Temp\\errorSSR\\"; var paramTable = TableTextManager.GetOrCreate(SSRMinusPreciseClockOutput.Name + "errorSSRSat"); int count = 1000000000; SatelliteNumber prnIndex = new SatelliteNumber(); foreach (var item in SSRMinusPreciseClockOutput) { int countEx = 0; foreach (var item1 in item) { if (item1.ClockBias == 9999999999.0) { countEx++; } } if (countEx < count) { count = countEx; prnIndex = item[0].Prn; } } var standard = SSRMinusPreciseClockOutput.GetClockItems(prnIndex); double DoubleDiffer = 0; foreach (var item in standard) { paramTable.NewRow(); paramTable.AddItem("Epoch", item.Time); foreach (var item1 in SSRMinusPreciseClockOutput.Names) { if (item1 == item.Name.ToString()) { continue; } var ss = SSRMinusPreciseClockOutput.GetClockItem(item1, item.Time); if (ss == null) { continue; } if (item.ClockBias == 9999999999.0 || ss.ClockBias == 9999999999.0) { DoubleDiffer = 0; } else { DoubleDiffer = item.ClockBias - ss.ClockBias; } paramTable.AddItem(ss.Prn + "-" + item.Prn, DoubleDiffer * 1E9); } paramTable.EndRow(); } TableTextManager.WriteAllToFileAndCloseStream(); int dayOfWeek = SSRsp3.Header.StartTime.GetGpsWeekAndDay(); var path = Path.Combine("D:\\Temp\\errorSSR\\", "RT" + SSRsp3.Name);//+ dayOfWeek.ToString() + ".sp3"); Sp3Writer Sp3Writer = new Sp3Writer(path, SSRsp3); Sp3Writer.SaveToFile(); SSRsp3.Clear(); //var errorPath = Path.Combine("D:\\Temp\\errorSSR\\", "error" + SSRsp3Pathes[i].Substring(0, 5) + "RT" + dayOfWeek.ToString() + ".sp3"); //Sp3Writer errorSp3Writer = new Sp3Writer(path, ErrorSSRsp3); //errorSp3Writer.SaveToFile(); //ErrorSSRsp3.Clear(); } #endregion Geo.Utils.FileUtil.OpenDirectory("D:\\Temp\\errorSSR\\"); }
private void button_export_Click(object sender, EventArgs e) { bool fillWithZero = checkBox1.Checked; var intervalSec = int.Parse(textBox_interval.Text) * 60; var directory = this.directorySelectionControl1.Path; Geo.Utils.FileUtil.CheckOrCreateDirectory(directory); var ModelLength = (int)(24 * double.Parse(textBox_ModelLength.Text)) * 3600 / intervalSec; var PredictedLength = (int)(24 * double.Parse(textBox_PredictedLength.Text)) * 3600 / intervalSec; var PredictedNumber = int.Parse(textBox_PredictedNumber.Text); var prns = SatelliteNumber.ParsePRNsBySplliter(textBox_satPrns.Text, new char[] { ',' }); Dictionary <SatelliteNumber, StreamWriter> prnWriters = new Dictionary <SatelliteNumber, StreamWriter>(); foreach (var item in prns) { var path = Path.Combine(directory, item.ToString() + ".xls"); prnWriters[item] = new StreamWriter(new FileStream(path, FileMode.Create)); } string[] pathes = this.textBox_Pathes.Lines; coll = new MultiFileClockService(pathes); int allSec = (int)coll.TimePeriod.Span; Time end = coll.TimePeriod.End + intervalSec; List <double> list = new List <double>(); Dictionary <string, SSE> ListOfSSE = new Dictionary <string, SSE>(); string approach = null; #region 逐个卫星进行钟差预报 clkofPredicted = new ClockFile(); clkofPredicted.Header = new ClockFileHeader(); clkofPredicted.Header.PrnList = new List <SatelliteNumber>(); for (int number = 0; number < PredictedNumber; number++) { foreach (var prn in prns) { var writer = prnWriters[prn]; //List<double> colName = new List<double>(); var all = coll.Gets(prn, coll.TimePeriod.Start, end); ArrayMatrix OringalClock = new ArrayMatrix(ModelLength, 1); ArrayMatrix CompareClock = new ArrayMatrix(PredictedLength, 1); Time StartOfModel = coll.TimePeriod.Start; Time EndOfModel = StartOfModel + (ModelLength - 1) * intervalSec; Time StartOfPredicted = EndOfModel + intervalSec; Time EndOfPredicted = StartOfPredicted + (PredictedLength - 1) * intervalSec; int DataNumberIndex = 0; int ModelDataNumberIndex = 0; int PredictedDataNumberIndex = 0; GetClockData(fillWithZero, intervalSec, ModelLength, PredictedLength, end, prn, all, OringalClock, CompareClock, number, DataNumberIndex, ModelDataNumberIndex, PredictedDataNumberIndex); if (IsNeedFilling) { QuadraticPolynomialModel Filling = new QuadraticPolynomialModel(); Filling.FillingCalculate(OringalClock, intervalSec); } ArrayMatrix Data = null; if (radioButton_QP.Checked) { approach = "QP"; QuadraticPolynomialModel QuadraticPolynomialModel = new QuadraticPolynomialModel(); QuadraticPolynomialModel.Calculate(OringalClock, CompareClock, intervalSec); Data = QuadraticPolynomialModel.PredictedData; } if (radioButton_QPT1.Checked) { approach = "QPT1"; QuadraticPolynomialT1 QuadraticPolynomialT1 = new QuadraticPolynomialT1(); QuadraticPolynomialT1.Calculate(OringalClock, CompareClock, intervalSec); list.Add(QuadraticPolynomialT1.PredictedRms); Data = QuadraticPolynomialT1.PredictedData; } if (radioButton_QPT2.Checked) { approach = "QPT2"; QuadraticPolynomialT2 QuadraticPolynomialT2 = new QuadraticPolynomialT2(); QuadraticPolynomialT2.Calculate(OringalClock, CompareClock, intervalSec, prn); list.Add(QuadraticPolynomialT2.PredictedRms); Data = QuadraticPolynomialT2.PredictedData; } if (radioButton_QPT3.Checked) { approach = "QPT3"; QuadraticPolynomialT3 QuadraticPolynomialT3 = new QuadraticPolynomialT3(); QuadraticPolynomialT3.Calculate(OringalClock, CompareClock, intervalSec); list.Add(QuadraticPolynomialT3.PredictedRms); Data = QuadraticPolynomialT3.PredictedData; } if (radioButton_QPT4.Checked) { approach = "QPT4"; QuadraticPolynomialT4 QuadraticPolynomialT4 = new QuadraticPolynomialT4(); QuadraticPolynomialT4.Calculate(OringalClock, CompareClock, intervalSec); list.Add(QuadraticPolynomialT4.PredictedRms); Data = QuadraticPolynomialT4.PredictedData; } if (radioButton_QPGM.Checked) { approach = "QPGM"; QuadraticPolynomialGM QuadraticPolynomialGM = new QuadraticPolynomialGM(); QuadraticPolynomialGM.Calculate(OringalClock, CompareClock, intervalSec); list.Add(QuadraticPolynomialGM.PredictedRms); Data = QuadraticPolynomialGM.PredictedData; } if (radioButton_QPT2GM.Checked) { approach = "QPT2GM"; QuadraticPolynomialT2GM QuadraticPolynomialT2GM = new QuadraticPolynomialT2GM(); QuadraticPolynomialT2GM.Calculate(OringalClock, CompareClock, intervalSec, prn); list.Add(QuadraticPolynomialT2GM.PredictedRms); Data = QuadraticPolynomialT2GM.PredictedData; } if (radioButton_QPT4GM.Checked) { approach = "QPT4GM"; QuadraticPolynomialT4GM QuadraticPolynomialT4GM = new QuadraticPolynomialT4GM(); QuadraticPolynomialT4GM.Calculate(OringalClock, CompareClock, intervalSec); list.Add(QuadraticPolynomialT4GM.PredictedRms); Data = QuadraticPolynomialT4GM.PredictedData; } if (radioButton_LP.Checked) { approach = "LP"; LinearPolynomialModel LinearPolynomialModel = new LinearPolynomialModel(); LinearPolynomialModel.Calculate(OringalClock, CompareClock, intervalSec); list.Add(LinearPolynomialModel.PredictedRms); Data = LinearPolynomialModel.PredictedData; } if (radioButton_DLP.Checked) { approach = "DLP"; DLinearPolynomialModel DLinearPolynomialModel = new DLinearPolynomialModel(); DLinearPolynomialModel.Calculate(OringalClock, CompareClock, intervalSec); list.Add(DLinearPolynomialModel.PredictedRms); Data = DLinearPolynomialModel.PredictedData; } if (radioButton_RobustDLP.Checked) { approach = "RobustDLP"; RobustDLinearPolynomial RobustDLinearPolynomial = new RobustDLinearPolynomial(); RobustDLinearPolynomial.Calculate(OringalClock, CompareClock, intervalSec); list.Add(RobustDLinearPolynomial.PredictedRms); Data = RobustDLinearPolynomial.PredictedData; SSE a = new SSE(); a = GetSSE(RobustDLinearPolynomial); ListOfSSE.Add(prn.ToString() + '-' + number, a); } if (radioButton_RobustLP.Checked) { approach = "RobustLP"; RobustLinearPolynomial RobustLinearPolynomial = new RobustLinearPolynomial(); RobustLinearPolynomial.Calculate(OringalClock, CompareClock, intervalSec); list.Add(RobustLinearPolynomial.PredictedRms); Data = RobustLinearPolynomial.PredictedData; } if (radioButton_GM.Checked) { approach = "GM"; ArrayMatrix GMOringalClock1 = new ArrayMatrix(ModelLength, 1); for (int GMIndex = 0; GMIndex < ModelLength; GMIndex++) { GMOringalClock1[GMIndex, 0] = OringalClock[ModelLength - (ModelLength - GMIndex), 0]; } GreyModel GreyModel1 = new GreyModel(); SSE a = new SSE(); GreyModel1.Calculate(GMOringalClock1, CompareClock, intervalSec); a = GetSSE(GreyModel1); ListOfSSE.Add(prn.ToString() + '-' + number, a); Data = GreyModel1.PredictedData; } if (radioButton_KFAllan.Checked) { approach = "KFAllan"; KalmanAllan KalmanAllan = new KalmanAllan(); KalmanAllan.Calculate(OringalClock, CompareClock, intervalSec); list.Add(KalmanAllan.PredictedRms); Data = KalmanAllan.PredictedData; } if (radioButton_KFHardamard.Checked) { approach = "KFHardamard"; KalmanHardamard KalmanHardamard = new KalmanHardamard(); KalmanHardamard.Calculate(OringalClock, CompareClock, intervalSec); list.Add(KalmanHardamard.PredictedRms); Data = KalmanHardamard.PredictedData; } if (radioButton_KFReHardamard.Checked) { approach = "KFReHardamard"; KalmanRecursionHardamard KalmanRecursionHardamard = new KalmanRecursionHardamard(); KalmanRecursionHardamard.Calculate(OringalClock, CompareClock, intervalSec); list.Add(KalmanRecursionHardamard.PredictedRms); Data = KalmanRecursionHardamard.PredictedData; } if (radioButton_KFReAllan.Checked) { approach = "KFReAllan"; KalmanRecursionAllan KalmanRecursionAllan = new KalmanRecursionAllan(); KalmanRecursionAllan.Calculate(OringalClock, CompareClock, intervalSec); list.Add(KalmanRecursionAllan.PredictedRms); Data = KalmanRecursionAllan.PredictedData; } for (int i0 = 0; i0 < Data.RowCount; i0++) { AtomicClock sat = new AtomicClock(); sat.Prn = prn; sat.Time = StartOfPredicted + i0 * intervalSec; sat.ClockBias = Data[i0, 0]; sat.ClockType = ClockType.Satellite; if (!(clkofPredicted.Contains(sat.Prn.ToString()))) { clkofPredicted.Add(sat.Prn.ToString(), new List <AtomicClock>()); } clkofPredicted[sat.Prn.ToString()].Add(sat); } clkofPredicted.Header.PrnList.Add(prn); } OutputOfPredictedClock(directory, approach, intervalSec); } #endregion OutputOfSSE(directory, ListOfSSE, approach); Geo.Utils.FileUtil.OpenDirectory(directory); }
protected virtual void dataProvider_SSRClkRecordReceived(AtomicClock obj) { }
public void WriteClkRecord(AtomicClock obj) { ClockFileWriter.Write(obj); ClockFileWriter.Flush(); }
protected override void dataProvider_SSRClkRecordReceived(AtomicClock obj) { this.WriteClkRecord(obj); }
private void button_read_Click(object sender, EventArgs e) { bool fillWithZero = checkBox1.Checked; var intervalSec = double.Parse(textBox_interval.Text) * 60; var directory = this.directorySelectionControl1.Path; Geo.Utils.FileUtil.CheckOrCreateDirectory(directory); var prns = SatelliteNumber.ParsePRNsBySplliter(textBox_satPrns.Text, new char[] { ',' }); Dictionary <SatelliteNumber, StreamWriter> prnWriters = new Dictionary <SatelliteNumber, StreamWriter>(); string[] pathes = this.textBox_Pathes.Lines; string firstDayOfWeek = Path.GetFileNameWithoutExtension(pathes[0]).Substring(3, 5); string lastDayOfWeek = Path.GetFileNameWithoutExtension(pathes[pathes.Length - 1]).Substring(3, 5); string timePeriod = firstDayOfWeek + "-" + lastDayOfWeek; string type = EphemerisDataSourceFactory.GetFileEphemerisTypeFromPath(pathes[0]).ToString(); //coll = new MultiFileClockService( pathes); //int startTime = coll.TimePeriod.Start.GetGpsWeekAndDay(); //int endTime = coll.TimePeriod.End.GetGpsWeekAndDay(); //string timePeriod=startTime.ToString()+"-"+ endTime.ToString(); string fileName = Path.GetFileName(pathes[0]).Substring(0, 3); foreach (var item in prns) { var path = Path.Combine(directory, item.ToString() + "-" + fileName + "." + type + timePeriod + ".txt"); prnWriters[item] = new StreamWriter(new FileStream(path, FileMode.Create)); } //int allSec = (int)coll.TimePeriod.Span; //Time end = coll.TimePeriod.End + intervalSec; //foreach (var prn in prns) //{ // var writer = prnWriters[prn]; // var all = coll.Gets(prn, coll.TimePeriod.Start, end); // for (Time i = coll.TimePeriod.Start; i <= end; i = i + intervalSec) // { // var find = all.SingleOrDefault(m => m.Time == i); // if (find == null) // { // if (!fillWithZero) continue; // find = new AtomicClock() { Time = i, Prn = prn }; // } // writer.WriteLine(find.GetTabValues()); // } //} Time start = Time.MaxValue; foreach (var path in pathes) { singleColl = new ClockService(path); Time start0 = singleColl.TimePeriod.Start; Time end0 = singleColl.TimePeriod.End + intervalSec; if (start < start0) { start0 = start; } foreach (var prn in prns) { var writer = prnWriters[prn]; var all = singleColl.Gets(prn, start0, end0); if (all == null) { continue; } for (Time i = start0; i < end0; i = i + intervalSec) { var find = all.SingleOrDefault(m => m.Time == i); if (find == null) { if (!fillWithZero) { continue; } find = new AtomicClock() { Time = i, Prn = prn }; } writer.WriteLine(find.GetTabValues()); } } start = end0; } foreach (var item in prnWriters) { item.Value.Flush(); item.Value.Close(); } Geo.Utils.FileUtil.OpenDirectory(directory); }
private void calculate_Click(object sender, EventArgs e) { bool fillWithZero = checkBox1.Checked; var intervalSec = double.Parse(textBox_interval.Text) * 60; var directory = this.directorySelectionControl1.Path; Geo.Utils.FileUtil.CheckOrCreateDirectory(directory); #region 读取钟差估计结果 Time start0 = Time.MaxValue; Time end0 = Time.MinValue; bool IsNotEnd = true; ClockFileOfClockEstimation = new ClockFile(); ClockFileOfClockEstimationResult = new ClockFile(); string[] tmp0 = null; using (StreamReader sr = new StreamReader(this.textBox_Pathes.Text)) { string line = sr.ReadLine(); tmp0 = SplitByBlank(line); while (IsNotEnd) { line = sr.ReadLine(); if (line == null || line == "") { break; } if (line.Length > 10000) { throw new Exception("Line too long"); } if (line.Length == 0) { IsNotEnd = false; } //string[] tmp = StringUtil.SplitByBlank(line); string[] tmp = SplitByBlank(line); for (int i = 0; i < tmp.Length / 2; i++) { AtomicClock item = new AtomicClock(); if (tmp[2 * i + 2] == " ") { item.ClockBias = 9999999999; item.Time = Time.Parse(tmp[0]); item.Prn = SatelliteNumber.TryParse(tmp0[2 * i + 1]); item.ClockType = Data.Rinex.ClockType.Satellite; item.Name = item.Prn.ToString(); ClockFileOfClockEstimation.GetClockItems(item.Prn).Add(item); continue; } item.ClockBias = double.Parse(tmp[2 * i + 2]) / 1E9; item.Time = Time.Parse(tmp[0]); //key.Time.Seconds += 1; item.Prn = SatelliteNumber.TryParse(tmp0[2 * i + 1]); item.ClockType = Data.Rinex.ClockType.Satellite; item.Name = item.Prn.ToString(); ClockFileOfClockEstimation.GetClockItems(item.Prn).Add(item); if (item.Time < start0) { start0 = item.Time; } if (item.Time > end0) { end0 = item.Time; } } } } ClockFileOfClockEstimation.TimePeriod = new BufferedTimePeriod(start0, end0); #endregion this.bindingSource1.DataSource = ClockFileOfClockEstimation.AllItems; this.comboBox_name.DataSource = ClockFileOfClockEstimation.Names; #region 读取钟差文件 string path = this.textBox1.Text; ClockFileReader reader = new ClockFileReader(path, false); ClockFile = reader.ReadAll(); if (ClockFile.ClockCount == 0) { return; } #endregion #region 两个文件结果做差 //int allSec = (int)ClockFile.TimePeriod.Span; //Time end = ClockFile.TimePeriod.End + intervalSec; //Dictionary<string, clock> V1 = new Dictionary<string, clock>(); //double[] V = new double[32]; //double[] x = new double[32]; //clock q = new clock(); //for (int j = 1; j < tmp0.Length; j++) //{ // int count = 0; // var a1 = ClockFileOfClockEstimation.GetClockItems(tmp0[j], ClockFileOfClockEstimation.TimePeriod.Start, ClockFileOfClockEstimation.TimePeriod.End); // var a2 = ClockFile.GetClockItems(tmp0[j], ClockFile.TimePeriod.Start, ClockFile.TimePeriod.End); // for (int k = 0, k1 = 0; k < a1.Count; k++) // { // if (a1[k].Time == a2[k1].Time) // { // V[j] = a1[k].ClockBias - a2[k1].ClockBias; // x[j] += V[j] * V[j]; // count++; // k++; // k1++; // q.Time.Add(a1[k].Time.ToString()); // q.clk.Add(V[j]); // } // else if (a1[k].Time < a2[k1].Time) // k++; // else if (a1[k].Time > a2[k1].Time) // k1++; // } // q.Time.Add("rms"); // q.clk.Add(Math.Sqrt(x[j] / count)); // V1.Add(tmp0[j], q); //} #endregion double interval = double.Parse(this.textBox_interval.Text); ClockEstimationFrom = this.dateTimePicker_from.Value; ClockEstimationTo = this.dateTimePicker_to.Value; List <AtomicClock> ClockEstimationDataSource = new List <AtomicClock>(); List <AtomicClock> ClockFileDataSource = new List <AtomicClock>(); List <AtomicClock> FitedResult = new List <AtomicClock>(); //foreach (var key in ClockFileOfClockEstimation.Names) //{ // ClockEstimationDataSource = ClockFileOfClockEstimation.GetClockItems(key, new Time(ClockEstimationFrom), new Time(ClockEstimationTo)); // ClockFileDataSource = ClockFile.GetClockItems(key, new Time(ClockFileFrom), new Time(ClockFileTo)); // //ClockInterpolator interp = new ClockInterpolator(ClockEstimationDataSource); // ClockEstimationDataSource = ClockFileOfClockEstimation.GetClockItems(key); // ClockFileDataSource = ClockFile.GetClockItems(key); // ClockInterpolator interp = new ClockInterpolator(ClockEstimationDataSource,11); // List<AtomicClock> fitedResult = new List<AtomicClock>(); // interval = interval * 60; // double cacuCount = (end0.TickTime - start0.TickTime).TotalSeconds / interval; // for (int xi = 0; xi <= cacuCount-1; xi++) // { // Time gpsTime = ClockFileDataSource[0].Time + interval * xi; // if (gpsTime > interp.MaxAvailableTime) break; // fitedResult.Add(interp.GetAtomicClock(gpsTime)); // } // for (int i = 0; i < fitedResult.Count; i++) // { // fitedResult[i].ClockBias -= ClockFileDataSource[i].ClockBias; // FitedResult.Add(fitedResult[i]); // } //} foreach (var item in ClockFileOfClockEstimation.Names) { ClockEstimationDataSource = ClockFileOfClockEstimation.GetClockItems(item); ClockFileDataSource = ClockFile.GetClockItems(item); List <AtomicClock> fitedResult = new List <AtomicClock>(); foreach (var item1 in ClockEstimationDataSource) { var ss = ClockFile.GetClockItem(item, item1.Time); if (ss == null || item1.ClockBias == 9999999999.0) { continue; } item1.ClockBias -= ss.ClockBias; FitedResult.Add(item1); fitedResult.Add(item1); } ClockFileOfClockEstimationResult.Add(item, fitedResult); } ClockFileOfClockEstimation.Header = ClockFile.Header; ClockFileOfClockEstimation.Header.SourceName = "CE" + ClockFileOfClockEstimation.Header.SourceName; ClockFileOfClockEstimation.Header.CreationDate = DateTime.Now.ToString(); ClockFileOfClockEstimation.Header.CreationAgence = "Gnsser"; ClockFileOfClockEstimation.Header.ANALYSIS_CENTER = "Gnsser"; ClockFileOfClockEstimation.Header.CreationProgram = "Gnsser"; ClockFileOfClockEstimation.Header.TYPES_OF_DATA.Clear(); ClockFileOfClockEstimation.Header.TYPES_OF_DATA.Add("AS"); ClockFileOfClockEstimation.Header.COUNT_OF_TYPES_OF_DATA = 1; ClockFileOfClockEstimation.Header.ClockSolnStations.Clear(); ClockFileOfClockEstimationResult.Header = ClockFileOfClockEstimation.Header; var resutlPath = Path.Combine("D:\\Temp\\ClockEstimation1\\", ClockFileOfClockEstimation.Header.SourceName); var errorResutlPath = Path.Combine("D:\\Temp\\ClockEstimation1\\", "error" + ClockFileOfClockEstimation.Header.SourceName); ClockFileWriter ClockFileWriter = new ClockFileWriter(resutlPath, ClockFileOfClockEstimation); ClockFileWriter.SaveToFile(); ClockFileWriter errorClockFileWriter = new ClockFileWriter(errorResutlPath, ClockFileOfClockEstimationResult); errorClockFileWriter.SaveToFile(); this.bindingSource1.DataSource = FitedResult; TableTextManager = new ObjectTableManager(); TableTextManager.OutputDirectory = "D:\\Temp\\ClockEstimation1\\"; var paramTable = TableTextManager.GetOrCreate(ClockFileOfClockEstimationResult.Name + "Params" + Time.UtcNow.DateTime.ToString("yyyy-MM-dd_HH_mm_ss")); int count = 0; SatelliteNumber prnIndex = new SatelliteNumber(); foreach (var item in ClockFileOfClockEstimationResult) { if (item.Count > count) { count = item.Count; prnIndex = item[0].Prn; } } var standard = ClockFileOfClockEstimationResult.GetClockItems(prnIndex); double DoubleDiffer = 0; foreach (var item in standard) { paramTable.NewRow(); paramTable.AddItem("Epoch", item.Time); foreach (var item1 in ClockFileOfClockEstimationResult.Names) { if (item1 == item.Name.ToString()) { continue; } var ss = ClockFileOfClockEstimationResult.GetClockItem(item1, item.Time); if (ss == null) { continue; } DoubleDiffer = item.ClockBias - ss.ClockBias; paramTable.AddItem(ss.Prn + "-" + item.Prn, DoubleDiffer * 1E9); } paramTable.EndRow(); } TableTextManager.WriteAllToFileAndCloseStream(); Geo.Utils.FileUtil.OpenDirectory("D:\\Temp\\ClockEstimation1\\"); }