/// <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));
 }
Beispiel #3
0
        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;
 }
Beispiel #5
0
        /// <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;
        }
Beispiel #6
0
        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);
        }
Beispiel #7
0
        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);
        }