Beispiel #1
0
        /// <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);
            }
        }
Beispiel #2
0
 private FcbDataService GetFcbDataService()
 {
     if (FcbDataService == null)
     {
         var dcbDir = directorySelectionControl1.Path;
         FcbDataService = new FcbDataService(dcbDir);
     }
     return(FcbDataService);
 }
Beispiel #3
0
        /// <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);
        }