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(); } }
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 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\\"); }