/// <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); }
/// <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); }
/// <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(); }
/// <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); }
/// <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; } }
/// <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); } }
/// <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); } } }
/// <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); } }
/// <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); }
/// <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文件默认测站信息"); } }
/// <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); }
/// <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); }
/// <summary> /// 反转的单站观测数据源 /// </summary> /// <param name="Stream"></param> public ReversedSingleSiteObsStream(ISingleSiteObsStream Stream) : base(Stream) { this.OriginalSource = Stream; }
/// <summary> /// 数据遍历处理器,构造函数。 /// </summary> /// <param name="satData"></param> public BaseLineObsDataSourceWalker(ISingleSiteObsStream dataA, ISingleSiteObsStream dataB) : base(dataA, dataB) { }