Пример #1
0
        private void button_inter_Click(object sender, EventArgs e)
        {
            double             interval      = double.Parse(this.textBox_interval.Text);
            List <AtomicClock> sortedRecords = this.bindingSource_clk.DataSource as List <AtomicClock>;

            if (sortedRecords == null)
            {
                MessageBox.Show("请先读取,并删选数据。"); return;;
            }

            //    Data.ClockDataSource datasource = new Data.ClockDataSource(_clockFile);

            ClockInterpolator interp = new ClockInterpolator(sortedRecords, 2);

            this.Clocks = interp.GetAtomicClocks(Time.Parse(from), Time.Parse(to), interval);

            this.bindingSource_clk.DataSource = this.Clocks;
            string          name = this.comboBox_name.SelectedItem.ToString();
            SatelliteNumber prn  = SatelliteNumber.Parse(name);

            this.Ephemerides = sp3File.Gets(SatelliteNumber.Parse(name), Time.Parse(from), Time.Parse(to), interval);
            this.bindingSource_sp3.DataSource = Ephemerides;

            ShowComparing();
        }
        /// <summary>
        /// 精密单点定位结果构造函数。
        /// </summary>
        /// <param name="receiverInfo">接收信息</param>
        /// <param name="Adjustment">平差</param>
        /// <param name="nameBuilder">参数名称生成器</param>
        public IonoModeledSingleFreqPppResult(
            EpochInformation receiverInfo,
            AdjustResultMatrix Adjustment, GnssParamNameBuilder nameBuilder
            )
            : base(receiverInfo, Adjustment, nameBuilder)
        {
            this.WetTropoFactor = this.ResultMatrix.Corrected.CorrectedValue[Adjustment.GetIndexOf(Gnsser.ParamNames.WetTropZpd)];
            //处理模糊度
            this.AmbiguityDic = new Dictionary <SatelliteNumber, double>();

            int length = receiverInfo.EnabledSatCount * 2 + 5;

            Vector vector = Adjustment.Corrected.CorrectedValue;

            for (int i = 5 + receiverInfo.EnabledSatCount; i < 5 + receiverInfo.EnabledSatCount; i++)
            {
                SatelliteNumber prn = receiverInfo[i - 5 - receiverInfo.EnabledSatCount].Prn;
                //double val = vector[i];
                //double[] AmbiguityItem = new double[1];

                //AmbiguityItem[0] = val;
                ////AmbiguityItem[1] = vector[i + receiverInfo.EnabledSatCount];

                //AmbiguityDic.Add(prn, val);
            }
        }
        private void GetPredictedClockBias(string PredictedClockBiasPath)
        {
            bool isEnd = false;

            using (StreamReader sr = new StreamReader(PredictedClockBiasPath))
            {
                string   line = sr.ReadLine();
                string[] sat  = SinexCoord.SplitByBlank(line);
                while (!isEnd)
                {
                    line = sr.ReadLine();
                    if (line == null || line == "")
                    {
                        break;
                    }
                    if (line.Length == 0)
                    {
                        isEnd = false;
                    }
                    string[]  tmp  = SinexCoord.SplitByBlank(line);
                    Time      time = Time.Parse(tmp[0]);
                    clockbias cc   = new clockbias();
                    for (int i = 0; i < sat.Length; i++)
                    {
                        cc.sat.Add(SatelliteNumber.Parse(sat[i + 1]), double.Parse(tmp[i + 1]));
                    }
                    ClockBias.Add(time, cc);
                }
            }
        }
Пример #4
0
        /// <summary>
        /// 返回指定时间段,文件记录的星历信息。
        /// 需要计算,计算太多是否浪费资源?
        /// </summary>
        /// <param name="prn"></param>
        /// <param name="from"></param>
        /// <param name="to"></param>
        /// <returns></returns>
        public override List <Gnsser.Ephemeris> Gets(SatelliteNumber prn, Time from, Time to)
        {
            List <EphemerisParam> list = NavFile.GetEphemerisParams(prn, from, to);

            List <Gnsser.Ephemeris> infos = new List <Gnsser.Ephemeris>();

            foreach (var item in list)
            {
                //if (key.Prn.SatelliteType == SatelliteType.S || key.Prn.SatelliteType == SatelliteType.R || key.Prn.SatelliteType == SatelliteType.E)
                //    infos.Add(new Ephemeris()
                //    {
                //        Time = key.Time,
                //        XYZ = new XYZ(),
                //        Prn = key.Prn,
                //        ClockBias = key.ClockBias,
                //        ClockDrift = key.ClockDrift,
                //        //XyzDot = text.
                //    });
                //else
                //{
                XYZ xyz = SatOrbitCaculator.GetSatPos(item, item.Time);
                infos.Add(new Gnsser.Ephemeris()
                {
                    Time       = item.Time,
                    XYZ        = xyz,
                    Prn        = item.Prn,
                    ClockBias  = item.ClockBias,
                    ClockDrift = item.ClockDrift,
                    //XyzDot = text.
                });
                //}
            }
            return(infos);
        }
Пример #5
0
        /// <summary>
        /// 获取指定测站,指定卫星的多历元数据向量。
        /// 名称为时间。
        /// </summary>
        /// <param name="siteName"></param>
        /// <param name="prn"></param>
        /// <param name="dataType"></param>
        /// <param name="defaultValue"></param>
        /// <returns></returns>
        public Vector GetVector(string siteName, SatelliteNumber prn, SatObsDataType dataType, double defaultValue = Double.NaN)
        {
            Vector vector = new Vector(this.EpochCount);
            int    i      = 0;
            string name   = "";

            foreach (var epochSites in this)
            {
                double val = defaultValue;
                name = epochSites.ReceiverTime.ToShortTimeString();
                foreach (var epochSite in epochSites)
                {
                    if (epochSite.Name == siteName)
                    {
                        if (epochSite.Contains(prn))
                        {
                            val = epochSite[prn][dataType].Value;
                        }
                    }
                }
                vector[i]            = val;
                vector.ParamNames[i] = name;
            }
            return(vector);
        }
Пример #6
0
        public override void Correct(EpochSatellite epochSatellite)
        {
            Time gpsTime = epochSatellite.RecevingTime;

            IEphemeris      sat = epochSatellite.Ephemeris;
            SatelliteNumber prn = epochSatellite.Prn;

            //计算太阳位置方法
            //XYZ sunPosition = epochSatellite.EpochInfo.DataSouceProvider.UniverseObjectProvider.GetSunPosition(gpsTime);

            //新的计算太阳位置方法
            Time tutc = gpsTime.GpstToUtc();

            //查找地球自转信息
            Gnsser.Data.ErpItem erpv = null;
            if (DataSouceProvider.ErpDataService != null)
            {
                erpv = DataSouceProvider.ErpDataService.Get(tutc);
            }
            if (erpv == null)
            {
                erpv = ErpItem.Zero;
            }

            XYZ sunPosition = new XYZ();

            DataSouceProvider.UniverseObjectProvider.GetSunPosition(gpsTime, erpv, ref sunPosition);

            //use L1 value
            IAntenna antenna = DataSouceProvider.AntennaDataSource.Get(prn.ToString(), gpsTime);

            if (antenna == null)
            {
                return;
            }

            string AntennaType = antenna.AntennaType;

            XYZ svPos = sat.XYZ;

            XYZ receiverPosition = epochSatellite.SiteInfo.EstimatedXyz;

            if (receiverPosition.Equals(XYZ.Zero))
            {
                return;
            }

            bool cycleSlip = epochSatellite.IsUnstable;

            if (cycleSlip || !PhaseManager.Contains(prn)) //a cycle slip happend
            {
                PhaseManager[prn] = new SatVectorPhase();
            }

            double windUpCorrection = GetSatPhaseWindUpCorectValue(prn, gpsTime, svPos, receiverPosition, sunPosition, AntennaType);

            //double windUpCorrection2 = GetSatPhaseWindUpCorectValue(satelliteType, gpsTime, svPos, receiverPosition, epochSatellite, sunPosition);

            this.Correction = (windUpCorrection);
        }
Пример #7
0
        /// <summary>
        /// 插值器
        /// </summary>
        /// <param name="prnStr"></param>
        /// <returns></returns>
        private ClockInterpolator GetClockInterpolator(string prnStr)
        {
            if (clockInterpolators.ContainsKey(prnStr))
            {
                return(clockInterpolators[prnStr]);
            }
            lock (locker2)
            {
                if (clockInterpolators.ContainsKey(prnStr))
                {
                    return(clockInterpolators[prnStr]);
                }
                if (SatelliteNumber.IsPrn(prnStr))
                {
                    var prn   = SatelliteNumber.Parse(prnStr);
                    var items = ClockFile.Get(prn);
                    if (items == null || items.Count == 0)
                    {
                        return(null);
                    }

                    var inter = new ClockInterpolator(items.Values);
                    clockInterpolators.TryAdd(prnStr, inter);
                    return(inter);
                }
            }

            return(null);
        }
Пример #8
0
        private void button_multiShow_Click(object sender, EventArgs e)
        {
            var             service    = GetFcbDataService();
            var             timeperiod = this.timePeriodControl1.TimePeriod;
            SatelliteNumber basePrn    = (SatelliteNumber)this.bindingSource_basePrn.Current;

            ObjectTableStorage table = new ObjectTableStorage("NarrowFcbOfBsd");
            var Interval             = TimeSpan.FromMinutes(15);

            for (var time = timeperiod.Start; time <= timeperiod.End; time += Interval)
            {
                bool isNullRow = true;
                foreach (var prn in SatelliteNumber.DefaultGpsPrns)
                {
                    var bsdFrac = service.GetNLFcbOfBsdValue(time, prn, basePrn);
                    if (bsdFrac != null)
                    {
                        if (isNullRow)
                        {
                            table.NewRow();
                            table.AddItem("Epoch", time);
                        }

                        table.AddItem(prn.ToString(), bsdFrac);
                        isNullRow = false;
                    }
                }
            }
            this.objectTableControl1.DataBind(table);
        }
Пример #9
0
        private void button_vewSingleEpoch_Click(object sender, EventArgs e)
        {
            var service = GetFcbDataService();

            var             epoch   = new Time(namedTimeControl1.GetValue());
            SatelliteNumber basePrn = (SatelliteNumber)this.bindingSource_basePrn.Current;

            var           bsdFrac = service.GetNLFcbOfBsd(epoch, basePrn);
            StringBuilder sb      = new StringBuilder();

            sb.AppendLine("NL");
            sb.AppendLine(epoch.ToString());
            if (bsdFrac != null)
            {
                foreach (var item in bsdFrac)
                {
                    sb.AppendLine(item.Key + ":\t  " + item.Value);
                }
            }
            else
            {
                sb.AppendLine("No Data!!");
            }

            richTextBoxControl1.Text = sb.ToString();
        }
Пример #10
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);
        }
Пример #11
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);
        }
Пример #12
0
        private void button_multiWLView_Click(object sender, EventArgs e)
        {
            var             service    = GetFcbDataService();
            var             timeperiod = this.timePeriodControl1.TimePeriod;
            SatelliteNumber basePrn    = (SatelliteNumber)this.bindingSource_basePrn.Current;

            ObjectTableStorage table = new ObjectTableStorage("WideFcbOfBsd");
            var Interval             = TimeSpan.FromDays(1);

            for (var time = timeperiod.Start; time <= timeperiod.End; time += Interval)
            {
                var bsdFrac = service.GetWLFcbOfBsd(time, basePrn);
                if (bsdFrac != null && bsdFrac.Count > 0)
                {
                    table.NewRow();
                    table.AddItem("Epoch", time);

                    foreach (var kv in bsdFrac.KeyValues)
                    {
                        table.AddItem(kv.Key.ToString(), kv.Value);
                    }
                }
            }
            this.objectTableControl1.DataBind(table);
        }
Пример #13
0
        private void button_show_Click(object sender, EventArgs e)
        {
            if (ephemerisA == null)
            {
                Geo.Utils.FormUtil.ShowErrorMessageBox("读入数据 A 先!"); return;
            }
            if (ephemerisB == null)
            {
                Geo.Utils.FormUtil.ShowErrorMessageBox("读入数据 B 先!"); return;
            }

            if (this.comboBox_prn.SelectedItem == null)
            {
                Geo.Utils.FormUtil.ShowWarningMessageBox("没有共同卫星,无法比较!");
                return;
            }

            SatelliteNumber PRN = SatelliteNumber.Parse(this.comboBox_prn.SelectedItem.ToString());

            //每次取10个数计算
            sortedRecordsA = ephemerisA.Gets(PRN);
            sortedRecordsB = ephemerisB.Gets(PRN);//, new Time(this.TimeFrom.Value), new Time(this.TimeTo.Value));

            this.bindingSource1.DataSource = sortedRecordsA;
            this.bindingSource2.DataSource = sortedRecordsB;
            this.bindingSource3.DataSource = GetDifferEphemeirs(sortedRecordsA, sortedRecordsB);
        }
Пример #14
0
        private void button_smoothRange_Click(object sender, EventArgs e)
        {
            CheckAndReadObsFile();
            bool isDualFreIonFree = checkBox_ionoFree.Checked;

            int             smoothWindow            = this.namedIntControl_smoothWindow.GetValue();
            SatelliteNumber prn                     = (SatelliteNumber)this.bindingSource_sat.Current;
            var             PhaseSmoothRangeBulider = new NamedCarrierSmoothedRangeBuilderManager(checkBox_isApproved.Checked, smoothWindow, true, IonoDifferCorrectionType.DualFreqCarrier);

            List <TimedRinexSatObsData> records = ObsFile.GetEpochTimedObservations(prn);

            if (isDualFreIonFree)
            {
                if (ObsFile.Header.ObsInfo.GetFrequenceCount() <= 1)
                {
                    Geo.Utils.FormUtil.ShowWarningMessageBox("只有一个频率,无法实现无电离层组合!");
                    return;
                }

                DualFreqPhaseSmoothRange(prn, PhaseSmoothRangeBulider);
            }
            else
            {
                SingleFreqPhaseSmoothRange(prn, PhaseSmoothRangeBulider, records);
            }
        }
Пример #15
0
        /// <summary>
        /// 如果失败则返回 null。
        /// </summary>
        /// <param name="prn"></param>
        /// <param name="time"></param>
        /// <returns></returns>
        protected TProduct LoopGetAndSetCurrentService(SatelliteNumber prn, Time time)
        {
            TProduct        rst         = default(TProduct);
            List <TService> dayServices = GetMayAvailableServices(prn.SatelliteType, time);

            if (dayServices == null || dayServices.Count == 0)
            {
                log.Info("没有找到服务!" + typeof(TService).ToString());

                NulledServices.Add(time.GetGpsWeekAndDay());

                this.CurrentService = default(TService);
                return(rst);
            }

            foreach (var item in dayServices)
            {
                rst = item.Get(prn, time);

                if (rst != null)
                {
                    this.CurrentService = item;
                    this.Name           = this.CurrentService.ToString();

                    log.Info("匹配成功! " + typeof(TProduct).Name + " 服务设置为:" + item.ToString());
                    return(rst);
                }
            }
            return(rst);
        }
        /// <summary>
        /// 返回指定时间段,文件记录的星历信息。
        /// </summary>
        /// <param name="prn"></param>
        /// <param name="from"></param>
        /// <param name="to"></param>
        /// <returns></returns>
        public override List <Gnsser.Ephemeris> Gets(SatelliteNumber prn, Time from, Time to)
        {
            List <GlonassNavRecord> list = this.NavFile.Get(prn).FindAll(m => m.Time.DateTime >= from.DateTime &&
                                                                         m.Time.DateTime <= to.DateTime);

            return(GetEphemerisInfos(list));
        }
Пример #17
0
        public override void UiToEntity()
        {
            base.UiToEntity();
            Option.IsBaseSiteRequried         = this.checkBox_IsBaseSiteRequried.Checked;
            Option.IndicatedBaseSiteName      = this.namedStringControl_BaseSiteName.GetValue();
            Option.IndicatedPrn               = SatelliteNumber.Parse(this.enabledStringControl_IndicatedPrn.GetEnabledValue().Value);
            Option.IsIndicatedPrn             = this.enabledStringControl_IndicatedPrn.GetEnabledValue().Enabled;
            Option.BaseLineSelectionType      = this.enumRadioControl_BaseLineSelectionType.GetCurrent <BaseLineSelectionType>();
            Option.BaseSatSelectionType       = this.enumRadioControl_baseSatSelectionType.GetCurrent <Gnsser.BaseSatSelectionType>();
            Option.MaxDistanceOfShortBaseLine = this.namedFloatControl_maxShotBaseLine.Value;
            Option.MinDistanceOfLongBaseLine  = this.namedFloatControl_MinDistanceOfLongBaseLine.Value;

            Option.BaseLineFilePath = fileOpenControl_baselineFile.FilePath;
            Option.CenterSiteName   = namedStringControl_ceterSiteName.GetValue();

            this.Option.BaseSiteSelectType = this.enumRadioControl_BaseSiteSelectType.GetCurrent <BaseSiteSelectType>();

            //手动输入
            double levelFixed    = this.namedFloatControl_fixedErrorLevel.GetValue();
            double verticalFixed = this.namedFloatControl_fixedErrorVertical.GetValue();
            double levelCoeef    = this.namedFloatControl_levelCoefOfProprotion.GetValue();
            double verticalCoeef = this.namedFloatControl_verticalCoefOfProprotion.GetValue();

            Option.GnssReveiverNominalAccuracy = new GnssReveiverNominalAccuracy(levelFixed, verticalFixed, levelCoeef, verticalCoeef);
        }
        public override bool IsAvailable(SatelliteNumber prn, Time satTime)
        {
            log.Warn("Glonass 的 IsHealth 方法并没有实现!");
            return(true);

            throw new NotImplementedException();
        }
Пример #19
0
        /// <summary>
        /// 获取窗口
        /// </summary>
        /// <param name="prn"></param>
        /// <param name="frequenceType"></param>
        /// <returns></returns>
        public TimeNumeralWindowData GetBufferValues(SatelliteNumber prn, FrequenceType frequenceType)
        {
            TimeNumeralWindowData window = new TimeNumeralWindowData(WindowSize);
            var buffer = this.Buffers;
            //首先从过去的
            var lastWindowOfP1 = LastWindowDataManager.GetOrCreate(BuildKey(prn, frequenceType));

            window.Add(lastWindowOfP1);

            //然后从bufffer里面提取另一半
            var bufferOfEpoches = buffer.GetSubList(0, HalfWindowSize);

            foreach (var epoch in bufferOfEpoches)
            {
                if (epoch.Contains(prn))
                {
                    var sat  = epoch[prn];
                    var time = epoch.ReceiverTime;
                    var p    = sat[frequenceType].PseudoRange.Value;//原始数据

                    window.Add(time, p);
                }
            }
            return(window);
        }
Пример #20
0
 /// <summary>
 /// 构造函数
 /// </summary>
 /// <param name="pathes"></param>
 public WideLaneOfBsdSolver(ObjectTableManager SmoothedMwValue, SatelliteNumber BasePrn, int MinSiteCount, int MinEpoch, string OutputDirectory = null)
     : base("WL", BasePrn, OutputDirectory)
 {
     this.MinSiteCount    = MinSiteCount;
     this.MinEpoch        = MinEpoch;
     this.SmoothedMwValue = SmoothedMwValue;
 }
Пример #21
0
 /// <summary>
 /// 创建一个
 /// </summary>
 /// <param name="key"></param>
 /// <returns></returns>
 public override TimedSatObject <TEntity> Create(SatelliteNumber key)
 {
     return(new TimedSatObject <TEntity>(key)
     {
         IsSameSourceRequired = IsSameSourceRequired, SourceCode = SourceCode
     });
 }
Пример #22
0
        /// <summary>
        /// 传统构造函数。
        /// </summary>
        /// <param name="pathesOfWLInt"></param>
        /// <param name="pppPathes"></param>
        /// <param name="IsOutputInEachDirectory"></param>
        /// <param name="OutputDirectory"></param>
        public MultiPeriodNarrowLaneOfBsdSolver(string[] pathesOfWLInt, string[] pppPathes, int removeCountOfEachSegment, bool IsOutputInEachDirectory, string OutputDirectory)
        {
            //读取宽巷的整数解
            //分基准星计算
            this.IsOutputInEachDirectory = IsOutputInEachDirectory;
            this.OutputDirectory         = OutputDirectory;
            this.IntOfWLPathes           = new Dictionary <SatelliteNumber, List <string> >();
            SatelliteNumber basePrn = new SatelliteNumber();

            foreach (var path in pathesOfWLInt)
            {
                basePrn = SatelliteNumber.Parse(Path.GetFileName(path).Substring(4, 3));
                if (IntOfWLPathes.ContainsKey(basePrn))
                {
                    IntOfWLPathes[basePrn].Add(path);
                }
                else
                {
                    IntOfWLPathes[basePrn] = new List <string>();
                    IntOfWLPathes[basePrn].Add(path);
                }
            }
            this.FloatAmbiguitiesOfPpp = PppTableResultFileReader.ReadPppAmbiResultInCycle(pppPathes);
            //修理浮点解
            FloatAmbiguitiesOfPpp.RemoveStartRowOfEachSegment(removeCountOfEachSegment);
            MaxAllowedDiffer = 0.25;
        }
Пример #23
0
        /// <summary>
        /// 针对某一个卫星绘制
        /// </summary>
        /// <param name="prn"></param>
        /// <returns></returns>
        private ObjectTableStorage BuildObjectTable(SatelliteNumber prn)
        {
            bool isCarrierInLen = checkBox_carrrierInLen.Checked;
            bool isShowL1Only   = checkBox_showL1Only.Checked;
            List <TimedRinexSatObsData> records = ObsFile.GetEpochTimedObservations(prn);
            ObjectTableStorage          table   = new ObjectTableStorage();

            foreach (var record in records)
            {
                table.NewRow();
                table.AddItem("Epoch", record.Time);
                foreach (var item in record.SatObsData)
                {
                    if (isShowL1Only && !item.Key.Contains("1"))
                    {
                        continue;
                    }
                    if (isCarrierInLen && item.Key.Contains("L1"))
                    {
                        var freq = Frequence.GetFrequence(prn, FrequenceType.A, record.Time);
                        table.AddItem(item.Key, item.Value.Value * freq.WaveLength);
                    }
                    else if (isCarrierInLen && item.Key.Contains("L2"))
                    {
                        var freq = Frequence.GetFrequence(prn, FrequenceType.B, record.Time);
                        table.AddItem(item.Key, item.Value.Value * freq.WaveLength);
                    }
                    else
                    {
                        table.AddItem(item.Key, item.Value.Value);
                    }
                }
            }
            return(table);
        }
Пример #24
0
        /// <summary>
        /// 对载波距离进行修正,若超出一定的距离。
        /// </summary>
        /// <param name="prn"></param>
        /// <param name="freqType"></param>
        /// <param name="PhaseRangeMinusPseudorange"></param>
        /// <returns></returns>
        private double RevisePhaseRange(SatelliteNumber prn, FrequenceType freqType, double PhaseRangeMinusPseudorange)
        {
            if (!PreviousData.ContainsKey(prn))
            {
                PreviousData[prn] = new Dictionary <FrequenceType, double>();
            }

            if (!PreviousData[prn].ContainsKey(freqType))
            {
                PreviousData[prn][freqType] = 0;
            }
            else
            {
                var prevValue = PreviousData[prn][freqType];

                if (PhaseRangeMinusPseudorange < prevValue - 750.0)
                {
                    PhaseRangeMinusPseudorange += 1500.0;
                }
                else if (PhaseRangeMinusPseudorange > prevValue + 750.0)
                {
                    PhaseRangeMinusPseudorange -= 1500.0;
                }
            }

            PreviousData[prn][freqType] = PhaseRangeMinusPseudorange;

            return(PhaseRangeMinusPseudorange);
        }
Пример #25
0
        /// <summary>
        /// 双差网解定位。具有模糊度。
        /// </summary>
        /// <param name="mInfo">历元观测信息</param>
        /// <param name="Adjustment"></param>
        /// <param name="positioner"></param>
        /// <param name="baseSatPrn"></param>
        /// <param name="baseParamCount"></param>
        public NetDoubleDifferPositionResult(
            MultiSiteEpochInfo mInfo,
            AdjustResultMatrix Adjustment,
            GnssParamNameBuilder positioner,
            SatelliteNumber baseSatPrn,
            int baseParamCount = 5
            )
            : base(mInfo, Adjustment, positioner)
        {
            //设置第一个流动站坐标改正数
            int i        = 0;
            var estmated = this.ResultMatrix.Estimated;

            foreach (var paramName in estmated.ParamNames)
            {
                if (paramName.Contains(Gnsser.ParamNames.Dx))
                {
                    double x = estmated[i];
                    double y = estmated[i + 1];
                    double z = estmated[i + 2];
                    this.XyzCorrection = new XYZ(x, y, z);
                    break;
                }
            }
        }
Пример #26
0
 /// <summary>
 /// 相位模糊度模型
 /// </summary>
 /// <param name="prn"></param>
 /// <param name="stdDev"></param>
 /// <param name="stdDevWhenCycled"></param>
 public SingleSatPhaseAmbiguityModel(SatelliteNumber prn, double stdDev, double stdDevWhenCycled)
 {
     VarianceWhenCycled = stdDevWhenCycled * stdDevWhenCycled;
     this.Variance      = stdDev * stdDev;
     this.HasCycleSlip  = true;
     this.Prn           = prn;
 }
Пример #27
0
        /// <summary>
        /// 构建观测历元。
        /// </summary>
        /// <param name="row"></param>
        /// <param name="indexColName"></param>
        /// <returns></returns>
        public RinexEpochObservation BuildObs(Dictionary <String, object> row, string indexColName)
        {
            var obs = new RinexEpochObservation();

            obs.ReceiverTime = new Geo.Times.Time((DateTime)row[indexColName]);
            foreach (var item in row)
            {
                var name = item.Key;
                if (name == indexColName)
                {
                    continue;
                }

                var code = name.Substring(4);
                var prn  = SatelliteNumber.Parse(name);

                if (!obs.Contains(prn))
                {
                    obs[prn] = new RinexSatObsData(prn);
                }
                var obsValue = new RinexObsValue((double)item.Value, code);
                obs[prn].Add(code, obsValue);
            }
            return(obs);
        }
Пример #28
0
        /// <summary>
        /// 获取服务。
        /// </summary>
        /// <param name="prn"></param>
        /// <param name="time"></param>
        /// <returns></returns>
        public TProduct Get(SatelliteNumber prn, Time time)
        {
            if (CurrentService != null)
            {
                var result = CurrentService.Get(prn, time);
                if (result == null)
                {
                    //重新选择服务。
                    log.Warn(this.Name + " " + prn + " 在 " + time + " 获取 " + typeof(TProduct).Name + " 失败!");
                    if (IsSwitchWhenEphemerisNull)
                    {
                        log.Info(typeof(TProduct).Name + " " + this.Name + "尝试重新选择服务");
                        return(LoopGetAndSetCurrentService(prn, time));
                    }
                }
                return(result);
            }
            if (NulledServices.Contains(time.GetGpsWeekAndDay()))
            {
                return(default(TProduct));
            }

            TProduct rst = LoopGetAndSetCurrentService(prn, time);

            return(rst);
        }
        /// <summary>
        /// 生成。
        /// </summary>
        /// <returns></returns>
        public override List <string> Build()
        {
            if (SatelliteNumber.IsNullOrDefault(BasePrn))
            {
                throw new Geo.ShouldNotHappenException("请设置基础卫星");
            }
            List <SatelliteNumber> enabledPrns = new List <SatelliteNumber>();


            //双差才参数名称,只有坐标和模糊度互差
            List <string> ParamNames = new List <string>(Gnsser.ParamNames.Dxyz);

            if (this.BaseParamCount == 4)
            {
                ParamNames.Add(Gnsser.ParamNames.WetTropZpd);
            }
            if (this.BaseParamCount == 5)
            {
                ParamNames.Add(Gnsser.ParamNames.WetTropZpd); ParamNames.Add(Gnsser.ParamNames.RefWetTrop);
            }

            foreach (var prn in this.EnabledPrns)
            {
                if (prn.Equals(BasePrn))
                {
                    continue;
                }

                ParamNames.Add(GetParamName(prn));
            }
            return(ParamNames);
        }
Пример #30
0
        private void ShowComparing()
        {
            //比较
            List <ClockLite> compares = new List <ClockLite>();

            foreach (var item in Clocks)
            {
                Ephemeris eph = Ephemerides.Find(m => m.Time.Equals(item.Time));
                if (eph == null)
                {
                    continue;
                }

                ClockLite c = new ClockLite()
                {
                    Prn = item.Prn == null?SatelliteNumber.Parse(item.Name) : item.Prn,
                              GpsTime = item.Time,
                              Offset  = item.ClockBias - eph.ClockBias,
                              Drift   = item.ClockDrift - eph.ClockDrift
                };
                c.Distance = c.Offset * GnssConst.LIGHT_SPEED;
                compares.Add(c);
            }

            this.bindingSource_comparing.DataSource = compares;
        }