/// <summary> /// 所有测站与指定参考星的差分值(浮点数)。 /// 必须与测站共视才可以差分。结果中包括了共视时段。 /// </summary> /// <param name="basePrn"></param> /// <returns></returns> public MultiSitePeriodValueStorage GetRawDiffer(SatelliteNumber basePrn) { if (CasheOfRawDiffers.Contains(basePrn)) { return(CasheOfRawDiffers[basePrn]); } lock (rawDifferLocker) { if (CasheOfRawDiffers.Contains(basePrn)) { return(CasheOfRawDiffers[basePrn]); } log.Info("开始生成 星间单差浮点数,基准星:" + basePrn); MultiSitePeriodValueStorage sitePeriodDifferFloat = new MultiSitePeriodValueStorage("所有站星间单差宽巷浮点数模糊度(MW)"); foreach (var siteKv in this.Data) { if (!siteKv.Value.Contains(basePrn)) { continue; } string siteName = siteKv.Key; var periodVals = siteKv.Value; MultiSatPeriodRmsNumeralStorage newSite = periodVals.GetRawDiffer(basePrn); sitePeriodDifferFloat.Add(siteName, newSite); } log.Info("星间单差浮点数生成完毕,基准星:" + basePrn); CasheOfRawDiffers[basePrn] = sitePeriodDifferFloat; return(sitePeriodDifferFloat); } }
/// <summary> /// 四舍五入法固定模糊度 /// </summary> /// <param name="maxDifferForAmbi">允许的最大偏差</param> /// <param name="maxRms">允许的最大的RMS</param> /// <param name="fractions">小数部分产品</param> /// <returns></returns> public MultiSitePeriodValueStorage GetRoundInt(Dictionary <SatelliteNumber, RmsedNumeral> fractions, double maxDifferForAmbi, double maxRms) { MultiSitePeriodValueStorage result = new MultiSitePeriodValueStorage("所有站宽巷星间单差整数模糊度"); foreach (var siteKv in this.Data) //遍历计算所有测站 { string siteName = siteKv.Key; var periodVals = siteKv.Value; MultiSatPeriodRmsNumeralStorage newSite = periodVals.GetRoundInt(siteName, fractions, maxDifferForAmbi, maxRms); if (newSite.Count > 0) { result.Add(newSite.Name, newSite); } } return(result); }
/// <summary> /// 解析表格获取对象 /// </summary> /// <param name="table"></param> /// <returns></returns> public static MultiSitePeriodValueStorage ParseDetailTable(ObjectTableStorage table) { MultiSitePeriodValueStorage store = new MultiSitePeriodValueStorage(table.Name); store.DetailTable = table; foreach (var row in table.BufferedValues) { var site = row["Site"].ToString(); var prn = SatelliteNumber.Parse(row["Name"].ToString()); var period = TimePeriod.Parse(row["Group"].ToString()); var val = (double)row["Value"]; var rms = (double)row["RMS"]; store.GetOrCreate(site).GetOrCreate(prn)[period] = new RmsedNumeral(val, rms); } return(store); }
/// <summary> /// 返回宽巷差分后的整数部分,用于固定模糊度,注意区分时段。 /// 如果不含基准卫星,返回null /// </summary> /// <param name="basePrn">基准卫星</param> /// <param name="maxDifferForAmbi">允许的最大偏差</param> /// <param name="maxRms">允许的最大的RMS</param> /// <returns></returns> public MultiSitePeriodValueStorage GetDifferInt(SatelliteNumber basePrn, double maxDifferForAmbi = 0.35, double maxRms = 0.8) { log.Info("开始生成星间单差模糊度,基准星:" + basePrn); //宽巷小数产品 var fracProducts = GetDifferFractionProduct(); //包括所有基准星的差分产品 if (!fracProducts.ContainsKey(basePrn)) { log.Debug("产品不包含基准卫星!" + basePrn); return(null); } var fractions = fracProducts[basePrn]; //当前基准星,星间单差的小数部分, MultiSitePeriodValueStorage floatRawDiffer = GetRawDiffer(basePrn); //星间差分宽巷浮点数 MultiSitePeriodValueStorage result = floatRawDiffer.GetRoundInt(fractions, maxDifferForAmbi, maxRms); //星间差分宽巷整数 log.Info("星间单差模糊度生成完毕,基准星:" + basePrn); return(result); }
/// <summary> /// 所有站星间单差窄巷浮点数模糊度 /// </summary> /// <param name="intValueOfDifferWL"></param> /// <param name="funcToSolvNlAmbi"></param> /// <returns></returns> public MultiSiteEpochValueStorage GetNarrowLaneFcbs(MultiSitePeriodValueStorage intValueOfDifferWL, Func <RmsedNumeral, RmsedNumeral, RmsedNumeral> funcToSolvNlAmbi) { log.Info("开始生成 所有站星间单差窄巷浮点数模糊度");//,基准星:" + basePrn); MultiSiteEpochValueStorage narrrowFcbs = new MultiSiteEpochValueStorage("所有站星间单差窄巷浮点数模糊度"); foreach (var siteKv in this.Data) { string siteName = siteKv.Key; var periodVals = siteKv.Value; var wideIntVals = intValueOfDifferWL.Get(siteKv.Key); if (wideIntVals == null || wideIntVals.Count == 0) { continue; } var newSite = periodVals.GetNarrowLaneFcbs(wideIntVals, funcToSolvNlAmbi); narrrowFcbs.Add(siteName, newSite); } log.Info("所有站星间单差窄巷浮点数模糊度生成完毕");//,基准星:" + basePrn); return(narrrowFcbs); }
/// <summary> /// 解析为对象 /// </summary> /// <param name="path"></param> /// <returns></returns> public static MultiSitePeriodValueStorage ParseDetailTable(string path) { var data = new ObjectTableReader(path).Read(); return(MultiSitePeriodValueStorage.ParseDetailTable(data)); }