public virtual void Dispose() { if (this.SummeryTables != null) { SummeryTables.Dispose(); } if (FloatValueTables != null) { FloatValueTables.Dispose(); } if (IntValueTables != null) { IntValueTables.Dispose(); } if (FractionValueTables != null) { FractionValueTables.Dispose(); } }
/// <summary> /// 构建产品,前提是星间单差浮点解已经算出。 /// </summary> public virtual void BuildProducts() { //统计参与计算情况 this.TotalObsCount = FloatValueTables.GetCountOfNumeralCell(); log.Info(BasePrn + " 可用计算数为:" + TotalObsCount); #region 浮点数、小数、整数 三剑客 //修理浮点解 this.FloatValueTables.RemoveEmptyRows(); //删除空行,减少计算量 this.FloatValueTables.RemoveTableDataCountLessThan(MinEpoch, MinSiteCount); //清理卫星数量过少和测站数量过少的数据 //修理小数部分 this.FractionValueTables = FloatValueTables.GetPeriodPipeFilterTable(1, 0.5, true, "FractionOf" + ProductTypeMarker);//统一小数部分区间 this.FractionValueTables.PipeFilterWithLastValues(MaxAllowedDiffer); this.FractionValueTables.RemoveColWithLastValOffCenter(MaxAllowedDiffer); this.FractionValueTables.RemoveTableDataCountLessThan(MinEpoch, MinSiteCount); this.FractionValueTables.OutputDirectory = this.OutputDirectory;//更新输出文件,否则将跑到PPP目录中去 //同步浮点数表与小数表,删除多余 this.FloatValueTables.SynchronizeTable(this.FractionValueTables); //获取整数部分,此处有待考虑部分跳跃情况的处理方式。 this.IntValueTables = FloatValueTables.GetIntByMinusAndRound(FractionValueTables, "IntOf" + ProductTypeMarker, true); this.IntValueTables.RemoveMinorityValueOfEachCol(); #endregion #region 统计与成果输出或更新 //每个测站最后的数值结果,并进行平均保存到表 var LastFraction = this.FractionValueTables.GetFractionOfLastValueOfAllCols(BasePrn + "", IngoreRowCountLessThan).Transpose("LastFractionOf" + ProductTypeMarker); LastFraction.GetAveragesWithStdDevAndAppendToTable(); if (LastFraction.IsEmpty) { log.Error(BasePrn + " LastFractionOf" + ProductTypeMarker + " 为空, 退出计算"); return; } SummeryTables.Add(LastFraction); //统计每个测站每个卫星参与计算的数量,便于与RMS对比分析 var ValueCountTable = FloatValueTables.GetValidDataCount(m => m > 0, BasePrn + "_EpochCountOf" + ProductTypeMarker).Transpose("", false); var sumDic = ValueCountTable.GetAndAppendSumToTable(); Dictionary <string, double[]> lastAveValues = FractionValueTables.GetAverageValsOfLastRow(IngoreRowCountLessThan); var vals = new Dictionary <string, double>(); var rms = new Dictionary <string, double>(); foreach (var item in lastAveValues) { vals[item.Key] = item.Value[0]; rms[item.Key] = item.Value[1]; } //表格数据的产品输出 var epoch = (Time)FractionValueTables.GetOne().LastRow["Epoch"]; AppendToProductTable(NameOfCountOfOriginalProduct, epoch, sumDic); //参与计算的数量 //AppendToProductTable(NameOfOriginalSDAmb, epoch, sumDic); //参与计算的数量 AppendToProductTable(NameOfOriginalProductRms, epoch, rms); //产品输出RMS var OriginalProduct = AppendToProductTable(NameOfOriginalProduct, epoch, vals); //产品输出 OriginalProduct.IndexColName = "BasePrn"; var basesicPrnChain = ObjectTableStorage.GetBasicFractionCascadeTransTable(OriginalProduct, "BasePrn", ProductTypeMarker); if (!basesicPrnChain.IsEmpty) { var nodes = Geo.Utils.ListUtil.GetNoRepeatList <string>(OriginalProduct.GetIndexStrings()); var basePrnChain = ObjectTableStorage.GetCascadePlusTransferTable(basesicPrnChain, nodes, "CascadePlusOf" + ProductTypeMarker); this.SummeryTables.Add(basesicPrnChain); this.SummeryTables.Add(basePrnChain); //一行式输出,追加到表格 BuildAndOutputProduct(basePrnChain, BasePrn + "", vals, epoch); } #endregion }