private void Solver_ResultProduced(SimpleGnssResult entity, ObsFileProcessStreamer <MultiSiteEpochInfo, SimpleGnssResult> streamer) { if (entity == null) { return; } if (entity is SingleSiteGnssResult) { SingleSiteGnssResult result = entity as SingleSiteGnssResult; this.Coords.Add(new NamedRmsXyz(entity.Name, new RmsedXYZ(result.EstimatedXyz, result.EstimatedXyzRms))); } if (entity is IEstimatedBaseline) { var result = entity as IEstimatedBaseline; this.Coords.Add(new NamedRmsXyz(entity.Name, new RmsedXYZ(result.EstimatedXyzOfRov, XYZ.Parse(entity.ResultMatrix.Estimated.GetRmsVector())))); } if (this.Coords.Count == 0) { foreach (var item in streamer.Current) { Coords.Add(new NamedRmsXyz(item.SiteName, new RmsedXYZ(item.SiteInfo.ApproxXyz, XYZ.Zero))); } } }
/// <summary> /// 增加参数到存储表 /// </summary> /// <param name="epoch"></param> /// <param name="result"></param> private void AddSecondParam(ISiteSatObsInfo epoch, SimpleGnssResult result) { var table = TableTextManager.GetOrCreate(epoch.Name + Setting.EpochSecondParamFileExtension); table.NewRow(); table.AddItem("Epoch", epoch.ReceiverTime);//ToShortTimeString()); //table.AddItem((IVector)result.Adjustment.Estimated); foreach (var item in result.ResultMatrix.SecondParamNames) { table.AddItem(item, result.ResultMatrix.SecondEstimated[item]); } if (epoch.UnstablePrns.Count > 0 || epoch.RemovedPrns.Count > 0) { StringBuilder sb = new StringBuilder(); if (epoch.UnstablePrns.Count > 0) { sb.Append(String.Format(new EnumerableFormatProvider(), "{0}", epoch.UnstablePrns)); } if (epoch.RemovedPrns.Count > 0) { sb.Append(";" + String.Format(new EnumerableFormatProvider(), "{0}", epoch.RemovedPrns)); } table.AddItem("CsOrRemoved", sb.ToString()); } table.EndRow(); }
/// <summary> /// 追加一个测量结果信息 /// </summary> /// <param name="simpleResult"></param> public string BuildResultInfo(SimpleGnssResult simpleResult) { StringBuilder sb = new StringBuilder(); if (simpleResult is BaseGnssResult) { BaseGnssResult result = (BaseGnssResult)simpleResult; //数据源信息 AppendLine(sb, "数据源", result.Material.Name); if (result.Material is EpochInformation) { var epochInfo = result.Material as EpochInformation; var ObsInfo = epochInfo.ObsInfo; var SiteInfo = epochInfo.SiteInfo; BuildObsInfo(sb, ObsInfo); BuildSiteInfo(sb, SiteInfo); BuildContextInfo(sb, Context); BuildAdjustInfo(sb, result.ResultMatrix); } if (result.HasEstimatedXyz) { AppendLine(sb, "最终估值坐标:", result.EstimatedXyz); AppendLine(sb, "最终估值坐标RMS:", result.EstimatedXyzRms); AppendLine(sb, "大地坐标:", result.GeoCoord); } } return(sb.ToString()); }
/// <summary> /// 模糊度固定解 /// </summary> /// <param name="epoch"></param> /// <param name="result"></param> private void AddAmbFixed(ISiteSatObsInfo epoch, SimpleGnssResult result) { if (result.ResultMatrix.Estimated_PPPAR1 != null) { var tablenew = TableTextManager.GetOrCreate(epoch.Name + "PPPAR_Params"); tablenew.NewRow(); tablenew.AddItem("Epoch", epoch.ReceiverTime);//ToShortTimeString()); tablenew.AddItem("dx", result.ResultMatrix.Estimated_PPPAR1[0]); tablenew.AddItem("dy", result.ResultMatrix.Estimated_PPPAR1[1]); tablenew.AddItem("dz", result.ResultMatrix.Estimated_PPPAR1[2]); tablenew.AddItem("clk", result.ResultMatrix.Estimated_PPPAR1[3]); tablenew.AddItem("trop", result.ResultMatrix.Estimated_PPPAR1[4]); tablenew.EndRow(); var tablenew2 = TableTextManager.GetOrCreate(epoch.Name + "PPPAR_Params2"); tablenew2.NewRow(); tablenew2.AddItem("Epoch", epoch.ReceiverTime);//ToShortTimeString()); tablenew2.AddItem("dx", result.ResultMatrix.Estimated_PPPAR2[0]); tablenew2.AddItem("dy", result.ResultMatrix.Estimated_PPPAR2[1]); tablenew2.AddItem("dz", result.ResultMatrix.Estimated_PPPAR2[2]); tablenew2.AddItem("clk", result.ResultMatrix.Estimated_PPPAR2[3]); tablenew2.AddItem("trop", result.ResultMatrix.Estimated_PPPAR2[4]); tablenew2.EndRow(); } } /// <summary>
/// <summary> /// 添加钟跳结果 /// </summary> /// <param name="epoch"></param> /// <param name="result"></param> private void CheckOrAddClockJump(ISiteSatObsInfo epoch, SimpleGnssResult result) { if (this.PrevResult == null) { return; } if (result is SingleSiteGnssResult && PrevResult is SingleSiteGnssResult) { var pre = PrevResult as SingleSiteGnssResult; var res = result as SingleSiteGnssResult; double delta = res.RcvClkError - pre.RcvClkError; if (Math.Abs(delta) > 1e-4) { log.Info(epoch.Name + "在 " + epoch.ReceiverTime + "捕获到一个钟跳!与上历元偏差:" + delta + ",改正数(s):" + res.RcvClkCorrection); var table = TableTextManager.GetOrCreate(epoch.Name + "_ClockJump.cjump"); table.NewRow(); table.AddItem("Epoch", epoch.ReceiverTime); table.AddItem("Value", delta.ToString("G9")); } } }
} /// <summary> /// 增加参数RMS到存储表 /// </summary> /// <param name="epoch"></param> /// <param name="result"></param> private void AddSecondParamRms(ISiteSatObsInfo epoch, SimpleGnssResult result) { var tableRms = TableTextManager.GetOrCreate(epoch.Name + Setting.EpochSecondParamRmsFileExtension); tableRms.NewRow(); tableRms.AddItem("Epoch", epoch.ReceiverTime); tableRms.AddItem(result.ResultMatrix.StdOfSecondEstimatedParam); if (epoch.UnstablePrns.Count > 0 || epoch.RemovedPrns.Count > 0) { StringBuilder sb = new StringBuilder(); if (epoch.UnstablePrns.Count > 0) { sb.Append(String.Format(new EnumerableFormatProvider(), "{0}", epoch.UnstablePrns)); } if (epoch.RemovedPrns.Count > 0) { sb.Append(";" + String.Format(new EnumerableFormatProvider(), "{0}", epoch.RemovedPrns)); } tableRms.AddItem("CsOrRemoved", sb.ToString()); } tableRms.EndRow(); }
/// <summary> /// 统计一个结果 /// </summary> /// <param name="result"></param> public void Add(SimpleGnssResult result) { if (result == null) { return; } Results.Add(result); }
private void Solver_ResultProduced(SimpleGnssResult product, ObsFileProcessStreamer <MultiSiteEpochInfo, SimpleGnssResult> arg2) { if (product is SingleSiteGnssResult) { var entity = product as SingleSiteGnssResult; this.Coords.Add(new NamedRmsXyz(entity.Name, new RmsedXYZ(entity.EstimatedXyz, entity.EstimatedXyzRms))); } }
/// <summary> /// 在界面上打印出执行结果,同时保存到日志中。 /// 非差重要,必须输出,不然白算了。!! /// </summary> /// <param name="last"></param> protected void ShowResultOnSummaryTextbox(SimpleGnssResult last) { if (last == null) { return; } var val = last.ToShortTabValue(); log.Fatal(val); AppdendLineToSummaryString(val); }
/// <summary> /// 最后的计算结果显示计算结果在界面上 /// </summary> /// <param name="last"></param> protected void AppendFinalResultOnUI(SimpleGnssResult last) { if (last == null) { return; } ShowResultOnSummary(last);//这个必须显示,不然全白算了 //写入汇总文件,必须写,不然无法找到计算结果 if (Setting.IsShowInfo) { ShowGeneralResultInfo(last); } if (IsShowData) { ShowAdjustMatrix(last); } if (last != null) { log.Fatal(last.Name + "\t" + last.ReceiverTime + "\t" + "RmsOfEstimated\t" + FormatVector(last.ResultMatrix.Estimated.GetRmsVector())); log.Fatal(last.Name + "\t" + last.ReceiverTime + "\t" + "Estimated\t" + FormatVector(last.ResultMatrix.Estimated)); log.Fatal(last.Name + "\t" + last.ReceiverTime + "\t" + "ParamNames\t" + String.Format(new EnumerableFormatProvider(), "{0:\t}", last.ParamNames)); } //写最后的值 StringBuilder sb = new StringBuilder(); sb.AppendLine("Est and Rms:"); sb.AppendLine(String.Format(new EnumerableFormatProvider(), "{0:,6.4 }", last.ResultMatrix.Estimated.ParamNames)); var vector = last.ResultMatrix.Estimated.GetRmsedVector(); int length = vector.Count; for (int i = 0; i < length; i++) { var rmsVal = vector.GetItem(i); if (i != 0) { sb.Append(", "); } sb.Append(rmsVal.Value.ToString("G5")); } sb.AppendLine(); for (int i = 0; i < length; i++) { var rmsVal = vector.GetItem(i); if (i != 0) { sb.Append(", "); } sb.Append(rmsVal.Rms.ToString("G5")); } sb.AppendLine(); log.Fatal(sb.ToString()); }
/// <summary> /// 构建最终信息 /// </summary> /// <param name="result"></param> /// <returns></returns> public string BuildFinalInfo(SimpleGnssResult result) { StringBuilder sb = new StringBuilder(); sb.AppendLine("--------------- 计算配置信息 -------------------"); sb.Append(BuildOptionInfo(Option)); sb.AppendLine("--------------- 测站详情 -------------------"); sb.Append(BuildResultInfo(result)); return(sb.ToString()); }
/// <summary> /// 在首个文本界面显示计算概略信息。 /// </summary> protected void ShowGeneralResultInfo(SimpleGnssResult lastResult) { TimeSpan span = DateTime.Now - StartTime; StringBuilder sb = new StringBuilder(); sb.AppendLine("耗时:\t" + DateTimeUtil.GetFloatString(span)); ReadableGnssResultBuilder builder = new ReadableGnssResultBuilder(); var info = builder.Build(lastResult); ShowInfo(sb.ToString() + info); }
/// <summary> /// 显示平差矩阵 /// </summary> /// <param name="adjustResult"></param> protected void ShowAdjustMatrix(SimpleGnssResult adjustResult) { if (adjustResult == null) { return; } StringBuilder sb = new StringBuilder(); sb.AppendLine(adjustResult.ResultMatrix.ToReadableText()); var str = sb.ToString(); ShowAdjustString(str); }
/// <summary> /// 输出结果。根据设置。 /// </summary> /// <param name="GnssResults"></param> protected void OutputFinalResult(SimpleGnssResult GnssResult) { if (GnssResult == null) { return; } if (Option.IsOutputResult && GnssResult is BaseGnssResult) { log.Info(GnssResult.Name + ", " + GnssResult.ReceiverTime + ", 即将输出结果文件..."); var writer = new GnssResultWriter(Option, this.Option.IsOutputEpochResult, Option.IsOutputEpochSatInfo); writer.WriteFinal((BaseGnssResult)GnssResult); } }
/// <summary> /// 检查并进行正反算 /// </summary> protected void CheckAndRunReverseSove() { while (this.OrdinalAndReverseCount > 0) { // GnssResultBuilder.Clear(); this.IsInReversing = true; this.OrdinalAndReverseCount--; this.IsReversedDataSource = !this.IsReversedDataSource; var info = "数据流 即将进行 "; info += (this.IsReversedDataSource ? "反" : "正") + "算, "; info += "剩余单独计算次数 " + this.OrdinalAndReverseCount; log.Info(info); //Init(); // BuildAndSetDataStream();//按照指定顺序,重新初始化数据流 SetDataStreamAndInit(); //是否清空输出缓存 if (Option.IsClearOutBufferWhenReversing) { ClearResultBuffer(); this.TableTextManager.Clear(); } Running(); var last1 = this.CurrentGnssResult; if (last1 != null && last1 is SimpleGnssResult) { SimpleGnssResult last = last1 as SimpleGnssResult; log.Info(GnssResultBuilder.BuildFinalInfo(last)); log.Fatal(last.Name + "\t" + last.ReceiverTime + "\t" + "ParamNames\t" + String.Format(new EnumerableFormatProvider(), "{0:\t}", last.ParamNames)); log.Fatal(last.Name + "\t" + last.ReceiverTime + "\t" + "RmsOfEstimated\t" + FormatVector(last.ResultMatrix.Estimated.GetRmsVector())); log.Fatal(last.Name + "\t" + last.ReceiverTime + "\t" + "Estimated\t" + FormatVector(last.ResultMatrix.Estimated)); } } this.IsInReversing = false; }
/// <summary> /// 增加DOP结果 /// </summary> /// <param name="epoch"></param> /// <param name="result"></param> private void AddDop(ISiteSatObsInfo epoch, SimpleGnssResult result) { //无测站信息,或固定参考站, if ((result is SingleSiteGnssResult) && result.ParamNames.Contains(Gnsser.ParamNames.Dx)) { var singleSiteResult = result as SingleSiteGnssResult; var sysName = Geo.Utils.StringUtil.ToString(Option.SatelliteTypes, "_"); var tableDOP = TableTextManager.GetOrCreate(epoch.Name + sysName + Setting.EpochDopFileExtension); tableDOP.NewRow(); tableDOP.AddItem("Epoch", singleSiteResult.ReceiverTime); tableDOP.AddItem("TotalPrns", epoch.EnabledSatCount); tableDOP.AddItem("GDOP", singleSiteResult.DilutionOfPrecision.GDOP); tableDOP.AddItem("PDOP", singleSiteResult.DilutionOfPrecision.PDOP); tableDOP.AddItem("HDOP", singleSiteResult.DilutionOfPrecision.HDOP); tableDOP.AddItem("VDOP", singleSiteResult.DilutionOfPrecision.VDOP); tableDOP.EndRow(); } }
private void Solver_ResultProduced(SimpleGnssResult entity, ObsFileProcessStreamer <EpochInformation, SimpleGnssResult> streamer) { if (entity == null) { return; } if (entity is SingleSiteGnssResult) { SingleSiteGnssResult result = entity as SingleSiteGnssResult; this.Coords.Add(new NamedRmsXyz(entity.Name, new RmsedXYZ(result.EstimatedXyz, result.EstimatedXyzRms))); } if (entity is IWithEstimatedBaseline) { var result = entity as IWithEstimatedBaseline; this.Coords.Add(new NamedRmsXyz(entity.Name, result.GetEstimatedBaseline().EstimatedRmsXyzOfRov)); } }
/// <summary> /// 打印出执行结果 /// </summary> /// <param name="last"></param> private void SaveLastResult(SimpleGnssResult last) { // if(BaseGnssResult ) var projPath = Path.Combine(this.OupputDirecory, "Baseline.Summery.baseline"); Geo.Utils.FileUtil.CheckOrCreateDirectory(this.OupputDirecory); //if (SiteInfoWriter == null) //{ // SiteInfoWriter = new SiteInfoWriter(projPath); //} ////SiteInfoWriter.Write(last.SiteInfo); //SiteInfoWriter.StreamWriter.Flush(); var ddResult = last as IonFreeDoubleDifferPositionResult;// DoubleDifferPositionResult; string msg = last.Name + "\t" + Geo.Utils.DateTimeUtil.GetFormatedDateTimeNow() + "\t" + ddResult.ReceiverTime + "\t" + ddResult.GetEstimatedBaseline().EstimatedVector.GetTabValues() + "\t" ; if (!File.Exists(projPath)) { var titles = new StringBuilder(); titles.Append("Name"); titles.Append("\t"); titles.Append("CaculateTime"); titles.Append("\t"); titles.Append("ReceiverTime"); titles.Append("\t"); titles.Append("X"); titles.Append("\t"); titles.Append("Y"); titles.Append("\t"); titles.Append("Z"); titles.AppendLine(); File.AppendAllText(projPath, titles.ToString()); } File.AppendAllText(projPath, msg + "\r\n"); }
/// <summary> /// 增加坐标到存储表,主要用于导航解算 /// </summary> /// <param name="epoch"></param> /// <param name="gnssResult"></param> private void AddEpochCoord(ISiteSatObsInfo epoch, SimpleGnssResult gnssResult) { if (gnssResult is SingleSiteGnssResult) { var result = (SingleSiteGnssResult)gnssResult; var table = TableTextManager.GetOrCreate(epoch.Name + Setting.EpochCoordFileExtension); table.NewRow(); table.AddItem("Epoch", epoch.ReceiverTime); //ToShortTimeString()); var dxyz = result.XyzCorrection; // XYZ.Parse(result.Adjustment.Estimated); if (dxyz != null) { var xyz = result.EstimatedXyz; var geo = result.GeoCoord; table.AddItem(Gnsser.ParamNames.X, xyz.X.ToString("0.0000")); table.AddItem(Gnsser.ParamNames.Y, xyz.Y.ToString("0.0000")); table.AddItem(Gnsser.ParamNames.Z, xyz.Z.ToString("0.0000")); //精确到亚毫米 table.AddItem(Gnsser.ParamNames.Lon, geo.Lon.ToString("0.00000000")); table.AddItem(Gnsser.ParamNames.Lat, geo.Lat.ToString("0.00000000")); table.AddItem(Gnsser.ParamNames.Height, geo.Height.ToString("0.0000")); } } if (gnssResult is IEstimatedBaseline) { var result = (IEstimatedBaseline)gnssResult; var table = TableTextManager.GetOrCreate(epoch.Name + Setting.EpochCoordFileExtension); table.NewRow(); table.AddItem("Epoch", epoch.ReceiverTime); //ToShortTimeString()); var xyz = result.EstimatedXyzOfRov; //.EstimatedXyz; var geo = Geo.Coordinates.CoordTransformer.XyzToGeoCoord(xyz); // result.GeoCoord; table.AddItem(Gnsser.ParamNames.X, xyz.X.ToString("0.0000")); table.AddItem(Gnsser.ParamNames.Y, xyz.Y.ToString("0.0000")); table.AddItem(Gnsser.ParamNames.Z, xyz.Z.ToString("0.0000")); //精确到亚毫米 table.AddItem(Gnsser.ParamNames.Lon, geo.Lon.ToString("0.00000000")); table.AddItem(Gnsser.ParamNames.Lat, geo.Lat.ToString("0.00000000")); table.AddItem(Gnsser.ParamNames.Height, geo.Height.ToString("0.0000")); } }
/// <summary> /// 在结果上面显示参数名称行 /// </summary> /// <param name="last"></param> protected void ShowResultTitleOnSummaryTextbox(SimpleGnssResult last) { if (last == null) { return; } this.Invoke(new Action(delegate() { if (this.OutputTextBoxes[1].Text.Length < 5) { string msg = last.ToShortTabTitles(); if (this.Disposing || this.IsDisposed) { return; } // var info = DateTimeUtil.GetFormatedTimeNow(true) + ":\t" + msg; this.AppdendLineToSummaryString(msg); } })); }
/// <summary> /// 输出算后残差 /// </summary> /// <param name="epoch"></param> /// <param name="gnssResult"></param> private void AddResidual(ISiteSatObsInfo epoch, SimpleGnssResult gnssResult) { var fileName = ResultFileNameBuilder.BuildEpochResidualFileName(epoch.Name); var table = TableTextManager.GetOrCreate(fileName); table.NewRow(); table.AddItem("Epoch", epoch.ReceiverTime);//ToShortTimeString()); var names = gnssResult.ResultMatrix.ObsMatrix.Observation.ParamNames; int i = 0; //var obs = gnssResult.ResultMatrix.ObsMatrix.Observation - gnssResult.ResultMatrix.ObsMatrix.FreeVector; var obs = gnssResult.ResultMatrix.PostfitResidual;//.ObsMatrix.Observation - gnssResult.ResultMatrix.ObsMatrix.FreeVector; foreach (var item in obs) { string name = i + ""; if (names != null) { name = names[i] ?? i + ""; } table.AddItem(name, obs[i]); i++; } }
/// <summary> /// 处理一个历元 /// </summary> /// <param name="epoch"></param> public override SimpleGnssResult Produce(EpochInformation epoch) { if (!this.EphemerisDataSource.TimePeriod.Contains(epoch.ReceiverTime)) { this.IsCancel = true; log.Warn("星历结束,结束计算!" + this.EphemerisDataSource.TimePeriod); } if (epoch.Count == 0) { log.Error(epoch.ToShortString() + ", 没有可用卫星,是否系统选错了?"); return(null); } ISiteSatObsInfo material = null; SimpleGnssResult result = null; if (Solver is SingleSiteGnssSolver) { material = epoch; result = ((SingleSiteGnssSolver)Solver).Get(epoch); } else if (Solver is SingleSitePeriodSolver) //单站多历元 { PeriodInformationBuilder.Add(epoch); var period = PeriodInformationBuilder.Build(); if (period == null || !period.Enabled) { return(null); } material = period; result = ((SingleSitePeriodSolver)Solver).Get(period); PeriodInformationBuilder.Data.Clear(); } else if (Solver is CommonSingeSatGnssSolver || Solver is CommonSingePeriodSatGnssSolver) //单站多历元 { material = epoch; if (!epoch.Contains(this.Prn)) {//如果星历不存在则重新选星 if (this.Option.IsIndicatedPrn) { this.Prn = this.Option.IndicatedPrn; } else { //this.Prn = epoch.FirstKey; this.Prn = epoch.GetMaxElevationPrn(); log.Info(this.Name + ", 最大高度角选星:" + this.Prn); } } var sat = epoch.Get(this.Prn); if (sat == null) { return(null); } if (Solver is CommonSingeSatGnssSolver) { result = ((CommonSingeSatGnssSolver)Solver).Get(sat); } else if (Solver is CommonSingePeriodSatGnssSolver) //单站多历元 { if (PeriodSatelliteBuilder.Add(sat)) { var period = PeriodSatelliteBuilder.Build(); if (period == null || !period.Enabled) { return(null); } //material = period; result = ((CommonSingePeriodSatGnssSolver)Solver).Get(period); } } } return(result); }
/// <summary> /// 显示一个 /// </summary> /// <param name="last"></param> protected void ShowResultOnSummary(SimpleGnssResult last) { ShowResultTitleOnSummaryTextbox(last); ShowResultOnSummaryTextbox(last); }
/// <summary> /// 增加参数RMS到存储表 /// </summary> /// <param name="epoch"></param> /// <param name="result"></param> private void AddParamRms(ISiteSatObsInfo epoch, SimpleGnssResult result) { var fileName = ResultFileNameBuilder.BuildEpochParamRmsFileName(epoch.Name); var tableRms = TableTextManager.GetOrCreate(fileName); tableRms.NewRow(); tableRms.AddItem("Epoch", epoch.ReceiverTime); if (result is SingleSiteGnssResult || result is SingleSitePeriodInfoGnssResult) { if (result.ParamNames.Contains(ParamNames.Dx)) { XYZ xyz = new XYZ(); CovaedXyz covaedXyz = null; if (result is SingleSiteGnssResult) { var singleSiteResult = result as SingleSiteGnssResult; xyz = singleSiteResult.ApproxXyz; covaedXyz = singleSiteResult.CovaedEstXyz; } if (result is SingleSitePeriodInfoGnssResult) { var period = result as SingleSitePeriodInfoGnssResult; xyz = period.MaterialObj[0].SiteInfo.ApproxXyz; covaedXyz = period.CovaedEstXyz; } var dxyz = ((BaseGnssResult)result).EstimatedXyzRms;// result.EstimatedXyzRms;// XYZ.Parse(result.Adjustment.Estimated); if (dxyz != null && dxyz != XYZ.Zero) { // var tmsenu = CoordTransformer.LocaXyzToEnu(dxyz, xyz); var cova = ((BaseGnssResult)result).CovaOfFirstThree; var tmsenu = CoordTransformer.XyzToEnuRms(cova, xyz); tableRms.AddItem(Gnsser.ParamNames.De, Math.Abs(tmsenu.E)); tableRms.AddItem(Gnsser.ParamNames.Dn, Math.Abs(tmsenu.N)); tableRms.AddItem(Gnsser.ParamNames.Du, Math.Abs(tmsenu.U)); } } } if (result is IWithEstimatedBaseline) { var info = result as IWithEstimatedBaseline; var baseLine = info.GetEstimatedBaseline(); var xyz = baseLine.EstimatedXyzOfRov; var dxyz = ((BaseGnssResult)result).EstimatedXyzRms; // var tmsenu = CoordTransformer.LocaXyzToEnu(dxyz, xyz); var cova = ((BaseGnssResult)result).CovaOfFirstThree; var tmsenu = CoordTransformer.XyzToEnuRms(cova, xyz); tableRms.AddItem(Gnsser.ParamNames.De, Math.Abs(tmsenu.E)); tableRms.AddItem(Gnsser.ParamNames.Dn, Math.Abs(tmsenu.N)); tableRms.AddItem(Gnsser.ParamNames.Du, Math.Abs(tmsenu.U)); } tableRms.AddItem(result.ResultMatrix.StdOfEstimatedParam); if (epoch.UnstablePrns.Count > 0 || epoch.RemovedPrns.Count > 0) { StringBuilder sb = new StringBuilder(); if (epoch.UnstablePrns.Count > 0) { sb.Append(String.Format(new EnumerableFormatProvider(), "{0}", epoch.UnstablePrns)); } if (epoch.RemovedPrns.Count > 0) { sb.Append(";" + String.Format(new EnumerableFormatProvider(), "{0}", epoch.RemovedPrns)); } tableRms.AddItem("CsOrRemoved", sb.ToString()); } tableRms.AddItem(ParamNames.ResultType, result.ResultMatrix.ResultType); tableRms.AddItem(ParamNames.StdDev, result.ResultMatrix.StdDev); tableRms.EndRow(); }
/// <summary> /// 输出结果 /// </summary> /// <param name="epoch"></param> /// <param name="result"></param> public void AddEpochResult(ISiteSatObsInfo epoch, SimpleGnssResult result) { //结果采样率过滤 var interval = Math.Abs(epoch.ReceiverTime - PrevEpoch); if (interval < this.OutputMinInterval) { return; } PrevEpoch = epoch.ReceiverTime; //总开关 if (!Option.IsOutputResult && !Option.IsOutputEpochResult) { return; } var Adjustment = result.ResultMatrix; var ParamNames = result.ParamNames; //各历元信息 #region 默认逐历元输出 //参数值 if (Option.IsOutputEpochParam) { AddEpochParam(epoch, result); } // RMS if (Option.IsOutputEpochParamRms) { AddParamRms(epoch, result); } //钟跳 if (Option.IsOutputJumpClockFile) { CheckOrAddClockJump(epoch, result); } //第二参数 if (result.ResultMatrix.SecondEstimated != null) { AddSecondParam(epoch, result); AddSecondParamRms(epoch, result); } //DOP if (this.Option.IsOutputEpochDop) { AddDop(epoch, result); } //两路滤波,模糊度固定解 AddAmbFixed(epoch, result); //动态定位,且坐标未固定,则添加 if (this.Option.IsOutputEpochCoord || (this.Option.PositionType == PositionType.动态定位 && !this.Option.IsFixingCoord)) { AddEpochCoord(epoch, result); } #endregion #region 择性历元输出 #region 平差文件 if (this.Option.IsOutputAdjust) { AioAdjustFileBuilder.AddAdjustment(Adjustment); } if (this.Option.IsOutputObsEquation) { AdjustEquationFileBuilder.AddAdjustment(Adjustment); } if (this.Option.IsOutputAdjustMatrix) { if (results == null) { results = new List <SimpleGnssResult>(); } results.Add(result); } #endregion #region 电离层产品 if (this.Option.IsOutputIono) { BuildIonoResult(epoch, Adjustment, ParamNames); } #endregion #region 对流层产品 if (this.Option.IsOutputWetTrop && Geo.Utils.StringUtil.Contanis(ParamNames, Gnsser.ParamNames.WetTropZpd, true) && epoch.ReceiverTime.SecondsOfDay % 300 == 0) { var table = TableTextManager.GetOrCreate(epoch.Name + "_" + Gnsser.ParamNames.WetTropZpd); table.NewRow(); table.AddItem("Epoch", epoch.ReceiverTime); EpochInformation epochInfo = epoch as EpochInformation; //var ionoResult = Adjustment.Estimated.GetAll(Gnsser.ParamNames.WetTrop); //天顶对流层总延迟,epochInfo[0].WetMap_ZTD=1 table.AddItem("Trop1", epochInfo[0].AppriorTropDelay + epochInfo[0].WetMap_ZTD * result.ResultMatrix.Estimated[4, 0]); table.AddItem("Trop2", epochInfo[1].WetMap_ZTD * result.ResultMatrix.Estimated[4, 0]); table.AddItem("Trop3", result.ResultMatrix.Estimated[4, 0]); //epoch[0].AppriorTropDelay + epoch[0].WetMap_ZTD * //foreach (var item in ionoResult) //{ // table.AddItem(item.Key, item.Value.Value); //} } #endregion #region 历元卫星观测信息 if (Option.IsOutputEpochSatInfo) { AddSiteEpochSatInfo(epoch); } #endregion #endregion if (Option.IsOutputObservation) { AddObservation(epoch, result); } if (Option.IsOutputResidual) { this.AddResidual(epoch, result); } //轨道产品输出 if (result is IOrbitResult) { var ephs = ((IOrbitResult)result).EphemerisResults; Sp3Section sp3Records = new Sp3Section(ephs.First.Original.Time); foreach (var eph in ephs) { sp3Records.Add(eph.Original.Prn, eph.Corrected); } Sp3Writer.Write(sp3Records); } this.PrevResult = result; }
/// <summary> /// 增加参数到存储表 /// </summary> /// <param name="epoch"></param> /// <param name="result"></param> private void AddEpochParam(ISiteSatObsInfo epoch, SimpleGnssResult result) { var fileName = ResultFileNameBuilder.BuildEpochParamFileName(epoch.Name); var table = TableTextManager.GetOrCreate(fileName); table.NewRow(); table.AddItem("Epoch", epoch.ReceiverTime);//ToShortTimeString()); if (result is SingleSiteGnssResult || result is IWithEstimatedBaselines || result is SingleSitePeriodInfoGnssResult || result is IWithEstimatedBaseline) { XYZ appXyz = new XYZ(); XYZ estXyz = new XYZ(); if (result is SingleSiteGnssResult) { var singleSiteResult = result as SingleSiteGnssResult; appXyz = singleSiteResult.ApproxXyz; estXyz = singleSiteResult.EstimatedXyz; } if (result is SingleSitePeriodInfoGnssResult) { var period = result as SingleSitePeriodInfoGnssResult; appXyz = period.MaterialObj[0].SiteInfo.ApproxXyz; } if (result is IWithEstimatedBaseline) { var info = result as IWithEstimatedBaseline; var baseLine = info.GetEstimatedBaseline(); estXyz = baseLine.EstimatedXyzOfRov; appXyz = baseLine.ApproxXyzOfRov; } if (result is IWithEstimatedBaselines) { var info = result as IWithEstimatedBaselines; var baseLine = info.GetEstimatedBaselines().First; estXyz = baseLine.EstimatedXyzOfRov; appXyz = baseLine.ApproxXyzOfRov; } var dxyz = ((BaseGnssResult)result).XyzCorrection; // XYZ.Parse(result.Adjustment.Estimated); if (dxyz != null) //&& epoch.ReceiverTime.SecondsOfDay % 30 == 0 { ENU enu = null; if (this.Option.IsUpdateEstimatePostition) { dxyz = estXyz - appXyz; enu = CoordTransformer.XyzToEnu(estXyz, appXyz); } else { enu = CoordTransformer.LocaXyzToEnu(dxyz, appXyz); } table.AddItem(Gnsser.ParamNames.De, enu.E); table.AddItem(Gnsser.ParamNames.Dn, enu.N); table.AddItem(Gnsser.ParamNames.Du, enu.U); if (this.Option.IsUpdateEstimatePostition || this.Option.PositionType == PositionType.动态定位) { table.AddItem("EstX", estXyz.X); table.AddItem("EstY", estXyz.Y); table.AddItem("EstZ", estXyz.Z); } } } #region 添加钟结果改正 if (result is ClockEstimationResult) { var mEpochInfo = epoch as MultiSiteEpochInfo; List <string> paranames = result.ResultMatrix.ParamNames; int CountOfSat = epoch.EnabledSatCount * 2; foreach (var item in epoch.EnabledPrns) { double qq = result.ResultMatrix.Corrected.CorrectedValue[paranames.IndexOf(item + "_" + ParamNames.SatClkErrDistance)]; table.AddItem(item.ToString(), qq); int count = 0; double time = 0; Time EmissionSatClockTime = new Time();// Time.Default; //Time EmissionSatClockTime1 = Time.Default; foreach (var item2 in mEpochInfo) { foreach (var item3 in item2) { if (item3.Prn == item) { count++; time += item3.Ephemeris.ClockBias - ((Ephemeris)item3.Ephemeris).RelativeCorrection; //EmissionSatClockTime.TickTime.SecondTicks += item3.EmissionTime.TickTime.SecondTicks; EmissionSatClockTime.TickTime += item3.EmissionTime.TickTime; break; } } } double aa = qq / 0.3 + time * 1e9 / count; double time1 = (EmissionSatClockTime.TickTime.SecondTicks + EmissionSatClockTime.TickTime.Fraction) / count; EmissionSatClockTime.TickTime = SecondTime.FromSecond(time1); table.AddItem(item + "EmissionSatClockTime", EmissionSatClockTime.ToString()); table.AddItem(item + "_Corrected", aa); } } #endregion //table.AddItem((IVector)result.Adjustment.Estimated); foreach (var name in result.ParamNames) { //if (item.Length == 6 && item.Substring(3, 3) == "_λN") //{ // table.AddItem(item.Substring(0, 3), result.Adjustment.Estimated[item]); //} //else { table.AddItem(name, result.ResultMatrix.Estimated[name]); } } if (epoch.UnstablePrns.Count > 0 || epoch.RemovedPrns.Count > 0) { StringBuilder sb = new StringBuilder(); if (epoch.UnstablePrns.Count > 0) { sb.Append(String.Format(new EnumerableFormatProvider(), "{0}", epoch.UnstablePrns)); } if (epoch.RemovedPrns.Count > 0) { sb.Append(";" + String.Format(new EnumerableFormatProvider(), "{0}", epoch.RemovedPrns)); } table.AddItem("CsOrRemoved", sb.ToString()); } table.AddItem(ParamNames.ResultType, result.ResultMatrix.ResultType); table.AddItem(ParamNames.StdDev, result.ResultMatrix.StdDev); table.EndRow(); }
/// <summary> /// 多站结果 /// </summary> /// <param name="mainSb"></param> /// <param name="firstObject"></param> private void BuildGeneraInfoTableOfMultiSites(StringBuilder mainSb, SimpleGnssResult firstObject) { var last = Results.Last(); var sb = new StringBuilder(); sb.Append(BuildTableHeaderCell("Num")); sb.Append(BuildTableHeaderCell("Name")); sb.Append(BuildTableHeaderCell("StdDev")); sb.Append(BuildTableHeaderCell(ParamNames.ResultType)); sb.Append(BuildTableHeaderCell("X")); sb.Append(BuildTableHeaderCell("Y")); sb.Append(BuildTableHeaderCell("Z")); sb.Append(BuildTableHeaderCell("Lon")); sb.Append(BuildTableHeaderCell("Lat")); sb.Append(BuildTableHeaderCell("Height")); sb.Append(BuildTableHeaderCell("RmsE")); sb.Append(BuildTableHeaderCell("RmsN")); sb.Append(BuildTableHeaderCell("RmsU")); if (last.HasParamAccuracyInfos) { foreach (var kv in firstObject.ParamAccuracyInfos.KeyValues) { sb.Append(BuildTableHeaderCell(kv.Key)); } } sb.Append(BuildTableHeaderCell("Epoch")); var row = BuildTableRow(sb.ToString()); mainSb.Append(row); var format = "G5"; if (HasResults()) { int i = 1; var baselineObj = firstObject as IWithEstimatedBaselines; var baselines = baselineObj.GetEstimatedBaselines(); foreach (var baseline in baselines) { sb = new StringBuilder();; sb.Append(BuildTableCell(i)); sb.Append(BuildTableCell(baseline.Name)); sb.Append(BuildTableCell(firstObject.ResultMatrix.StdDev.ToString(format))); sb.Append(BuildTableCell(firstObject.ResultMatrix.ResultType.ToString())); var EstimatedXyz = baseline.EstimatedRmsXyzOfRov.Value; sb.Append(BuildTableCell(EstimatedXyz.X.ToString("0.#####"))); sb.Append(BuildTableCell(EstimatedXyz.Y.ToString("0.#####"))); sb.Append(BuildTableCell(EstimatedXyz.Z.ToString("0.#####"))); var geoCoord = baseline.EstimatedGeoCoordOfRov; sb.Append(BuildTableCell(new DMS(geoCoord.Lon).ToReadableDms())); sb.Append(BuildTableCell(new DMS(geoCoord.Lat).ToReadableDms())); sb.Append(BuildTableCell(geoCoord.Height.ToString("0.#####"))); var tmsenu = CoordTransformer.LocaXyzToEnu(baseline.EstimatedRmsXyzOfRov.Rms, baseline.ApproxXyzOfRov); sb.Append(BuildTableCell(Math.Abs(tmsenu.E).ToString(format))); sb.Append(BuildTableCell(Math.Abs(tmsenu.N).ToString(format))); sb.Append(BuildTableCell(Math.Abs(tmsenu.U).ToString(format))); if (last.HasParamAccuracyInfos) { foreach (var kv in firstObject.ParamAccuracyInfos.KeyValues) { var val = kv.Value.RmsValue.Value; var isOk = firstObject.ParamAccuracyInfos.IsOk(kv.Value); var str = (val * 1e3).ToString("0.000"); if (!isOk) { str = "<b class='red'>" + str + "</b>"; } sb.Append(BuildTableCell(str)); } } sb.Append(BuildTableCell(firstObject.ReceiverTime)); var rowContent = BuildTableRow(sb.ToString()); mainSb.Append(rowContent); mainSb.AppendLine(); i++; } } }