/// <summary> /// 构造函数。 /// </summary> /// <param name="obsPathes"></param> /// <param name="satTypes"></param> /// <param name="outInterval"></param> public SatElevatoinTableBuilder(string[] obsPathes, List <SatelliteType> satTypes, double outInterval = 30, double AngleCut = 0) { this.SatelliteTypes = satTypes; this.OutInterval = outInterval; this.ObsPathes = obsPathes; this.NamePostfix = "SatEle"; this.AngleCut = AngleCut; this.EphemerisService = GlobalNavEphemerisService.Instance;// GlobalIgsEphemerisService.Instance; this.OutputDirectory = Setting.TempDirectory; this.SiteCoords = new Dictionary <string, XYZ>(); Time StartTime = new Time(); Time endTime = new Time(); foreach (var filePath in ObsPathes) { var header = new RinexObsFileReader(filePath, false).GetHeader(); var siteXyz = header.SiteInfo.ApproxXyz; var fileName = Path.GetFileName(filePath); var tableName = fileName + "_" + NamePostfix; SiteCoords[tableName] = siteXyz; if (endTime != header.EndTime) { endTime = header.EndTime; } if (StartTime != header.StartTime) { StartTime = header.StartTime; } } TimeLooper = new TimeLooper(new TimePeriod(StartTime, endTime), outInterval); }
/// <summary> /// 生成一个卫星高度角表格 /// </summary> /// <param name="TimeLooper"></param> /// <param name="siteXyz"></param> /// <param name="SatelliteTypes"></param> /// <param name="AngleCut"></param> /// <param name="EphemerisService"></param> /// <param name="tableName"></param> /// <returns></returns> public static ObjectTableStorage BuildTable( TimeLooper TimeLooper, XYZ siteXyz, List <SatelliteType> SatelliteTypes, double AngleCut = 10, IEphemerisService EphemerisService = null, string tableName = "卫星高度角") { return(BuildTable(TimeLooper.TimePeriod.Start, TimeLooper.TimePeriod.End, TimeLooper.StepInSeconds, siteXyz, SatelliteTypes, AngleCut, EphemerisService, tableName)); }
public SatPolarCalculator(XYZ siteXyz, List <SatelliteNumber> Prns, TimePeriod timePeriod, double stepSecond = 30, double cutOff = 5) { this.siteXyz = siteXyz; this.Prns = Prns; this.cutOff = cutOff; EphemerisService = GlobalNavEphemerisService.Instance; looper = new TimeLooper(timePeriod, stepSecond); looper.Looping += Looper_Looping; looper.Completed += Looper_Completed; }
/// <summary> /// 卫星高度角生成器 /// </summary> /// <param name="SiteCoords"></param> /// <param name="TimeLooper"></param> /// <param name="satTypes"></param> /// <param name="AngleCut"></param> public SatElevatoinTableBuilder(Dictionary <string, XYZ> SiteCoords, TimeLooper TimeLooper, List <SatelliteType> satTypes = null, double AngleCut = 0) { if (satTypes == null) { satTypes = new List <SatelliteType>() { SatelliteType.G }; } this.TimeLooper = TimeLooper; this.AngleCut = AngleCut; this.EphemerisService = GlobalIgsEphemerisService.Instance; this.OutputDirectory = Setting.TempDirectory; this.SiteCoords = SiteCoords; }
/// <summary> /// 构造函数 /// </summary> /// <param name="EphemerisService"></param> /// <param name="CutOffAngle"></param> /// <param name="EnabledPrns"></param> /// <param name="SatWeights"></param> /// <param name="outDirectory"></param> /// <param name="TimeLooper"></param> /// <param name="GeoGridLooper"></param> public DopSolver(IEphemerisService EphemerisService, double CutOffAngle, string outDirectory, List <SatelliteNumber> EnabledPrns, SatWeightTable SatWeights, TimeLooper TimeLooper, GeoGridLooper GeoGridLooper) { this.OutputDirectory = outDirectory; this.EphemerisService = EphemerisService; this.EnabledPrns = EnabledPrns; this.SatWeights = SatWeights; this.CutOffAngle = CutOffAngle; this.GeoGridLooper = GeoGridLooper; var satTypes = SatelliteNumber.GetSatTypes(EnabledPrns); this.FileNamePrefix = Geo.Utils.EnumerableUtil.ToString <SatelliteType>(satTypes, "-"); this.TimeLooper = TimeLooper; this.TimeLooper.Looping += TimeLooper_Looping; this.MaxDopThreshold = double.MaxValue; }
private ObjectTableStorage GetSatEleTable(string[] inputPathes) { ObjectTableStorage satEleTable = null; bool isInputCoord = this.checkBox_inputCoord.Checked; var cutOffAngle = namedFloatControl1AngleCut.GetValue(); if (!isInputCoord) { log.Info("采用了文件输入高度角"); if (inputPathes.Length == 0) { Geo.Utils.FormUtil.ShowWarningMessageBox("请输入文件"); return(satEleTable); } var baseSiteEle = inputPathes[0]; if (baseSiteEle.ToLower().EndsWith(Setting.SatElevationFileExtension.ToLower())) { var reader = new ObjectTableReader(baseSiteEle); satEleTable = reader.Read(); } else if (baseSiteEle.ToLower().EndsWith("rnx") || baseSiteEle.ToLower().EndsWith("o"))//O文件 { satEleTable = SatElevatoinTableBuilder.BuildTable(baseSiteEle, cutOffAngle, GlobalNavEphemerisService.Instance); } } else//手动输入 { log.Info("即将跟输入计算高度角信息"); //输出的采样间隔 TimeLooper looper = timeLoopControl1.GetTimeLooper(); var xyz = XYZ.Parse(this.namedStringControl_coord.GetValue()); satEleTable = SatElevatoinTableBuilder.BuildTable(looper, xyz, this.SatelliteTypes, cutOffAngle, GlobalNavEphemerisService.Instance, "卫星高度角"); } return(satEleTable); }
protected override void Run(string[] inputPathes) { string navFile = fileOpenControl_nav.GetFilePath(); //输出的采样间隔 TimeLooper looper = timeLoopControl1.GetTimeLooper(); var builder = new SatElevatoinTableBuilder(inputPathes, this.SatelliteTypes, looper, namedFloatControl1AngleCut.Value); builder.OutputDirectory = this.OutputDirectory; builder.ProgressViewer = this.ProgressBar; if (File.Exists(navFile)) { var ephService = EphemerisDataSourceFactory.Create(navFile); builder.EphemerisService = ephService; log.Info("采用了星历服务 " + ephService); } var tableMgr = builder.Build(); if (checkBox_enableStatistics.Checked) { int angleStep = 10; var table = tableMgr.First; #region 卫星历元数统计 var eleTable = new ObjectTableStorage(table.Name + "_不同高度截止角的历元数量统计"); for (int i = 0; i <= 30; i = i + angleStep) { eleTable.NewRow(); eleTable.AddItem("Elevation", i); var count = table.GetCount(new Func <double, bool>(val => val >= i)); eleTable.AddItem(count); eleTable.EndRow(); } #endregion #region 卫星颗数统计 var rowCountDics = new Dictionary <int, Dictionary <DateTime, int> >(); for (int i = 0; i <= 30; i = i + angleStep) { rowCountDics[i] = table.GetEachRowCount <DateTime>(new Func <double, bool>(val => val >= i)); } var satCountTable = new ObjectTableStorage(table.Name + "_可用卫星数量统计"); var first = rowCountDics[0]; foreach (var item in first) { var index = item.Key; satCountTable.NewRow(); satCountTable.AddItem("Epoch", index); foreach (var rows in rowCountDics) { var val = rows.Value[index]; satCountTable.AddItem(rows.Key, val); } satCountTable.EndRow(); } #endregion #region 卫星连续历元数统计 var maxValTable = new ObjectTableStorage(table.Name + "_最大数据统计"); var maxSequentialCountTable = new ObjectTableStorage(table.Name + "_最大连续历元数量统计"); var minSequentialCountTable = new ObjectTableStorage(table.Name + "_最小连续历元数量统计"); var satPeriodCountTable = new ObjectTableStorage(table.Name + "_卫星出现次数统计"); for (int i = 0; i <= 30; i = i + angleStep) { maxSequentialCountTable.NewRow(); maxSequentialCountTable.AddItem("Elevation", i); minSequentialCountTable.NewRow(); minSequentialCountTable.AddItem("Elevation", i); satPeriodCountTable.NewRow(); satPeriodCountTable.AddItem("Elevation", i); maxValTable.NewRow(); maxValTable.AddItem("Elevation", i); var dic = table.GetSequentialCountOfAllCol <DateTime>(new Func <double, bool>(val => val >= i)); foreach (var item in dic) { item.Value.Sort(new Comparison <Segment <DateTime> >((one, two) => (int)((two.End - two.Start) - (one.End - one.Start)).TotalSeconds)); //最大时段 var max = item.Value[0]; var maxSpan = (max.End - max.Start).TotalHours; maxSequentialCountTable.AddItem(item.Key, maxSpan); //最大值 var maxval = table.GetMaxValue(item.Key, max.Start, max.End); maxValTable.AddItem(item.Key, maxval); //最小时段 var lastIndex = item.Value.Count - 1; var min = item.Value[lastIndex]; var minSpan = (min.End - min.Start).TotalHours; if (lastIndex == 0) { minSpan = 0; } minSequentialCountTable.AddItem(item.Key, minSpan); //时段次数输出 satPeriodCountTable.AddItem(item.Key, item.Value.Count); } maxValTable.EndRow(); maxSequentialCountTable.EndRow(); minSequentialCountTable.EndRow(); satPeriodCountTable.EndRow(); } #endregion if (checkBox_sortPrnSatistics.Checked) { maxValTable.SortColumns(); eleTable.SortColumns(); maxSequentialCountTable.SortColumns(); minSequentialCountTable.SortColumns(); satPeriodCountTable.SortColumns(); } tableMgr.Add(maxValTable); tableMgr.Add(satCountTable); tableMgr.Add(eleTable); tableMgr.Add(maxSequentialCountTable); tableMgr.Add(minSequentialCountTable); tableMgr.Add(satPeriodCountTable); } BindTableA(tableMgr.First); tableMgr.WriteAllToFileAndClearBuffer(tableMgr.First); }