/// <summary> /// 构建并输出表格式产品,基于同一个基准站的宽项单差产品。其它星间单差可以递推获取。 /// </summary> /// <param name="basePrnChain"></param> /// <param name="basePrn"></param> /// <param name="mwFractionVals"></param> /// <param name="epoch"></param> protected void BuildAndOutputProduct(ObjectTableStorage basePrnChain, string basePrn, Dictionary <string, double> mwFractionVals, Time epoch) { lock (productLocker2) { //一行决定 var productName = "ProductOf" + ProductTypeMarker; var product = SummeryTables.ReadOrCreateTable(productName); //上一个BasePrn,如果没有,采用当前基准星 string lastBasePrn = basePrn; var avaiableBasePrn = basePrn; //可以使用的最终基准星 double baseVal = 0; if (product.RowCount > 0) //若之前有数据, { var lastRow = product.LastRow; //获取上次结果最后一行 lastBasePrn = lastRow["BasePrn"] + ""; //上一个基准星 } //获取当前采用的基准星对应最早基准星的差分结果 var baseDsbValRow = basePrnChain.GetRow(basePrn); if (baseDsbValRow != null && baseDsbValRow.ContainsKey(lastBasePrn)) { var objVal = baseDsbValRow[lastBasePrn]; if (Geo.Utils.ObjectUtil.IsNumerial(objVal)) { baseVal = Geo.Utils.ObjectUtil.GetNumeral(objVal) % 1; avaiableBasePrn = lastBasePrn; } } product.NewRow(); product.AddItem("Epoch", epoch); product.AddItem("BasePrn", avaiableBasePrn); //归算到一个区间内 var newMgr = new PeriodPipeFilterManager(1, 0.5); newMgr.Init(product); foreach (var item in mwFractionVals) { var prn = item.Key.Substring(0, 3); var val = newMgr.GetOrCreate(prn).Filter((item.Value + baseVal) % 1); product.AddItem(prn, val); } //当前行是否包含基准星与上一基准星的差值,如果没有,则采用上一行填充 var currentRow = product.CurrentRow; if (!currentRow.ContainsKey(basePrn))//是否包含当前基准星和上一基准星之差 { var val = newMgr.GetOrCreate(basePrn).Filter(baseVal); product.AddItem(basePrn, val); } //写入文件,下一次即将读取之 SummeryTables.WriteTable(product); } }
/// <summary> /// 构建汇总文档写最后的结果.可以作为当日产品。 /// 把所有的测站计算的最后结果,写入一个表格。 /// 列为每一颗卫星的差分标题,如 G02-G01。 /// 行为各颗卫星的数值。 /// 本表可以作为计算平均数用。 /// </summary> public ObjectTableStorage BuildLatestResultTable() { var table = new ObjectTableStorage(); var PeriodFilterManager = new PeriodPipeFilterManager(1, 0.5); foreach (var oneSiteSolver in this) { table.NewRow(); table.AddItem("Name", oneSiteSolver.Name);// 第一列为名称 var latestValues = oneSiteSolver.LatestEpochNarrowLaneValues; foreach (var item in latestValues.Keys) //每个测站对应一排 { var key = BuildDifferKey(item); var initVal = latestValues[item].SmoothValue; //结果统一到一个周期区间 var revisedVal = PeriodFilterManager.GetOrCreate(key).Filter(initVal); table.AddItem(key, revisedVal); } table.EndRow(); } return(table); }