Пример #1
0
        /// <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));
        }
Пример #2
0
        /// <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));
        }
Пример #3
0
        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);
        }
Пример #6
0
        /// <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);
        }
Пример #7
0
        /// <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);
        }
Пример #8
0
        /// <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);
        }
Пример #9
0
        /// <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);
        }
Пример #10
0
        /// <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);
        }
Пример #11
0
        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);
        }
Пример #12
0
        /// <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);
        }