/// <summary> /// 读取头文件。 /// </summary> /// <param name="fileName">文件路径</param> /// <returns></returns> private static AntennaHeader ReadHeader(string fileName) { using (StreamReader sr = new StreamReader(fileName)) { AntennaHeader header = new AntennaHeader(); //Read one line from file string line = sr.ReadLine(); //Get label. remove trailing and leading blanks string label = line.Substring(60).Trim(); while (label != AntexLabel.END_OF_HEADER) { switch (label) { case AntexLabel.ANTEX_VERSION_SYST: header.Version = Convert.ToDouble(line.Substring(0, 8)); char sys = line[20]; header.SatelliteSystem = (SatelliteSystem)Enum.Parse(typeof(SatelliteSystem), sys.ToString()); break; //Process PCV type line case AntexLabel.PCV_TYPE_REFANT: ParsePcvType(header, line); break; case AntexLabel.COMMENT: header.Comments.Add(line.Substring(0, 60).Trim()); break; default: break; } line = sr.ReadLine(); label = line.Substring(60).Trim(); } return(header); } }
/// <summary> /// 解析PCV /// </summary> /// <param name="header"></param> /// <param name="line"></param> private static void ParsePcvType(AntennaHeader header, string line) { char pcvt = line[0]; switch (pcvt) { case 'A': header.PcvType = PcvType.Absolute; break; case 'R': header.PcvType = PcvType.Relative; header.ReferenceAntena = line.Substring(20, 20).Trim(); if (header.ReferenceAntena == "") { header.ReferenceAntena = "AOAD/M_T"; //default } header.ReferenceAntenaSerial = line.Substring(40, 20).Trim(); break; default: throw new Exception("天线头部的 PCV 类型无效."); } }
/// <summary> /// 解析一个天线段。 /// Fill most Antenna satData /// </summary> /// <param name="firstLine"></param> /// <param name="sr"></param> /// <param name="header"></param> /// <returns></returns> private static Antenna ParseAntenna(string firstLine, StreamReader sr, AntennaHeader header) { //These flags take care of "Valid From" and "Valid Until" bool validFromPresent = false; bool validUntilPresent = false; //Create 'Antenna' object to be returned Antenna antenna = CreateAntenna(firstLine); antenna.Header = header; //Read the rest of satData string line; //Read one line from file line = sr.ReadLine(); string label = line.Substring(60).Trim(); // Repeat until 'endOfAntenna' line while (label != AntexLabel.END_OF_ANTENNA) { //Process 'calibrationMehtod' line switch (label) { case AntexLabel.METH_BY_DATE: antenna.CalibrationMethod = (line.Substring(0, 20).Trim()); antenna.Agency = line.Substring(20, 20).Trim(); antenna.NumOfAntennas = line.Substring(40, 6).Trim(); antenna.Date = line.Substring(50, 10).Trim(); break; case AntexLabel.DAZI: antenna.DeltaAzimuth = (Convert.ToDouble(line.Substring(2, 6).Trim())); break; case AntexLabel.ZEN1_ZEN2_DZEN: antenna.ZenithStart = (Convert.ToDouble(line.Substring(2, 6).Trim())); antenna.ZenithEnd = (Convert.ToDouble(line.Substring(8, 6).Trim())); antenna.DeltaZenith = (Convert.ToDouble(line.Substring(14, 6).Trim())); break; case AntexLabel.NUM_OF_FREQUENCIES: antenna.NumOfFrequencies = (Convert.ToInt32(line.Substring(0, 6).Trim())); break; case AntexLabel.VALID_FROM: Time valFrom = Time.Parse(line.Substring(0, 43)); antenna.ValidDateFrom = (valFrom); validFromPresent = true;// Mark that we found "Valid From" break; case AntexLabel.VALID_UNTIL: // Get validity as Year, Month, Day, Hour, Min, Sec Time valUntil = Time.Parse(line.Substring(0, 43)); antenna.ValidDateUntil = (valUntil); // Mark that we found "Valid Until" validUntilPresent = true; break; case AntexLabel.SINEX_CODE: //Get antenna Sinex Code antenna.SinexCode = line.Substring(0, 10).Trim(); break; case AntexLabel.COMMENT: antenna.AddComment(line.Substring(0, 60).Trim()); break; case AntexLabel.START_OF_FREQUENCY: //Get frequency indicator label = ParseFrequency(sr, antenna, line); break; case AntexLabel.START_OF_FREQ_RMS: //Get frequency indicator label = ParseFrequencyRms(sr, antenna, ref line); break; default: break; } //Read another line from file line = sr.ReadLine(); //Get current label label = line.Substring(60).Trim(); } //Take care of "Valid From" field if it was not present if (!validFromPresent) { //Set as "DayTime: BEGINNING_OF_TIME" antenna.ValidDateFrom = (Time.MinValue); } if (!validUntilPresent) { antenna.ValidDateUntil = (Time.MaxValue); } return(antenna); }