Esempio n. 1
0
File: SPP.cs Progetto: eglrp/SPP
        /// <summary>
        /// 计算卫星在信号发射时的位置
        /// </summary>
        /// <param name="n_FileData">星历数据</param>
        /// <param name="satSendTime">卫星信号发射的时间</param>
        /// <returns>卫星在地心坐标系中的空间直角坐标</returns>
        public Position SatellitePosition(N_FileData n_FileData, GPSTime satSendTime)
        {
            Position satPosition = new Position();
            double   A, n0, tk, n, Mk, Ek, E0, f, uu, omega_uk, omega_rk, omega_ik, uk, rk, ik, xk, yk, Lk;

            A  = Math.Pow(n_FileData.SqrtA, 2);//轨道长半轴
            n0 = Math.Sqrt((Constant.GM / Math.Pow(A, 3)));
            tk = satSendTime.GPSWeek * 604800 + satSendTime.GPSSecond - n_FileData.GPSWeek * 604800 - n_FileData.TOE;
            if (tk > 302400)
            {
                tk = tk - 604800;
            }
            else if (tk < -302400)
            {
                tk = tk + 604800;
            }
            n  = n0 + n_FileData.DetlaN;
            Mk = n_FileData.M0 + n * tk;
            E0 = Mk;
            Ek = Mk + n_FileData.E * Math.Sin(E0);
            while (Math.Abs(Ek - E0) > Math.Pow(10, -12))
            {
                E0 = Ek;
                Ek = Mk + n_FileData.E * Math.Sin(E0);
            }
            f              = Math.Atan2((Math.Sqrt(1 - Math.Pow(n_FileData.E, 2))) * Math.Sin(Ek), Math.Cos(Ek) - n_FileData.E);
            uu             = f + n_FileData.OmegaLow;
            omega_uk       = n_FileData.Cus * Math.Sin(2 * uu) + n_FileData.Cuc * Math.Cos(2 * uu);
            omega_rk       = n_FileData.Crs * Math.Sin(2 * uu) + n_FileData.Crc * Math.Cos(2 * uu);
            omega_ik       = n_FileData.Cis * Math.Sin(2 * uu) + n_FileData.Cic * Math.Cos(2 * uu);
            uk             = uu + omega_uk;
            rk             = A * (1 - n_FileData.E * Math.Cos(Ek)) + omega_rk;
            ik             = n_FileData.I0 + omega_ik + n_FileData.IDot * tk;
            xk             = rk * Math.Cos(uk);
            yk             = rk * Math.Sin(uk);
            Lk             = n_FileData.Omega + (n_FileData.OmegaDot - Constant.OmegaDotE) * tk - Constant.OmegaDotE * n_FileData.TOE;
            satPosition.XX = xk * Math.Cos(Lk) - yk * Math.Cos(ik) * Math.Sin(Lk);
            satPosition.YY = xk * Math.Sin(Lk) + yk * Math.Cos(ik) * Math.Cos(Lk);
            satPosition.ZZ = yk * Math.Sin(ik);
            return(satPosition);
        }
Esempio n. 2
0
File: SPP.cs Progetto: eglrp/SPP
        //public double LastEpochX;
        //public double LastEpochY;
        //public double LastEpochZ;



        /// <summary>
        /// 读取N文件
        /// </summary>
        public bool Read_N_File()
        {
            string         path;//打开文件路径
            OpenFileDialog ofd = new OpenFileDialog();

            ofd.Title  = "选择导航电文文件";
            ofd.Filter = "N文件|*.*n|所有文件|*.*";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                path = ofd.FileName;
            }
            else
            {
                return(false);
            }
            //清除
            N_FileSum.n_FileHeadSum = null;
            N_FileSum.n_FileDataSum.Clear();


            StreamReader n_FileReader = new StreamReader(path);
            string       n_FileLine;//储存读到的每一行

            n_FileLine = n_FileReader.ReadLine();
            while (n_FileLine != null)
            {
                /**************************************读取头文件********************************************/
                while (n_FileLine.Trim() != "END OF HEADER")
                {
                    string tempStr = n_FileLine.Substring(60, n_FileLine.Length - 60);//用于判断内容的部分
                    switch (tempStr.Trim())
                    {
                    case "ION ALPHA":
                        n_FileHead.Ion_Alpha    = new double[4];
                        n_FileHead.Ion_Alpha[0] = double.Parse(n_FileLine.Substring(2, 8)) * Math.Pow(10, double.Parse(n_FileLine.Substring(11, 3)));
                        n_FileHead.Ion_Alpha[1] = double.Parse(n_FileLine.Substring(14, 8)) * Math.Pow(10, double.Parse(n_FileLine.Substring(23, 3)));
                        n_FileHead.Ion_Alpha[2] = double.Parse(n_FileLine.Substring(26, 8)) * Math.Pow(10, double.Parse(n_FileLine.Substring(35, 3)));
                        n_FileHead.Ion_Alpha[3] = double.Parse(n_FileLine.Substring(38, 8)) * Math.Pow(10, double.Parse(n_FileLine.Substring(47, 3)));
                        break;

                    case "ION BETA":
                        n_FileHead.Ion_Beta    = new double[4];
                        n_FileHead.Ion_Beta[0] = double.Parse(n_FileLine.Substring(2, 8)) * Math.Pow(10, double.Parse(n_FileLine.Substring(11, 3)));
                        n_FileHead.Ion_Beta[1] = double.Parse(n_FileLine.Substring(14, 8)) * Math.Pow(10, double.Parse(n_FileLine.Substring(23, 3)));
                        n_FileHead.Ion_Beta[2] = double.Parse(n_FileLine.Substring(26, 8)) * Math.Pow(10, double.Parse(n_FileLine.Substring(35, 3)));
                        n_FileHead.Ion_Beta[3] = double.Parse(n_FileLine.Substring(38, 8)) * Math.Pow(10, double.Parse(n_FileLine.Substring(47, 3)));
                        break;

                    case "DELTA-UTC: A0,A1,T,W":
                        n_FileHead.A0 = double.Parse(n_FileLine.Substring(3, 15)) * Math.Pow(10, double.Parse(n_FileLine.Substring(19, 3)));
                        n_FileHead.A1 = double.Parse(n_FileLine.Substring(22, 15)) * Math.Pow(10, double.Parse(n_FileLine.Substring(38, 3)));
                        n_FileHead.T  = int.Parse(n_FileLine.Substring(41, 9));
                        n_FileHead.W  = int.Parse(n_FileLine.Substring(50, 9));
                        break;

                    case "LEAP SECONDS":
                        n_FileHead.Leap_Seconds = int.Parse(n_FileLine.Substring(0, 6));
                        break;
                    } //swich
                    n_FileLine = n_FileReader.ReadLine();
                }     //while (n_FileLine != "END OF HEADER")
                N_FileSum.n_FileHeadSum = n_FileHead;//读出的值存入N_FileSum

                /**************************************读取数据文件********************************************/
                n_FileLine = n_FileReader.ReadLine();
                int i = 0;
                while (n_FileLine != null)
                {
                    switch (i)
                    {
                    case 0:
                        n_FileData.PRN          = int.Parse(n_FileLine.Substring(0, 2).Trim());
                        n_FileData.TOC.Year     = int.Parse(n_FileLine.Substring(3, 2)) + 2000;
                        n_FileData.TOC.Month    = int.Parse(n_FileLine.Substring(5, 3));
                        n_FileData.TOC.Day      = int.Parse(n_FileLine.Substring(8, 3));
                        n_FileData.TOC.Hour     = int.Parse(n_FileLine.Substring(11, 3));
                        n_FileData.TOC.Minute   = int.Parse(n_FileLine.Substring(14, 3));
                        n_FileData.TOC.Second   = double.Parse(n_FileLine.Substring(17, 5));
                        n_FileData.ClkBias      = double.Parse(n_FileLine.Substring(22, 15)) * Math.Pow(10, double.Parse(n_FileLine.Substring(38, 3)));
                        n_FileData.ClkDrift     = double.Parse(n_FileLine.Substring(41, 15)) * Math.Pow(10, double.Parse(n_FileLine.Substring(57, 3)));
                        n_FileData.ClkDriftRate = double.Parse(n_FileLine.Substring(60, 15)) * Math.Pow(10, double.Parse(n_FileLine.Substring(76, 3)));
                        break;

                    case 1:
                        n_FileData.IODE   = double.Parse(n_FileLine.Substring(3, 15)) * Math.Pow(10, double.Parse(n_FileLine.Substring(19, 3)));
                        n_FileData.Crs    = double.Parse(n_FileLine.Substring(22, 15)) * Math.Pow(10, double.Parse(n_FileLine.Substring(38, 3)));
                        n_FileData.DetlaN = double.Parse(n_FileLine.Substring(41, 15)) * Math.Pow(10, double.Parse(n_FileLine.Substring(57, 3)));
                        n_FileData.M0     = double.Parse(n_FileLine.Substring(60, 15)) * Math.Pow(10, double.Parse(n_FileLine.Substring(76, 3)));
                        break;

                    case 2:
                        n_FileData.Cuc   = double.Parse(n_FileLine.Substring(3, 15)) * Math.Pow(10, double.Parse(n_FileLine.Substring(19, 3)));
                        n_FileData.E     = double.Parse(n_FileLine.Substring(22, 15)) * Math.Pow(10, double.Parse(n_FileLine.Substring(38, 3)));
                        n_FileData.Cus   = double.Parse(n_FileLine.Substring(41, 15)) * Math.Pow(10, double.Parse(n_FileLine.Substring(57, 3)));
                        n_FileData.SqrtA = double.Parse(n_FileLine.Substring(60, 15)) * Math.Pow(10, double.Parse(n_FileLine.Substring(76, 3)));
                        break;

                    case 3:
                        n_FileData.TOE   = double.Parse(n_FileLine.Substring(3, 15)) * Math.Pow(10, double.Parse(n_FileLine.Substring(19, 3)));
                        n_FileData.Cic   = double.Parse(n_FileLine.Substring(22, 15)) * Math.Pow(10, double.Parse(n_FileLine.Substring(38, 3)));
                        n_FileData.Omega = double.Parse(n_FileLine.Substring(41, 15)) * Math.Pow(10, double.Parse(n_FileLine.Substring(57, 3)));
                        n_FileData.Cis   = double.Parse(n_FileLine.Substring(60, 15)) * Math.Pow(10, double.Parse(n_FileLine.Substring(76, 3)));
                        break;

                    case 4:
                        n_FileData.I0       = double.Parse(n_FileLine.Substring(3, 15)) * Math.Pow(10, double.Parse(n_FileLine.Substring(19, 3)));
                        n_FileData.Crc      = double.Parse(n_FileLine.Substring(22, 15)) * Math.Pow(10, double.Parse(n_FileLine.Substring(38, 3)));
                        n_FileData.OmegaLow = double.Parse(n_FileLine.Substring(41, 15)) * Math.Pow(10, double.Parse(n_FileLine.Substring(57, 3)));
                        n_FileData.OmegaDot = double.Parse(n_FileLine.Substring(60, 15)) * Math.Pow(10, double.Parse(n_FileLine.Substring(76, 3)));
                        break;

                    case 5:
                        n_FileData.IDot             = double.Parse(n_FileLine.Substring(3, 15)) * Math.Pow(10, double.Parse(n_FileLine.Substring(19, 3)));
                        n_FileData.CodesOnL2Channel = double.Parse(n_FileLine.Substring(22, 15)) * Math.Pow(10, double.Parse(n_FileLine.Substring(38, 3)));
                        n_FileData.GPSWeek          = double.Parse(n_FileLine.Substring(41, 15)) * Math.Pow(10, double.Parse(n_FileLine.Substring(57, 3)));
                        n_FileData.L2PDataFlag      = double.Parse(n_FileLine.Substring(60, 15)) * Math.Pow(10, double.Parse(n_FileLine.Substring(76, 3)));
                        break;

                    case 6:
                        n_FileData.SVAccuracy = double.Parse(n_FileLine.Substring(3, 15)) * Math.Pow(10, double.Parse(n_FileLine.Substring(19, 3)));
                        n_FileData.SVHealth   = double.Parse(n_FileLine.Substring(22, 15)) * Math.Pow(10, double.Parse(n_FileLine.Substring(38, 3)));
                        n_FileData.TGD        = double.Parse(n_FileLine.Substring(41, 15)) * Math.Pow(10, double.Parse(n_FileLine.Substring(57, 3)));
                        n_FileData.IODC       = double.Parse(n_FileLine.Substring(60, 15)) * Math.Pow(10, double.Parse(n_FileLine.Substring(76, 3)));
                        break;

                    case 7:
                        n_FileData.TransTimeOfMsg = double.Parse(n_FileLine.Substring(3, 15)) * Math.Pow(10, double.Parse(n_FileLine.Substring(19, 3)));
                        //n_FileData.Spare1 = double.Parse(n_FileLine.Substring(22, 15)) * Math.Pow(10, double.Parse(n_FileLine.Substring(38, 3)));//有的文件没有这个数据,会报错。
                        break;
                    }//switch (i)
                    i = i + 1;
                    i = i % 8;
                    if (i == 0)
                    {
                        N_FileSum.n_FileDataSum.Add(n_FileData);//读出的值存入N_FileSum
                        n_FileData = new N_FileData();
                    }
                    n_FileLine = n_FileReader.ReadLine();
                } //while (n_FileLine != null)
            }     //while (n_FileLine != null)
            return(true);
        }