Esempio n. 1
0
 /// <summary>
 /// 统计卫星出勤率 构造函数。
 /// </summary>
 /// <param name="obsFileA"></param>
 /// <param name="obsFileB"></param>
 public SourcePrnStatistics(ISingleSiteObsStream obsFileA, ISingleSiteObsStream obsFileB, List <SatelliteType> satTypes, int SatCount = 5)
 {
     this.SatCount = SatCount;
     this.satTypes = satTypes;
     //卫星总出勤率,选择前五个利用。
     this.CommonPRNs = GetComonSatPRNs(obsFileA, obsFileB, SatCount, satTypes);
 }
Esempio n. 2
0
        /// <summary>
        ///  数据预处理,卫星的选择条件:两个站观测历元中出现次数最多的卫星,卫星数量大于4.
        ///  以卫星的出勤率为参考。
        /// </summary>
        /// <param name="obsFileA"></param>
        /// <returns></returns>
        private static List <SatelliteNumberRatio> SatAppearRatios(ISingleSiteObsStream obsFileA, ISingleSiteObsStream obsFileB, List <SatelliteType> satTypes)
        {
            //  double baseRatio = 1.0 / (obsFileA.Count + obsFileB.Count);

            List <SatelliteNumberRatio> satApearRatio = new List <SatelliteNumberRatio>();

            foreach (var oSec in obsFileA)
            {
                foreach (SatelliteNumber prn in oSec.EnabledPrns)
                {
                    if (!satTypes.Contains(prn.SatelliteType))
                    {
                        continue;
                    }

                    SatelliteNumberRatio s = new SatelliteNumberRatio()
                    {
                        PRN = prn, Ratio = 1
                    };
                    if (!satApearRatio.Contains(s))
                    {
                        satApearRatio.Add(s);
                    }
                    else
                    {
                        satApearRatio.Find(mbox => mbox.PRN.Equals(prn)).Ratio += 1;
                    }
                }
            }
            foreach (var oSec in obsFileB)
            {
                foreach (SatelliteNumber prn in oSec.EnabledPrns)
                {
                    if (!satTypes.Contains(prn.SatelliteType))
                    {
                        continue;
                    }

                    SatelliteNumberRatio s = new SatelliteNumberRatio()
                    {
                        PRN = prn, Ratio = 1
                    };
                    if (!satApearRatio.Contains(s))
                    {
                        satApearRatio.Add(s);
                    }
                    else
                    {
                        satApearRatio.Find(mbox => mbox.PRN.Equals(prn)).Ratio += 1;
                    }
                }
            }
            //排序
            satApearRatio.Sort();

            //obsFileA.Reset();
            //obsFileB.Reset();
            return(satApearRatio);
        }
Esempio n. 3
0
 /// <summary>
 /// 构造函数,只有一个站
 /// </summary>
 /// <param name="dataSource"></param>
 public MultiSiteObsStream(ISingleSiteObsStream dataSource)
 {
     this.BaseSiteSelectType    = BaseSiteSelectType.First;
     this.IndicatedBaseSiteName = dataSource.SiteInfo.SiteName;
     this.DataSources           = new BaseDictionary <string, ISingleSiteObsStream>();
     this.DataSources.Add(dataSource.Name, dataSource);
     Init();
 }
Esempio n. 4
0
        /// <summary>
        /// 数据源读取
        /// </summary>
        private void LoadDataSource()
        {
            startTime = DateTime.Now;

            //星历数据源
            ephemerisDataSource = null;
            if (IsSetEphemerisFile)//读取星历数据
            {
                string            ephemerisPath = this.textBox_navPath.Text;
                FileEphemerisType ephType       = EphemerisDataSourceFactory.GetFileEphemerisTypeFromPath(ephemerisPath);
                ephemerisDataSource = EphemerisDataSourceFactory.Create(ephemerisPath);
            }
            //加载文件数据
            this.rovPath          = this.textBox_obsFile_rov.Text;
            this.RefObsDataSource = new RinexFileObsDataSource(this.textBox_obsPath_ref.Text);
            this.RovObsDataSource = new RinexFileObsDataSource(rovPath);

            //使用外部设置的概略坐标。
            if (this.rmsedXyzControl_rov.IsEnabled)
            {
                this.RovObsDataSource.SiteInfo.SetApproxXyz(this.rmsedXyzControl_rov.RmsedXyz.Value);
                this.RovObsDataSource.SiteInfo.EstimatedXyzRms = this.rmsedXyzControl_rov.RmsedXyz.Rms;
            }
            //概略坐标显示到界面上。
            rmsedXyzControl_rov.SetRmsedXyz(new RmsedXYZ(RovObsDataSource.SiteInfo.ApproxXyz, RovObsDataSource.SiteInfo.EstimatedXyzRms));


            //使用外部设置的概略坐标。
            if (this.rmsedXyzControl_ref.IsEnabled)
            {
                this.RefObsDataSource.SiteInfo.SetApproxXyz(this.rmsedXyzControl_ref.RmsedXyz.Value);
                this.RefObsDataSource.SiteInfo.EstimatedXyzRms = this.rmsedXyzControl_ref.RmsedXyz.Rms;
            }
            //概略坐标显示到界面上。
            rmsedXyzControl_ref.SetRmsedXyz(new RmsedXYZ(RefObsDataSource.SiteInfo.ApproxXyz, RefObsDataSource.SiteInfo.EstimatedXyzRms));



            //检查是否读取钟差数据
            clockFile = null;
            if (this.checkBox_enableClockFile.Checked)
            {
                clockFile = new Data.SimpleClockService(this.textBox_ClockPath.Text);
            }

            TimeSpan span = DateTime.Now - startTime;

            ShowInfo("数据已读入,时间(秒):" + span.TotalSeconds);
        }
Esempio n. 5
0
        /// <summary>
        /// 通过服务设置坐标
        /// </summary>
        /// <param name="source"></param>
        public void TrySetApproxXyzValue(ISingleSiteObsStream source)
        {
            if (Context.SiteCoordService == null || !Option.IsSiteCoordServiceRequired)
            {
                return;
            }
            var xyz = Context.SiteCoordService.Get(source.SiteInfo.MarkerNumber, source.ObsInfo.StartTime);

            if (xyz != null)
            {
                log.Info(Context.SiteCoordService.Name + " 获取到" + source.Name + "坐标" + xyz);
                source.SiteInfo.SetApproxXyz(xyz.Value);
                source.SiteInfo.EstimatedXyz    = (xyz.Value);
                source.SiteInfo.EstimatedXyzRms = xyz.Rms;
            }
        }
Esempio n. 6
0
 /// <summary>
 /// 数据源读取
 /// </summary>
 private static void ReadFiles(GnsserConfig config)
 {
     //加载文件数据
     observationDataSource = new RinexFileObsDataSource(config.ObsPath);
     SiteInfo = observationDataSource.SiteInfo;
     //是否读取星历文件,如果设置了,且存在则读取只
     if (File.Exists(config.NavPath))
     {
         ephemerisDataSource = EphemerisDataSourceFactory.Create(config.NavPath);
     }
     //是否有精密星历
     if (File.Exists(config.ClkPath))
     {
         clockFile = new ClockService(config.ClkPath);
     }
 }
Esempio n. 7
0
        /// <summary>
        /// walk
        /// </summary>
        public override void Walk()
        {
            ISingleSiteObsStream dataSourceB = this.EnumerableDataB as ISingleSiteObsStream;

            foreach (var obsA in this.EnumerableDataA)
            {
                var obsB = dataSourceB.Get(obsA.ReceiverTime, 1);

                var obj  = obsA;
                var objB = obsA;
                if (!ProcessorChain.Revise(ref obj, ref objB))
                {
                    //throw new Exception(ProcessorChain.Message);
                }
            }
        }
Esempio n. 8
0
        /// <summary>
        /// 检查数据源初始坐标是否合法,如果否,则采用伪距定位设置之。
        /// </summary>
        /// <param name="source"></param>
        private void CheckAndSetApproxXyz(ISingleSiteObsStream source)
        {
            //若为0,或地心长度小于 MinAllowedApproxXyzLen,重新计算。
            if (XYZ.IsZeroOrEmpty(source.SiteInfo.ApproxXyz) || source.SiteInfo.ApproxXyz.Length < this.Option.MinAllowedApproxXyzLen)
            {
                source.SiteInfo.SetApproxXyz(new XYZ());

                log.Error(source.Name + " 没有发现有效的初始坐标,先置 0, 将用伪距定位赋予初值。");
                var result = SimpleRangePositioner.GetApproxPosition(Context);
                if (result == null)
                {
                    log.Error(source.Name + " 初始定位失败!"); return;
                }
                var xyz = result.EstimatedXyz;
                source.SiteInfo.SetApproxXyz(xyz);
                log.Error(source.Name + " 初始坐标设置为 " + xyz);
            }
        }
Esempio n. 9
0
        /// <summary>
        /// 观测文件分析者,构造函数
        /// </summary>
        public ObsDataAnalyst(ISingleSiteObsStream dataSource, List <SatelliteType> SatelliteTypes)
        {
            ObsDataSourceWalker ObsDataSourceWalker = new ObsDataSourceWalker(dataSource);

            //卫星可见性分析
            SatVisibiltyAnalyst analyst = new SatVisibiltyAnalyst(SatelliteTypes, dataSource.ObsInfo.Interval);
            //周跳探测
            SatCycleSlipAnalyst satCycleSlipAnalyst = new SatCycleSlipAnalyst(SatelliteTypes, dataSource.ObsInfo.Interval);

            ObsDataSourceWalker.ProcessorChain.AddProcessor(analyst);
            ObsDataSourceWalker.ProcessorChain.AddProcessor(satCycleSlipAnalyst);

            ObsDataSourceWalker.Walk();

            dataSource.Reset();

            this.SatCycleSlipMaker = satCycleSlipAnalyst.SatSequentialPeriod;
            this.SatVisibleMaker   = analyst.SatSequentialPeriod;
            this.SatelliteSelector = new SatelliteSelector(SatVisibleMaker, SatCycleSlipMaker);
        }
Esempio n. 10
0
        /// <summary>
        /// 通过服务设置坐标
        /// </summary>
        /// <param name="source"></param>
        private void TryUpdateStationInfo(ISingleSiteObsStream source)
        {
            if (Context.StaionInfoService == null)
            {
                return;
            }
            var info = Context.StaionInfoService.Get(source.Name.Substring(0, 4), source.ObsInfo.StartTime);

            if (info != null)
            {
                log.Info(Context.StaionInfoService.Name + " 获取到" + source.Name.Substring(0, 4) + "信息" + info);
                source.SiteInfo.Hen            = info.AntHEN;
                source.SiteInfo.AntennaType    = info.AntennaType;
                source.SiteInfo.AntennaNumber  = info.AntennaNumber;
                source.SiteInfo.ReceiverType   = info.ReceiverType;
                source.SiteInfo.ReceiverNumber = info.ReceiverNumber;
            }
            else
            {
                log.Warn(Context.StaionInfoService.Name + " 获取 " + source.Name + " 信息失败,将采用RINEX文件默认测站信息");
            }
        }
Esempio n. 11
0
        /// <summary>
        /// 卫星总出勤率,选择前五个利用。
        /// </summary>
        /// <param name="obsFileA"></param>
        /// <param name="obsFileB"></param>
        /// <returns></returns>
        public static List <SatelliteNumber> GetComonSatPRNs(
            ISingleSiteObsStream obsFileA,
            ISingleSiteObsStream obsFileB,
            int SatCount,
            List <SatelliteType> satTypes
            )
        {
            List <SatelliteNumberRatio> satApearRatio = SatAppearRatios(obsFileA, obsFileB, satTypes);
            List <SatelliteNumber>      commonPrns    = new List <SatelliteNumber>();

            foreach (SatelliteNumberRatio s in satApearRatio)
            {
                if (commonPrns.Count < SatCount)
                {
                    commonPrns.Add(s.PRN);
                }
                else
                {
                    break;
                }
            }
            return(commonPrns);
        }
Esempio n. 12
0
        /// <summary>
        /// 观测文件分析者,构造函数
        /// </summary>
        public BaseLineObsDataAnalyst(
            DataSourceContext DataSourceContext,
            ISingleSiteObsStream refDataSource,
            ISingleSiteObsStream rovDataSource,
            GnssProcessOption SatelliteTypes)
        {
            BaseLineObsDataSourceWalker BaseLineObsDataSourceWalker = new Data.Rinex.BaseLineObsDataSourceWalker(refDataSource, rovDataSource);

            //卫星可见性分析
            BaseLineVisibiltyAnalyst baseLineVisibiltyAnalyst = new BaseLineVisibiltyAnalyst(SatelliteTypes.SatelliteTypes, refDataSource.ObsInfo.Interval);
            //周跳探测
            BaseLineSatCycleSlipAnalyst baseLineSatCycleSlipAnalyst = new BaseLineSatCycleSlipAnalyst(DataSourceContext,
                                                                                                      SatelliteTypes,
                                                                                                      refDataSource.ObsInfo.Interval);

            BaseLineObsDataSourceWalker.ProcessorChain.AddProcessor(baseLineVisibiltyAnalyst);
            BaseLineObsDataSourceWalker.ProcessorChain.AddProcessor(baseLineSatCycleSlipAnalyst);

            BaseLineObsDataSourceWalker.Walk();

            this.SatCycleSlipMaker = baseLineSatCycleSlipAnalyst.SatPeriodMarker;
            this.SatVisibleMaker   = baseLineVisibiltyAnalyst.SatPeriodMarker;
            this.SatelliteSelector = new SatelliteSelector(SatVisibleMaker, SatCycleSlipMaker);
        }
Esempio n. 13
0
 /// <summary>
 /// 反转的单站观测数据源
 /// </summary>
 /// <param name="Stream"></param>
 public ReversedSingleSiteObsStream(ISingleSiteObsStream Stream) : base(Stream)
 {
     this.OriginalSource = Stream;
 }
Esempio n. 14
0
 /// <summary>
 /// 数据遍历处理器,构造函数。
 /// </summary>
 /// <param name="satData"></param>
 public BaseLineObsDataSourceWalker(ISingleSiteObsStream dataA, ISingleSiteObsStream dataB)
     : base(dataA, dataB)
 {
 }