/// <summary>
        /// 运行
        /// </summary>
        /// <returns></returns>
        public override void Run()
        {
            //各个测站做星间单差 //获取星间单差值
            MultiSiteEpochValueStorage rawDiffer = FloatAmbiSolution.GetRawDiffer(BasePrn);

            //与宽巷模糊度整数产品一起,计算窄巷模糊度的浮点解
            MultiSiteEpochValueStorage floatNlVals = rawDiffer.GetNarrowLaneFcbs(IntValueOfDifferWL, GetNarrowLaneValue);

            //浮点数小数部分
            MultiSiteEpochValueStorage fractionOfNL = floatNlVals.GetRoundFraction();

            //合并相同卫星的浮点数小数部分
            EpochSatSiteValueList epochSatValues = fractionOfNL.GetSameSatValues();

            //求加权平均,每一个历元,每颗卫星只有一个产品,忽略数量太少的历元
            this.FcbProducts = epochSatValues.GetAverage(this.MinSiteCount, MaxRmsTimes);

            //生成窄巷FCB 产品,并写入文件
            this.FcbOfUpds = FcbProducts.GetFcbProduct(BasePrn);

            //写入文件
            FcbOfUpdWriter.WriteEpochProducts(FcbOfUpds, BasePrn + "_EpochNLFcbOfDcb");


            //显示逐历元结果,表名为卫星,各表列为测站名称
            this.FloatValueTables = epochSatValues.GetTable(this.OutputDirectory, BasePrn);

            //生成逐历元表格文件
            base.BuildProducts();
        }
Exemple #2
0
        private void button_saveWLToGNSSer_Click(object sender, EventArgs e)
        {
            var             service    = GetFcbDataService();
            var             timeperiod = this.timePeriodControl1.TimePeriod;
            SatelliteNumber basePrn    = (SatelliteNumber)this.bindingSource_basePrn.Current;

            var toPath = Path.Combine(Setting.TempDirectory, "WhuWLFcbToGNSSer" + Gnsser.Setting.FcbExtension);

            using (FcbOfUpdWriter writer = new FcbOfUpdWriter(toPath))
            {
                var Interval = TimeSpan.FromDays(1);
                for (var time = timeperiod.Start.Date; time <= timeperiod.End; time += Interval)
                {
                    var bsdFrac = service.GetWLFcbOfBsd(time, basePrn);
                    if (bsdFrac != null && bsdFrac.Count > 0)
                    {
                        FcbOfUpd fcbOfUpd = new FcbOfUpd(basePrn, time, true);
                        foreach (var kv in bsdFrac.KeyValues)
                        {
                            fcbOfUpd.Add(kv.Key, kv.Value);
                        }
                        if (fcbOfUpd.DataCount > 0)
                        {
                            writer.Write(fcbOfUpd);
                        }
                    }
                }
            }
            Geo.Utils.FormUtil.ShowOkAndOpenDirectory(Setting.TempDirectory);
        }
Exemple #3
0
        private void button_saveToGnsserFcb_Click(object sender, EventArgs e)
        {
            var             service    = GetFcbDataService();
            var             timeperiod = this.timePeriodControl1.TimePeriod;
            SatelliteNumber basePrn    = (SatelliteNumber)this.bindingSource_basePrn.Current;
            var             Interval   = TimeSpan.FromMinutes(15);


            var toPath = Path.Combine(Setting.TempDirectory, "WhuNLFcbToGNSSer" + Gnsser.Setting.FcbExtension);

            using (FcbOfUpdWriter writer = new FcbOfUpdWriter(toPath))
            {
                for (var time = timeperiod.Start; time <= timeperiod.End; time += Interval)
                {
                    FcbOfUpd fcbOfUpd = new FcbOfUpd(basePrn, time, false);
                    foreach (var prn in SatelliteNumber.DefaultGpsPrns)
                    {
                        var bsdFrac = service.GetNLFcbOfBsdValue(time, prn, basePrn);
                        if (bsdFrac != null)
                        {
                            fcbOfUpd.Add(prn, bsdFrac);
                        }
                    }

                    if (fcbOfUpd.DataCount > 0)
                    {
                        writer.Write(fcbOfUpd);
                    }
                }
            }
            Geo.Utils.FormUtil.ShowOkAndOpenDirectory(Setting.TempDirectory);
        }
Exemple #4
0
        private void button_convertToGnsserFcb_Click(object sender, EventArgs e)
        {
            var basePrn = baseSatSelectingControl1.SelectedPrn;

            if (basePrn.SatelliteType != SatelliteType.G)
            {
                MessageBox.Show("请选择GPS系统!目前似乎还不支持其它系统,如果支持了请尝试高版本先,若还没有请 Email To: [email protected]");
                return;
            }
            var            toPath = Path.Combine(Setting.TempDirectory, "FcbOfDcb" + Gnsser.Setting.FcbExtension);
            FcbOfUpdWriter writer = new FcbOfUpdWriter(toPath);
            var            period = this.timePeriodControl1.TimePeriod;

            var path = this.fileOpenControlOpath.FilePath;

            WideLaneBiasService = new WideLaneBiasService(path);

            for (var time = period.Start.Date; time <= period.End; time += TimeSpan.FromDays(1))
            {
                var data = WideLaneBiasService.Get(time);
                if (data == null)
                {
                    continue;
                }
                FcbOfUpd fcb = new FcbOfUpd(basePrn, data);
                writer.Write(fcb);
            }
            writer.Dispose();

            Geo.Utils.FormUtil.ShowOkAndOpenDirectory(Setting.TempDirectory);
        }
        private FcbOfUpdWriter WriteFinal(FcbOfUpd bsdProduct)
        {
            //写最终FCB 产品
            var            fcbPath = Path.Combine(this.OutputDirectory, "FcbProduct" + Setting.FcbExtension);
            FcbOfUpdWriter writer  = new FcbOfUpdWriter(fcbPath);

            writer.Write(bsdProduct);
            writer.Dispose();
            return(writer);
        }
        private static void WriteEpochProducts(List <FcbOfUpd> list, string name = "EpochFcbOfDcb")
        {
            var            toPath = Path.Combine(Setting.TempDirectory, name + Gnsser.Setting.FcbExtension);
            FcbOfUpdWriter writer = new FcbOfUpdWriter(toPath);

            foreach (var fcb in list)
            {
                if (fcb == null)
                {
                    continue;
                }
                writer.Write(fcb);
            }
            writer.Dispose();
        }
Exemple #7
0
        /// <summary>
        /// 运行。
        /// </summary>
        public void Run()
        {
            var TotalObsCount = 0;

            if (BsdWidelaneInts != null)//对象差分整数
            {
                log.Info("采用新方法");
                if (MultiSitePppEpochValue != null)
                {
                    Dictionary <SatelliteNumber, MultiSatEpochRmsNumeralStorage> products = new Dictionary <SatelliteNumber, MultiSatEpochRmsNumeralStorage>();
                    foreach (var basePrn in BsdWidelaneInts.Keys)
                    {
                        log.Info("正在计算基准星为 " + basePrn + " 的窄巷模糊度");
                        var intWideLaneObj = BsdWidelaneInts[basePrn];

                        var solver = new EpochBsdOfNarrowLaneSolver(basePrn, MultiSitePppEpochValue, intWideLaneObj, this.OutputDirectory);
                        solver.MaxAllowedDiffer = MaxAllowedDiffer;
                        solver.MinSiteCount     = MinSiteCount;
                        solver.MaxRmsTimes      = MaxRmsTimes;
                        solver.Run();

                        if (IsOutputFraction && solver.FractionValueTables != null)
                        {
                            solver.FractionValueTables.WriteAllToFileAndClearBuffer();
                        }
                        if (IsOutputSummary && solver.SummeryTables != null)
                        {
                            solver.SummeryTables.WriteAllToFileAndClearBuffer();
                        }
                        //if (IsOutputInt && solver.IntValueTables != null) { solver.IntValueTables.WriteAllToFileAndClearBuffer(); }
                        //需要计算所有历元的数值!!!!宽巷也可以,用于查看结果。

                        if (!IsLoopAllSats)
                        {
                            break;
                        }
                        products[basePrn] = solver.FcbProducts;
                    }

                    if (IsLoopAllSats)//汇集产品到一起
                    {
                        //归算到基准星
                        var samePrnProducts = new MultiSiteEpochValueStorage("归算到同一颗卫星");
                        var basePrn         = BsdWidelaneInts.Keys.First();
                        foreach (var kv in products)
                        {
                            var name = kv.Key.ToString();
                            if (kv.Key == basePrn)
                            {
                                samePrnProducts[kv.Key.ToString()] = kv.Value;
                            }
                            else
                            {
                                samePrnProducts[name] = kv.Value.GetRawDiffer(basePrn);
                            }
                        }

                        //汇集各卫星产品到一起
                        var together = samePrnProducts.GetSameSatValues();
                        //计算不准确,算法有待改进!!

                        //求加权平均,每一个历元,每颗卫星只有一个产品,忽略数量太少的历元
                        var FcbProducts = together.GetAverage(1, 3);

                        //生成窄巷FCB 产品,并写入文件
                        var FcbOfUpds = FcbProducts.GetFcbProduct(basePrn);

                        //写入文件  //写入文件
                        FcbOfUpdWriter.WriteEpochProducts(FcbOfUpds, basePrn + "_FinalEpochNLFcbOfDcb");
                    }
                }
                else // 次新方法
                {
                    foreach (var basePrn in BsdWidelaneInts.Keys)
                    {
                        var intWideLaneObj = BsdWidelaneInts[basePrn];
                        var solver         = new BsdOfNarrowLaneSolver(basePrn, FloatAmbiguitiesOfPpp, intWideLaneObj, this.OutputDirectory);
                        solver.MaxAllowedDiffer = MaxAllowedDiffer;
                        solver.Run();

                        if (IsOutputFraction)
                        {
                            solver.FractionValueTables.WriteAllToFileAndClearBuffer();
                        }
                        if (IsOutputSummary)
                        {
                            solver.SummeryTables.WriteAllToFileAndClearBuffer();
                        }
                        if (IsOutputInt)
                        {
                            solver.IntValueTables.WriteAllToFileAndClearBuffer();
                        }
                        //需要计算所有历元的数值!!!!宽巷也可以,用于查看结果。
                    }
                }
            }
            else
            {
                log.Info("采用老表格方法");

                foreach (var kv in IntOfWLPathes)
                {
                    ObjectTableManager intWideLane = ObjectTableManager.Read(kv.Value.ToArray());// ReadWideLaneTable(PppResultTableManager);
                    var    basePrn         = kv.Key;
                    string outputDirectory = this.OutputDirectory;
                    if (IsOutputInEachDirectory)
                    {
                        var start = intWideLane.GetFirstIndexValue <Time>();
                        var end   = intWideLane.GetLastIndexValue <Time>();
                        var span  = new TimePeriod(start, end);

                        outputDirectory                       = System.IO.Path.Combine(this.OutputDirectory, span.ToPathString(false, true, false) + "_" + basePrn);
                        intWideLane.OutputDirectory           = outputDirectory;
                        FloatAmbiguitiesOfPpp.OutputDirectory = outputDirectory;
                    }
                    BsdProductSolver solver;


                    //PPP模糊度浮点解
                    solver = new NarrowLaneOfBsdSolver(basePrn, FloatAmbiguitiesOfPpp, intWideLane, outputDirectory);
                    solver.MaxAllowedDiffer = MaxAllowedDiffer;
                    solver.Run();
                    if (IsOutputFraction)
                    {
                        solver.FractionValueTables.WriteAllToFileAndClearBuffer();
                    }
                    if (IsOutputSummary)
                    {
                        solver.SummeryTables.WriteAllToFileAndClearBuffer();
                    }
                    if (IsOutputInt)
                    {
                        solver.IntValueTables.WriteAllToFileAndClearBuffer();
                    }

                    TotalObsCount += solver.TotalObsCount;
                }

                log.Info(" 总共处理的观测数值数 " + TotalObsCount);
            }
        }
        private void button_combine_Click(object sender, EventArgs e)
        {
            var fcbPathes = fileOpenControl_fcbPathes.FilePathes;
            var basePrn   = this.baseSatSelectingControl1.SelectedPrn;

            log.Info("即将转换FCB文件基准到 " + basePrn);
            //文件读取
            Dictionary <string, FcbOfUpdFile> data = new Dictionary <string, FcbOfUpdFile>();
            FcbOfUpdFile baseFile = null;

            foreach (var path in fcbPathes)
            {
                var file = new FcbOfUpdReader(path).ReadToFile();
                if (file.Count == 0)
                {
                    continue;
                }

                var target = file.ToFile(basePrn);//基准转换到统一的卫星
                if (target == null || target.Count == 0)
                {
                    continue;
                }

                var fileName = Path.GetFileName(path);
                data[fileName] = target;
                if (baseFile == null)
                {
                    baseFile = target;
                }
            }
            log.Info("文件读取完毕,数量: " + fcbPathes.Length);

            //汇集
            log.Info("即将汇集各文件到一个对象,然后方便进行平均,这个过程比较耗时。。。 ");
            EpochSatSiteValueList valList = new EpochSatSiteValueList("多基准FCB合成");

            foreach (var epochProduct in baseFile)
            {
                var epoch = epochProduct.Epoch;
                valList.GetOrCreate(epoch).GetOrCreate(basePrn).Add("BasePrn", RmsedNumeral.Zero); //基准卫星和数据不用计算。

                foreach (var kv in data)
                {
                    var epochVal = kv.Value.Get(epoch);
                    if (epochVal == null)
                    {
                        continue;
                    }

                    foreach (var item in epochVal.Data.KeyValues)
                    {
                        if (item.Key == basePrn)
                        {
                            continue;
                        }

                        if (RmsedNumeral.IsValid(item.Value))
                        {
                            valList.GetOrCreate(epoch).GetOrCreate(item.Key).Add(kv.Key, item.Value);
                        }
                    }
                }
            }
            log.Info("各文件汇集转换完成,即将求平均 ");

            //求平均
            var ave = valList.GetAverage(0, 3);

            //生成窄巷FCB 产品,并写入文件
            var FcbOfUpds = ave.GetFcbProduct(basePrn);

            //写入文件  //写入文件
            var outpath = FcbOfUpdWriter.WriteEpochProducts(FcbOfUpds, basePrn + "_CombiedEpochNLFcbOfDcb");

            log.Info("执行完毕! ");

            Geo.Utils.FormUtil.ShowOkAndOpenDirectory(Path.GetDirectoryName(outpath));
        }