Exemplo n.º 1
0
        /// <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);
            }
        }
Exemplo n.º 2
0
        /// <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);
        }