/// <summary> /// 最简化的构造函数,可以多个定位器同时使用的参数,而不必多次读取 /// </summary> /// <param name="DataSourceContext"></param> /// <param name="PositionOption"></param> public IonoFreePpp(DataSourceContext DataSourceContext, GnssProcessOption PositionOption) : base(DataSourceContext, PositionOption) { this.Name = "无电离层组合PPP"; this.BaseParamCount = 5; if (PositionOption.ApproxDataType == SatApproxDataType.ApproxPseudoRangeOfTriFreq || PositionOption.ApproxDataType == SatApproxDataType.ApproxPhaseRangeOfTriFreq) { this.MatrixBuilder = new IonoFreePppOfTriFreqMatrixBuilder(PositionOption); } else { this.MatrixBuilder = new IonoFreePppMatrixBuilder(PositionOption); } if (!Option.TopSpeedModel) { if (this.IsFixingAmbiguity) { this.WideLaneBiasService = new WideLaneBiasService(Setting.GnsserConfig.IgnWideLaneFile); this.IsBaseSatelliteRequried = true; } if (true) { if (!this.Option.IsUseFixedParamDirectly && (this.IsFixingAmbiguity && this.DataSourceContext.GnsserFcbOfUpdService == null)) { throw new Exception("PPP模糊度固定,请设置FCB文件路径!"); } } else { FcbDataService = new FcbDataService("E:\\"); } NarrawLaneFcbService = this.DataSourceContext.GnsserFcbOfUpdService;// new FcbOfUpdService( Option.GnsserFcbFilePath); } }
private FcbDataService GetFcbDataService() { if (FcbDataService == null) { var dcbDir = directorySelectionControl1.Path; FcbDataService = new FcbDataService(dcbDir); } return(FcbDataService); }
/// <summary> /// 执行无电离层双差模糊度固定 /// </summary> /// <param name="rawFloatAmbiCycles"></param> /// <param name="isNetSolve">是否网解</param> /// <returns></returns> protected WeightedVector DoFixIonoFreeAmbiguity(WeightedVector rawFloatAmbiCycles, bool isNetSolve) { //-----------以下为无电离层组合模糊度固定算法-------------------- if (this.DataSourceContext.SiteSatPeriodDataService == null) { log.Warn("必须开启时段数据服务,才能实现无电离层模糊度固定!"); return(new WeightedVector()); } var time = this.CurrentMaterial.ReceiverTime; //指定系统的无电离层组合参数计算器 var IonoFreeAmbiguitySolver = IonoFreeAmbiguitySolverManager.GetOrCreate(CurrentBasePrn.SatelliteType); IonoFreeAmbiguitySolver.CheckOrInit(CurrentBasePrn, CurrentMaterial.ReceiverTime, !Option.IsLengthPhaseValue); //----------------------第一步 MW 宽巷双差 ------------------------ var intMwDoubleDiffers = GetIntMwDiffersBeweenSat(isNetSolve); //----------------------第二步 MW 宽巷和模糊度浮点解求窄巷模糊度-------- var ambiFloatVal = rawFloatAmbiCycles.GetNameRmsedNumeralVector(); //求窄巷模糊度浮点解//单位周 var narrowFloat = IonoFreeAmbiguitySolver.GetNarrowFloatValue(intMwDoubleDiffers, ambiFloatVal); //--------获取小数偏差部分------- Dictionary <SatelliteNumber, RmsedNumeral> nlFcbOfBsd = null; if (NarrawLaneFcbService == null) { nlFcbOfBsd = FcbDataService.GetNLFcbOfBsd(time, CurrentBasePrn); } else { nlFcbOfBsd = NarrawLaneFcbService.GetBsdOfNarrowLane(this.CurrentMaterial.EnabledPrns, CurrentBasePrn, time); } var narrowIntFloat = ToStringVector(new NameRmsedNumeralVector <SatelliteNumber>(nlFcbOfBsd)); var narrowNearInt = narrowFloat - narrowIntFloat; var narrowFloatVect = narrowNearInt.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); }