/// <summary> /// 获取时段MW平均值 /// </summary> /// <param name="time"></param> /// <param name="basePrn"></param> /// <returns></returns> public NameRmsedNumeralVector <SatelliteNumber> GetDifferMwCycle(Time time, SatelliteNumber basePrn) { var result = new NameRmsedNumeralVector <SatelliteNumber>(); var data = GetAverageMwCycle(time); return(data.Minus(basePrn)); }
/// <summary> /// 获取星间单差MW整数 /// </summary> /// <param name="isNetSolve"></param> /// <returns></returns> public NameRmsedNumeralVector GetIntMwDiffersBeweenSat(bool isNetSolve) { var mwDifferVal = this.DataSourceContext.SiteSatPeriodDataService.GetMwCycleDifferValueBeweenSat(CurrentMaterial, CurrentBasePrn); var time = this.CurrentMaterial.ReceiverTime; var wmFcb = WideLaneBiasService.Get(time).GetMwDiffer(CurrentBasePrn);//用于模糊度固定,精度要求不高,一次任务获取一次即可 var wmFcbVector = new NameRmsedNumeralVector <SatelliteNumber>(wmFcb); var mwDoubleDiffers = mwDifferVal - wmFcbVector; var toRemoves = new List <SatelliteNumber>(); //移除RMS太大的数据,RMS太大可能发生了周跳。 toRemoves = mwDoubleDiffers.GetRmsLargerThan(this.Option.MaxAllowedRmsOfMw); mwDoubleDiffers.Remove(toRemoves);//移除 //直接四舍五入,求MW双差模糊度 var intMwDoubleDiffers = mwDoubleDiffers.GetRound(); ////求残差,由于前面采用四舍五入的方法求取,因此,大于0.5的判断是没有意义的 if (Option.MaxRoundAmbiDifferOfIntAndFloat < 0.5) //移除残差大于指定的数据 { var residuals = mwDoubleDiffers - intMwDoubleDiffers; toRemoves = residuals.GetAbsLargerThan(Option.MaxRoundAmbiDifferOfIntAndFloat); intMwDoubleDiffers.Remove(toRemoves);//移除 } return(ToStringVector(intMwDoubleDiffers)); }
private void button_run_Click(object sender, EventArgs e) { var floatPath = fileOpenControl_ionoFreeFloat.FilePath; var mwPath = this.fileOpenControl_mwWide.FilePath; var mwTable = ObjectTableReader.Read(mwPath); var floatTable = ObjectTableReader.Read(floatPath); //Group 文件包括, Index Site Name Group Value Rms //参数文件包括,ParamName,Value, Rms //首先求取宽项模糊度 GroupedValueService wmValues = new GroupedValueService(mwTable); ParamValueService paramValueService = new ParamValueService(floatTable); NameRmsedNumeralVector wideLaneVector = GetIntMwDoubleDiffers(paramValueService, wmValues); WeightedVector rawFloatAmbiCycles = paramValueService.GetWeightedVector(); WeightedVector fixedParams = DoFixIonoFreeDoubleDifferAmbiguity(rawFloatAmbiCycles, wideLaneVector); //输出结果 ObjectTableStorage fixedParam = BuildFixedParamTable(fixedParams); objectTableControl1.DataBind(fixedParam); var path = Path.Combine(directorySelectionControl1.Path, "FixedParams" + Setting.AmbiguityFileExtension); ObjectTableWriter.Write(fixedParam, path); Geo.Utils.FormUtil.ShowOkAndOpenDirectory(path); }
/// <summary> /// 计算无电离层组合模糊度,返回单位按照 指定的相位单位 /// </summary> /// <param name="wideIntCyle">以周为单位的宽巷整数</param> /// <param name="narrowIntCyle">以周为单位的窄巷整数</param> /// <returns>返回以距离或周为单位的模糊度(波长默认L1)</returns> public NameRmsedNumeralVector GetIonoFreeAmbiValue(NameRmsedNumeralVector wideIntCyle, NameRmsedNumeralVector narrowIntCyle) { var IonoFreeAmbiValueLen = (tempCoeef * WaveLenOfWideLane * wideIntCyle) + (narrowIntCyle * WaveLenOfNarrowLane);//算法1 if (IsCycleOrMeterOfAmbiUnit) { return(IonoFreeAmbiValueLen / WaveLengthOfL1); } return(IonoFreeAmbiValueLen); }
/// <summary> /// 计算窄巷模糊度,单位周 /// </summary> /// <param name="wideIntCyle">以周为单位的宽巷整数</param> /// <param name="floatIfAmbiValue">以距离为单位模糊度浮点解</param> /// <returns></returns> public NameRmsedNumeralVector GetNarrowFloatValue(NameRmsedNumeralVector wideIntCyle, NameRmsedNumeralVector floatIfAmbiValue) { NameRmsedNumeralVector floatIfAmbLen = floatIfAmbiValue; if (IsCycleOrMeterOfAmbiUnit) { floatIfAmbLen = floatIfAmbiValue * WaveLengthOfL1; //转换为距离,以L1为参考 } var narrowFloat = (floatIfAmbLen - tempCoeef * WaveLenOfWideLane * wideIntCyle) / WaveLenOfNarrowLane;//算法1 return(narrowFloat); }
/// <summary> /// 解析名称 /// </summary> /// <param name="satVector"></param> /// <returns></returns> public NameRmsedNumeralVector ToStringVector(NameRmsedNumeralVector <SatelliteNumber> satVector) { IonoFreePppParamNameBuilder nameBuilder = new IonoFreePppParamNameBuilder(this.Option); NameRmsedNumeralVector result = new NameRmsedNumeralVector(); foreach (var item in satVector) { var name = nameBuilder.GetParamName(item.Key); result[name] = item.Value; } return(result); }
/// <summary> /// 执行无电离层双差模糊度固定 /// </summary> /// <param name="rawFloatAmbiCycles"></param> /// <param name="isNetSolve">是否网解</param> /// <returns></returns> protected WeightedVector DoFixIonoFreeDoubleDifferAmbiguity(WeightedVector rawFloatAmbiCycles, bool isNetSolve) { if (!IsDualIonoFreeComObservation) { return(base.DoFixAmbiguity(rawFloatAmbiCycles)); } //-----------以下为无电离层组合模糊度固定算法-------------------- if (this.DataSourceContext.SiteSatPeriodDataService == null) { log.Warn("必须开启时段数据服务,才能实现无电离层模糊度固定!"); return(new WeightedVector()); } //指定系统的无电离层组合参数计算器 var IonoFreeAmbiguitySolver = IonoFreeAmbiguitySolverManager.GetOrCreate(CurrentBasePrn.SatelliteType); IonoFreeAmbiguitySolver.CheckOrInit(CurrentBasePrn, CurrentMaterial.ReceiverTime, !Option.IsLengthPhaseValue); //----------------------第一步 MW 宽巷双差 ------------------------ NameRmsedNumeralVector intMwDoubleDiffers = GetIntMwDoubleDiffers(isNetSolve); //----------------------第二步 MW 宽巷和模糊度浮点解求窄巷模糊度-------- var ambiFloatVal = rawFloatAmbiCycles.GetNameRmsedNumeralVector(); //求窄巷模糊度浮点解//单位周 var narrowFloat = IonoFreeAmbiguitySolver.GetNarrowFloatValue(intMwDoubleDiffers, ambiFloatVal); var narrowFloatVect = narrowFloat.GetWeightedVector(); narrowFloatVect.InverseWeight = rawFloatAmbiCycles.GetWeightedVector(narrowFloatVect.ParamNames).InverseWeight; //追加系数阵,按照顺序------ //方法1: var intNarrowVector = base.DoFixAmbiguity(narrowFloatVect); var intNarrow = intNarrowVector.GetNameRmsedNumeralVector();// ParseVector(intNarrowVector); //方法2:直接取整 //var intNarrow = narrowFloatVect.GetRound();//不推荐使用直接取整 //检核窄巷 var intDiffer = intNarrow - narrowFloat; var toRemoves = intDiffer.GetAbsLargerThan(this.Option.MaxAmbiDifferOfIntAndFloat); intNarrow.Remove(toRemoves);//移除 //判断是否超限 //计算双差载波模糊度固定值 var fixedVal = IonoFreeAmbiguitySolver.GetIonoFreeAmbiValue(intMwDoubleDiffers, intNarrow); var result = fixedVal.GetWeightedVector(); return(result); }
/// <summary> /// 获取时段MW平均值 /// </summary> /// <param name="time"></param> /// <returns></returns> public NameRmsedNumeralVector <SatelliteNumber> GetAverageMwCycle(Time time) { var result = new NameRmsedNumeralVector <SatelliteNumber>(); foreach (var item in this.KeyValues) { var prn = item.Key; var val = GetAverageMwCycle(prn, time); if (val == null) { continue; } result[prn] = val; } return(result); }
/// <summary> /// 获取MW双差值,名称与双差值匹配。 /// </summary> /// <param name="sites"></param> /// <param name="basePrn"></param> /// <param name="isNetSolver">是否为网解</param> /// <returns></returns> public NameRmsedNumeralVector GetMwCycleDoubleDifferValue(MultiSiteEpochInfo sites, SatelliteNumber basePrn, bool isNetSolver = true) { //计算所有测站星间单差 var satDiffersOfSites = new Dictionary <string, NameRmsedNumeralVector <SatelliteNumber> >(); var time = sites.ReceiverTime; foreach (var rovSiteObj in sites) { var rovSite = this.Get(rovSiteObj.SiteName); satDiffersOfSites[rovSiteObj.SiteName] = rovSite.GetDifferMwCycle(time, basePrn); } //计算站间单差,即双差 NameRmsedNumeralVector result = new NameRmsedNumeralVector(); var refSite = satDiffersOfSites[sites.BaseSiteName]; foreach (var kv in satDiffersOfSites) { if (kv.Key == sites.BaseSiteName) { continue; } var differ = kv.Value - refSite; foreach (var diffItem in differ) { NetDoubleDifferName differName = new NetDoubleDifferName() { RefPrn = basePrn, RovPrn = diffItem.Key }; if (isNetSolver)//网解带坐标 { differName.RefName = sites.BaseSiteName; differName.RovName = kv.Key; } var name = differName.ToString(Gnsser.ParamNames.DoubleDifferAmbiguitySuffix); result[name] = diffItem.Value; } } return(result); }
/// <summary> /// 获取双差MW整数 /// </summary> /// <param name="isNetSolve"></param> /// <returns></returns> public NameRmsedNumeralVector GetIntMwDoubleDiffers(bool isNetSolve) { List <string> toRemoves = new List <string>(); NameRmsedNumeralVector mwDoubleDiffers = this.DataSourceContext.SiteSatPeriodDataService.GetMwCycleDoubleDifferValue(CurrentMaterial, CurrentBasePrn, isNetSolve); //移除RMS太大的数据,RMS太大可能发生了周跳。 toRemoves = mwDoubleDiffers.GetRmsLargerThan(this.Option.MaxAllowedRmsOfMw); mwDoubleDiffers.Remove(toRemoves);//移除 //直接四舍五入,求MW双差模糊度 var intMwDoubleDiffers = mwDoubleDiffers.GetRound(); ////求残差,由于前面采用四舍五入的方法求取,因此,大于0.5的判断是没有意义的 if (Option.MaxRoundAmbiDifferOfIntAndFloat < 0.5) //移除残差大于指定的数据 { var residuals = mwDoubleDiffers - intMwDoubleDiffers; toRemoves = residuals.GetAbsLargerThan(Option.MaxRoundAmbiDifferOfIntAndFloat); intMwDoubleDiffers.Remove(toRemoves);//移除 } return(intMwDoubleDiffers); }
private NameRmsedNumeralVector GetIntMwDoubleDiffers(ParamValueService paramValueService, GroupedValueService wmValues) { NameRmsedNumeralVector wideLaneVector = new NameRmsedNumeralVector(); // RmsedVector wideLaneVector = new RmsedVector(); var paramNames = paramValueService.ParamNames; foreach (var item in paramNames) { if (!NetDoubleDifferName.IsDifferParam(item)) { continue; } var paramName = NetDoubleDifferName.Parse(item); CurrentBasePrn = paramName.RefPrn; if (!paramName.IsValid) { continue; } var floatWideAmbi = wmValues.GetFirstDoubleDiffer(paramName); if (floatWideAmbi == null) { continue; } var wideAmbi = new RmsedNumeral(Math.Round(floatWideAmbi.Value), 1e-10); var differ = (floatWideAmbi.Value - wideAmbi.Value); if (Math.Abs(differ) > 0.3) { log.Info(item + " 宽项(MW)整数偏差为 " + differ + "取消固定。"); continue; } wideLaneVector[item] = wideAmbi; } return(wideLaneVector); }
/// <summary> /// 执行无电离层双差模糊度固定 /// </summary> /// <param name="rawFloatAmbiCycles"></param> /// <param name="isNetSolve">是否网解</param> /// <returns></returns> protected WeightedVector DoFixIonoFreeDoubleDifferAmbiguity(WeightedVector rawFloatAmbiCycles, NameRmsedNumeralVector intMwDoubleDiffers) { IonoFreeAmbiguitySolverManager = new IonoFreeAmbiguitySolverManager(); //指定系统的无电离层组合参数计算器 var IonoFreeAmbiguitySolver = IonoFreeAmbiguitySolverManager.GetOrCreate(CurrentBasePrn.SatelliteType); IonoFreeAmbiguitySolver.CheckOrInit(CurrentBasePrn, new Time(), true); //----------------------第一步 MW 宽巷双差 ------------------------ //----------------------第二步 MW 宽巷和模糊度浮点解求窄巷模糊度-------- var ambiFloatVal = rawFloatAmbiCycles.GetNameRmsedNumeralVector(); //求窄巷模糊度浮点解//单位周 var narrowFloat = IonoFreeAmbiguitySolver.GetNarrowFloatValue(intMwDoubleDiffers, ambiFloatVal); var narrowFloatVect = narrowFloat.GetWeightedVector(); narrowFloatVect.InverseWeight = rawFloatAmbiCycles.GetWeightedVector(narrowFloatVect.ParamNames).InverseWeight; //追加系数阵,按照顺序------ //方法1: var intNarrowVector = DoFixAmbiguity(narrowFloatVect); var intNarrow = intNarrowVector.GetNameRmsedNumeralVector();// ParseVector(intNarrowVector); //方法2:直接取整 //var intNarrow = narrowFloatVect.GetNameRmsedNumeralVector().GetRound();//不推荐使用直接取整 //检核窄巷 var intDiffer = intNarrow - narrowFloat; var toRemoves = intDiffer.GetAbsLargerThan(this.MaxAmbiDifferOfIntAndFloat); intNarrow.Remove(toRemoves);//移除 if (toRemoves.Count > 0) { log.Info("窄巷移除了 " + Geo.Utils.StringUtil.ToString(toRemoves)); } //判断是否超限 //计算双差载波模糊度固定值 var fixedVal = IonoFreeAmbiguitySolver.GetIonoFreeAmbiValue(intMwDoubleDiffers, intNarrow); var result = fixedVal.GetWeightedVector(); return(result); }