Unity3D 广播星历与精密星历

article/2025/10/12 10:06:15

通过广播星历文件计算过卫星的轨迹并与精密星历作比较,计算残差并绘图,具体效果参看下图。
在这里插入图片描述

// 全局变量
public static class SystemConstant
{public static double omegae = 7.2921151467e-5;  //地球自转角速度public static double mu = 3.986005e14; //地球引力常数
}//精密星历Reader
using System;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
public class PrecisionEphemerisReader 
{public PrecisionEphemerisReader(int headline=22){FileHeadLine = headline;}private int FileHeadLine;/// <summary>/// 加载精密星历文件/// </summary>public PrecisionEphemerisFile LoadPrecisionEphemerisFile(string Path){PrecisionEphemerisFile PrecisionEphemerisFile = new PrecisionEphemerisFile();using (StreamReader reader = File.OpenText(Path)){//加载文件头{PrecisionEphemerisFile.FileHead.Clear(); //清空数据for (int i = 0; i < FileHeadLine; i++){PrecisionEphemerisFile.FileHead.Add(reader.ReadLine());}while (true){string value = reader.ReadLine();if (value != "EOF"){PrecisionEphemerisModle modle = new PrecisionEphemerisModle();modle.TimeStamp = ResloveTimeStamp(value);// Debug.Log(ResloveTimeStamp(value).ToString());for (int i = 0; i < 32; i++){SatelliteInfo info = ResolveSatelliteInfo(reader.ReadLine());modle.SatelliteInfos.Add(info);// Debug.Log(info.LogSatelliteInfo()); }PrecisionEphemerisFile.Modles.Add(modle);}else{break;}}return PrecisionEphemerisFile;}}/// <summary>/// 解析时间戳/// </summary>/// <param name="info"></param>/// <returns></returns>private DateTime ResloveTimeStamp(string info){string[] infos = info.Split(new string[] {" "}, StringSplitOptions.RemoveEmptyEntries);int year = int.Parse(infos[1]);int mouth = int.Parse(infos[2]);int day = int.Parse(infos[3]);int hour = int.Parse(infos[4]);int minnute = int.Parse(infos[5]);//Int32 seconds=Int32.Parse(infos[6]);;return new DateTime(year, mouth, day, hour, minnute, 0);}/// <summary>/// 解析卫星信息/// </summary>/// <param name="info"></param>/// <returns></returns>private SatelliteInfo ResolveSatelliteInfo(string info){string[] infos = info.Split(new string[] {" "}, StringSplitOptions.RemoveEmptyEntries);if (infos.Length == 9){SatelliteInfo m_SatelliteInfo=new SatelliteInfo();m_SatelliteInfo.SatelliteID = infos[0];m_SatelliteInfo.X_Coordinate =double.Parse(infos[1])*1000;m_SatelliteInfo.Y_Coordinate =double.Parse(infos[2])*1000;m_SatelliteInfo.Z_Coordinate =double.Parse(infos[3])*1000;m_SatelliteInfo.Clock_Microsec =double.Parse(infos[4]);m_SatelliteInfo.X_sdev =int.Parse(infos[5]);m_SatelliteInfo.Y_sdev =int.Parse(infos[6]);m_SatelliteInfo.Z_sdev =int.Parse(infos[7]);m_SatelliteInfo.C_sdev = int.Parse(infos[8]);return m_SatelliteInfo;} if(infos.Length == 5){SatelliteInfo m_SatelliteInfo=new SatelliteInfo();m_SatelliteInfo.SatelliteID = infos[0];m_SatelliteInfo.X_Coordinate =double.Parse(infos[1])*1000;m_SatelliteInfo.Y_Coordinate =double.Parse(infos[2])*1000;m_SatelliteInfo.Z_Coordinate =double.Parse(infos[3])*1000;m_SatelliteInfo.Clock_Microsec =double.Parse(infos[4]);return m_SatelliteInfo;}return new SatelliteInfo();}
}public class PrecisionEphemerisFile
{public List<string> FileHead = new List<string>();public List<PrecisionEphemerisModle> Modles = new List<PrecisionEphemerisModle>();/// <summary>/// 返回头文件的字符串/// </summary>/// <returns></returns>public string FileHeadInfo(){if (FileHead.Count > 0){string temp = String.Empty;foreach (var item in FileHead){temp = temp + item + "\r\n";}return temp;}else{return "没有文件头信息";}}public string ContentInfo(){if (Modles.Count>0){string temp = string.Empty;foreach (var item in Modles){temp = temp + item.TimeStamp + "\r\n";temp = temp + item.LogInfos() + "\r\n";}return temp;}else{return "数据为空";}}
}public class PrecisionEphemerisModle
{public DateTime TimeStamp = new DateTime();public List<SatelliteInfo> SatelliteInfos = new List<SatelliteInfo>();public string LogInfos(){string temp=String.Empty;foreach (var item in SatelliteInfos){temp = temp + item.LogSatelliteInfo()+"\r\n";}return temp;}
}public class SatelliteInfo
{public string SatelliteID=String.Empty;public double X_Coordinate;public double Y_Coordinate;public double Z_Coordinate;public double Clock_Microsec;public int X_sdev;public int Y_sdev;public int Z_sdev;public int C_sdev;public string LogSatelliteInfo(){if (SatelliteID != String.Empty){return String.Format("卫星ID:{0}; X坐标:{1},Y坐标:{2}, Z坐标:{3}, Clock_Microsec:{4},X_sdev:{5},Y_sdev:{6},Z_sdev:{7},C_sdev:{8} ",SatelliteID,X_Coordinate,Y_Coordinate,Z_Coordinate,Clock_Microsec,X_sdev,Y_sdev,Z_sdev,C_sdev);}return "卫星信息为空";}
}//广播星历Reader
using System;
using System.Collections.Generic;
using System.IO;
using UnityEngine;public class BroadcastEphemerisReader 
{public BroadcastEphemerisReader(int fileHeadLine=8){FileHeadLine = fileHeadLine;}private int FileHeadLine ;public BroadcaseEphemerisFile LoadBroadcastEphemerisFile( string Path){BroadcaseEphemerisFile m_BroadcaseEphemerisFile=new BroadcaseEphemerisFile();using (StreamReader reader = File.OpenText(Path)){//读文件头for (int i = 0; i < FileHeadLine; i++){string temp = reader.ReadLine();m_BroadcaseEphemerisFile.FileHead.Add(temp);}int lineNum = 8;while (true){string temp01=reader.ReadLine();if (temp01!=null){lineNum += 8;/** 处理第一行数据*///雷达编号BroadcaseEphemerisModle modle=new BroadcaseEphemerisModle();modle.SatelliteID = int.Parse(temp01.Substring(0, 2));//时间戳string[] infos = temp01.Substring(2,20).Split(new string[] {" "}, StringSplitOptions.RemoveEmptyEntries);modle.TimeStamp=new DateTime(int.Parse(infos[0])+2000,int.Parse(infos[1]),int.Parse(infos[2]),int.Parse(infos[3]),int.Parse(infos[4]),(int)float.Parse(infos[5]));//卫星时钟的偏移  毫秒modle.卫星时钟的偏移=Double.Parse(temp01.Substring(22, 19));//卫星时钟的漂移modle.卫星时钟的漂移=Double.Parse(temp01.Substring(41, 19));//卫星时钟的漂移速度modle.卫星时钟的漂移速度=Double.Parse(temp01.Substring(60, 19));/** 处理第二行数据*/string temp02= reader.ReadLine();modle.IODE = Double.Parse(temp02.Substring(3, 19));modle.Crs = Double.Parse(temp02.Substring(22, 19));modle.Delta_R = Double.Parse(temp02.Substring(41, 19));modle.Mo = Double.Parse(temp02.Substring(60, 19));/** 处理第三行数据*/string temp03= reader.ReadLine();modle.Cuc=Double.Parse(temp03.Substring(3, 19));modle.e = Double.Parse(temp03.Substring(22, 19));modle.Cus=Double.Parse(temp03.Substring(41, 19));modle.根号a=Double.Parse(temp03.Substring(60, 19));/** 处理第四行数据*/string temp04= reader.ReadLine();modle.Toe=Double.Parse(temp04.Substring(3, 19));modle.Cic= Double.Parse(temp04.Substring(22, 19));modle.OUo=Double.Parse(temp04.Substring(41, 19));modle.Cis=Double.Parse(temp04.Substring(60, 19));/** 处理第五行数据*/string temp05= reader.ReadLine();modle.I0=Double.Parse(temp05.Substring(3, 19));modle.Crc= Double.Parse(temp05.Substring(22, 19));modle.w=Double.Parse(temp05.Substring(41, 19));modle.OU=Double.Parse(temp05.Substring(60, 19));/** 处理第六行数据*/string temp06= reader.ReadLine();modle.I=Double.Parse(temp06.Substring(3, 19));modle.L2上的码= Double.Parse(temp06.Substring(22, 19));modle.GPS周数=Double.Parse(temp06.Substring(41, 19));modle.L2码数据标记=Double.Parse(temp06.Substring(60, 19));/** 处理第七行数据*/string temp07= reader.ReadLine();modle.卫星精度=Double.Parse(temp07.Substring(3, 19));modle.卫星健康= Double.Parse(temp07.Substring(22, 19));modle.Tgd=Double.Parse(temp07.Substring(41, 19));modle.IODC=Double.Parse(temp07.Substring(60, 19));/** 处理第八行数据*/string temp08= reader.ReadLine();modle.电文发送时刻=Double.Parse(temp08.Substring(3, 19));modle.拟合区间= Double.Parse(temp08.Substring(22, 19));modle.Unuse01=Double.Parse(temp08.Substring(41, 19));modle.Unuse02=Double.Parse(temp08.Substring(60, 19));// Debug.Log(modle.LogBroadcaseEphemerisModle());m_BroadcaseEphemerisFile.modles.Add(modle);}else{break;}}return m_BroadcaseEphemerisFile;}}
}public class BroadcaseEphemerisFile
{public List<string> FileHead=new List<string>();public List<BroadcaseEphemerisModle> modles=new List<BroadcaseEphemerisModle>();//public public string LogFileHead(){if (FileHead.Count > 0){string temp=String.Empty;foreach (var item in FileHead){temp = temp + item + "\r\n";}return temp;}return "文件头为空";}
}public class BroadcaseEphemerisModle
{public string LogBroadcaseEphemerisModle(){return String.Format("卫星编号:{0},时间戳:{1},卫星时钟的偏移:{2},卫星时钟的漂移:{3},卫星时钟的漂移速度:{4},IODE:{5},Crs:{6},Delta_R:{7}," +"Mo:{8},Cuc:{9}, e:{10}, Cus:{11}, 根号a:{12}, Toe:{13}, Cic:{14}, OUo:{15}, Cis:{16}, I0:{17}, Crc:{18}, w:{19}, OU:{20}, I:{21}, L2上的码:{22}, GPS周数:{23}, L2码数据标记:{24}," +"卫星精度:{25}, 卫星健康:{26}, Tgd:{27}, IODC:{28}, 电文发送时刻:{29}, 拟合区间:{30}, Unuse01:{31}, Unuse02:{32}" , SatelliteID,TimeStamp,卫星时钟的偏移,卫星时钟的漂移,卫星时钟的漂移速度,IODE,Crs,Delta_R,Mo,Cuc,e,Cus,根号a,Toe,Cic,OUo,Cis,I0,Crc,w,OU,I,L2上的码,GPS周数,L2码数据标记,卫星精度,卫星健康,Tgd,IODC,电文发送时刻,拟合区间,Unuse01,Unuse02);}public int SatelliteID;public DateTime TimeStamp;public double 卫星时钟的偏移;public double 卫星时钟的漂移;public double 卫星时钟的漂移速度;public double IODE;public double Crs;public double Delta_R;public double Mo;public double Cuc;public double e;public double Cus;public double 根号a;public double Toe;public double Cic;public double OUo;public double Cis;public double I0;public double Crc;public double w;public double OU;public double I;public double L2上的码;public double GPS周数;public double L2码数据标记;public double 卫星精度;public double 卫星健康;public double Tgd;public double IODC;public double 电文发送时刻;public double 拟合区间;public double Unuse01;public double Unuse02;
}//主程序
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using UnityEngine;
using UnityEngine.UI;
using XCharts;
using Application = UnityEngine.Application;
using Button = UnityEngine.UI.Button;public class RootMsg : MonoBehaviour
{private int ID = 1;private static Text m_text;private LineChart PrecisionEphemerisChart;private LineChart BroadcaseEphemerisChart;private LineChart ResidualChart;private Dropdown SateliteID;private Button Btn_PrecisionImg;private Button Btn_BroadcaseImg;private Button Btn_ResidualImg;private string bPath=String.Empty;private string pPath=String.Empty;public PrecisionEphemerisFile m_PrecisionEphemerisFile=new PrecisionEphemerisFile();public BroadcaseEphemerisFile m_BroadcaseEphemerisFile=new BroadcaseEphemerisFile();//private string bPath=@"D:\Users\30721\Desktop\广播星历源码及PPT-曹勃杨\广播星历源码及PPT-曹勃杨\brdc0010.20n";//private string pPath=@"D:\Users\30721\Desktop\广播星历源码及PPT-曹勃杨\广播星历源码及PPT-曹勃杨\igs20863.sp3";private List<double> PrecisionEphemerisPos_X=new List<double>();private List<double> PrecisionEphemerisPos_Y=new List<double>();private List<double> PrecisionEphemerisPos_Z=new List<double>();private List<double> BroadcaseEphemerisPos_X=new List<double>();private List<double> BroadcaseEphemerisPos_Y=new List<double>();private List<double> BroadcaseEphemerisPos_Z=new List<double>();private List<double> ResidualPos_X = new List<double>();private List<double> ResidualPos_Y=new List<double>();private List<double> ResidualPos_Z=new List<double>();/// <summary>/// 获取广播星历文件路径/// </summary>public void GetBroadcastEphemerPath(){bPath=String.Empty;OpenFileDialog dialog = new OpenFileDialog();dialog.InitialDirectory = "D:\\";  if (dialog.ShowDialog() == DialogResult.OK){bPath = dialog.FileName;LogInfo(String.Format("广播星历文件路径:{0}",bPath));}}/// <summary>/// 获取精密星历文件路径/// </summary>public void GetPrecisionEphemerPath(){pPath=String.Empty;OpenFileDialog dialog = new OpenFileDialog();dialog.InitialDirectory = "D:\\";  if (dialog.ShowDialog() == DialogResult.OK){pPath = dialog.FileName;LogInfo(String.Format("精密星历文件路径:{0}",pPath));}}/// <summary>/// 加载星历/// </summary>public void LoadFile(){if (bPath != String.Empty && pPath != String.Empty){m_PrecisionEphemerisFile= new PrecisionEphemerisReader().LoadPrecisionEphemerisFile(pPath);m_BroadcaseEphemerisFile=new BroadcastEphemerisReader().LoadBroadcastEphemerisFile(bPath);LogInfo(string.Format("精密星历加载文件{0}组,广播星历加载文件{1}组",m_PrecisionEphemerisFile.Modles.Count,m_BroadcaseEphemerisFile.modles.Count));}else{LogInfo("需要先选择星历路径");}}/// <summary>/// 绘制精密星历图像/// </summary>public void PrecisionEphemerisImage(){PrecisionEphemerisChart.gameObject.SetActive(true);BroadcaseEphemerisChart.gameObject.SetActive(false);ResidualChart.gameObject.SetActive(false);PrecisionEphemerisChart.title.text = string.Format("{0}号卫星精密星历图", ID);for (int i = 0; i < 24; i++){PrecisionEphemerisChart.UpdateData("X", i, (float) PrecisionEphemerisPos_X[i]);PrecisionEphemerisChart.UpdateData("Y", i, (float) PrecisionEphemerisPos_Y[i]);PrecisionEphemerisChart.UpdateData("Z", i, (float) PrecisionEphemerisPos_Z[i]);}}/// <summary>/// 绘制广播星历图像/// </summary>public void BroadcaseEphemerisImage(){PrecisionEphemerisChart.gameObject.SetActive(false);BroadcaseEphemerisChart.gameObject.SetActive(true);ResidualChart.gameObject.SetActive(false);BroadcaseEphemerisChart.title.text = string.Format("{0}号卫星广播星历图", ID);for (int i = 0; i < 24; i++){BroadcaseEphemerisChart.UpdateData("X", i, (float) BroadcaseEphemerisPos_X[i]);BroadcaseEphemerisChart.UpdateData("Y", i, (float) BroadcaseEphemerisPos_Y[i]);BroadcaseEphemerisChart.UpdateData("Z", i, (float) BroadcaseEphemerisPos_Z[i]);}}/// <summary>/// 绘制残差图像/// </summary>public void ResidualImage(){   PrecisionEphemerisChart.gameObject.SetActive(false);BroadcaseEphemerisChart.gameObject.SetActive(false);ResidualChart.gameObject.SetActive(true);ResidualChart.title.text = string.Format("{0}号卫星残差图", ID);for (int i = 0; i < 7; i++){ResidualChart.UpdateData("X", i, (float) ResidualPos_X[i]);ResidualChart.UpdateData("Y", i, (float) ResidualPos_Y[i]);ResidualChart.UpdateData("Z", i, (float) ResidualPos_Z[i]);}}/// <summary>/// 选择卫星ID/// </summary>public void SelectSatelite(){ID = int.Parse(SateliteID.captionText.text);LogInfo("卫星编号:"+ID);}/// <summary>/// 数据处理/// </summary>public void CalculateDraw(){if (m_BroadcaseEphemerisFile.FileHead.Count == 0){LogInfo("请先加载文件");return;}ProcessPrecisionEphemeris();ProcessBroadcaseEphemeris();ProvessResidualEphemeris();Btn_BroadcaseImg.interactable = true;Btn_PrecisionImg.interactable = true;Btn_ResidualImg.interactable = true;}/// <summary>/// 处理精密星历数据/// </summary>private void ProcessPrecisionEphemeris(){List<PrecisionEphemerisModle> temp=new List<PrecisionEphemerisModle>();for (int i = 0; i < 24; i++){temp.Add(m_PrecisionEphemerisFile.Modles[i*4]);}List<double> result_X=new List<double>();List<double> result_Y=new List<double>();List<double> result_Z=new List<double>();foreach (var item in temp){result_X.Add(item.SatelliteInfos[ID-1].X_Coordinate);result_Y.Add(item.SatelliteInfos[ID-1].Y_Coordinate);result_Z.Add(item.SatelliteInfos[ID-1].Z_Coordinate);}PrecisionEphemerisPos_X = result_X;PrecisionEphemerisPos_Y = result_Y;PrecisionEphemerisPos_Z = result_Z;}/// <summary>/// 处理广播星历数据/// </summary>private void ProcessBroadcaseEphemeris(){List<BroadcaseEphemerisModle> modles =m_BroadcaseEphemerisFile.modles.FindAll((modle => modle.SatelliteID == ID));CalculatePos(modles);}private void  CalculatePos(List<BroadcaseEphemerisModle> modles){List<double> result_X=new List<double>();List<double> result_Y=new List<double>();List<double> result_Z=new List<double>();for (int i = 0; i < 24; i++){DateTime time=new DateTime(modles[0].TimeStamp.Year,modles[0].TimeStamp.Month,modles[0].TimeStamp.Day,i,0,0);BroadcaseEphemerisModle modle = modles[0];TimeSpan span = time - modles[0].TimeStamp;double second = Math.Abs(span.TotalSeconds);foreach (var item in modles){TimeSpan span01 = time - item.TimeStamp;double second01 = Math.Abs(span01.TotalSeconds);if (second > second01){modle = item;second = second01;}}//Debug.LogFormat("最接近{0}的时刻是{1}",time,modle.TimeStamp);//卫星的平均角速度double tk = (time - modle.TimeStamp).TotalSeconds;double A = Math.Pow(modle.根号a, 2);double n0=Math.Sqrt(SystemConstant.mu/Math.Pow(A,3));double n = n0 + modle.Delta_R * tk; //平近点角(迭代法)double Mk = modle.Mo + n * tk;if (Mk < 0){Mk += 2 * Math.PI;}if (Mk > 2 * Math.PI){Mk -= 2 * Math.PI;}//偏近点角double Eold = Mk;double Enew = Mk+modle.e*Math.Sin(Eold);int j = 1;while (Math.Abs(Enew-Eold)>1e-8){Eold = Enew;Enew = Mk+modle.e*Math.Sin(Eold);j += 1;if (j > 10){break;}}double EK = Enew;// 真近点角double cosNuk=(Math.Cos(EK)-modle.e)/(1-modle.e*Math.Cos(EK));double sinNuk = (Math.Sqrt(1 - Math.Pow(modle.e, 2))*Math.Sin(EK))/(1-modle.e*Math.Cos(EK));double NK = Math.Atan(sinNuk / cosNuk);//结局真近点角象限不同出现的取值异常情况if (cosNuk < 0){NK += Math.PI;}//升交点角距double PK = NK + modle.w;double deltauk = modle.Cus * Math.Sin(2 * PK) + modle.Cuc * Math.Cos(2 * PK);double deltark = modle.Crs * Math.Sin(2 * PK) + modle.Crc * Math.Cos(2 * PK);double deltaik = modle.Cis * Math.Sin(2 * PK) + modle.Cic * Math.Cos(2 * PK);//摄动改正后升交点角距、卫星矢径长度、轨道倾角double uk = PK + deltauk;double rk = A * (1 - modle.e * Math.Cos(EK)) + deltark;double ik = modle.I0 + modle.I * tk + deltaik;//极坐标转化为直角坐标double x1k = rk * Math.Cos(uk);double y1k= rk * Math.Sin(uk);//升交点赤经double omegak = modle.OUo + (modle.OU - SystemConstant.omegae) * tk - SystemConstant.omegae * modle.Toe;//最终WGS84坐标double x = x1k * Math.Cos(omegak) - y1k * Math.Cos(ik) * Math.Sin(omegak);double y = x1k * Math.Sin(omegak) + y1k * Math.Cos(ik) * Math.Cos(omegak);double z = y1k * Math.Sin(ik);result_X.Add(x);result_Y.Add(y);result_Z.Add(z);}BroadcaseEphemerisPos_X = result_X;BroadcaseEphemerisPos_Y = result_Y;BroadcaseEphemerisPos_Z = result_Z;}/// <summary>/// 处理残差数据/// </summary>private void ProvessResidualEphemeris(){ResidualPos_X.Clear();ResidualPos_Y.Clear();ResidualPos_Z.Clear();for (int i = 0; i < 14; i+=2){ResidualPos_X.Add(PrecisionEphemerisPos_X[i] - BroadcaseEphemerisPos_X[i]);ResidualPos_Y.Add(PrecisionEphemerisPos_Y[i] - BroadcaseEphemerisPos_Y[i]);ResidualPos_Z.Add(PrecisionEphemerisPos_Z[i] - BroadcaseEphemerisPos_Z[i]);}}/// <summary>/// 清空数据/// </summary>public void ClearData(){PrecisionEphemerisPos_X.Clear();PrecisionEphemerisPos_X.Clear();PrecisionEphemerisPos_X.Clear();PrecisionEphemerisPos_X.Clear();PrecisionEphemerisPos_X.Clear();PrecisionEphemerisPos_X.Clear();PrecisionEphemerisPos_X.Clear();PrecisionEphemerisPos_X.Clear();PrecisionEphemerisPos_X.Clear();Btn_BroadcaseImg.interactable = false;Btn_PrecisionImg.interactable = false;Btn_ResidualImg.interactable = false;PrecisionEphemerisChart.gameObject.SetActive(false);BroadcaseEphemerisChart.gameObject.SetActive(false);ResidualChart.gameObject.SetActive(false);}/// <summary>/// 程序退出/// </summary>public void QuitApp(){Application.Quit();}/// <summary>/// 程序开始/// </summary>void Start(){m_text = GameObject.Find("InfoTip").GetComponent<Text>();PrecisionEphemerisChart= GameObject.Find("PrecisionEphemerisChart").GetComponent<LineChart>();BroadcaseEphemerisChart= GameObject.Find("BroadcaseEphemerisChart").GetComponent<LineChart>();ResidualChart= GameObject.Find("ResidualChart").GetComponent<LineChart>();PrecisionEphemerisChart.gameObject.SetActive(false);BroadcaseEphemerisChart.gameObject.SetActive(false);ResidualChart.gameObject.SetActive(false);SateliteID = GameObject.Find("SatelliteID").GetComponent<Dropdown>();Btn_BroadcaseImg= GameObject.Find("广播星历图像").GetComponent<Button>();Btn_PrecisionImg= GameObject.Find("精密星历图像").GetComponent<Button>();Btn_ResidualImg= GameObject.Find("残差图").GetComponent<Button>();Btn_BroadcaseImg.interactable = false;Btn_PrecisionImg.interactable = false;Btn_ResidualImg.interactable = false;}/// <summary>/// log日志/// </summary>/// <param name="info"></param>public static void LogInfo(string info){m_text.text = info;}
}

http://chatgpt.dhexx.cn/article/qtWDfX0G.shtml

相关文章

精密星历介绍与使用

文章目录 精密星历精密星历下载精密星历格式简单解读 rtklib 精密星历应用插值处理Neville插值介绍 使用精密星历解算与广播星历的对比精密星历解算结果广播星历解算结果 精密星历 SP3精密星历格式&#xff0c;即The Extended Standard Product 3 Orbit Format. 精密星历下载…

北斗广播星历和精密星历的下载

下载广播星历的网址&#xff1a;https://cddis.nasa.gov/Data_and_Derived_Products/CDDIS_Archive_Access.html 该网址需要注册账号&#xff0c;登录该网址时最好关闭一些杀毒软件 2. 该网址中的brdc代表测站号 在下面这个地址中可以找到5种类型的广播星历 Earthdata Logi…

多系统精密星历下载与分析

概述 精密星历是由若干卫星跟踪站的观测数据&#xff0c;经事后处理算得的供卫星精密定位等使用的卫星轨道信息。 IGS精密星历采用sp3格式&#xff0c;其存储方式为ASCII文本文件&#xff0c;内容包括表头信息以及文件体&#xff0c;文件体中每隔15 min给出1个卫星的位置&…

2022年GPS广播星历精密星历如何下载

注意&#xff1a;&#xff01;&#xff01;网上现有很多教程的星历下载地址 ftp://cddis.gsfc.nasa.gov/已经访问不了了&#xff0c;最新的方法见下文&#xff0c;亲测有效~ 1、星历下载网址&#xff08;需要注册一下&#xff09;Earthdata Loginhttps://cddis.nasa.gov/archiv…

GPS广播星历和精密星历的下载

1.广播星历 1.1 广播星历下载路径 原路径&#xff1a;ftp://cddis.gsfc.nasa.gov/ 已经无法使用 新的下载路径如下&#xff1a;https://cddis.nasa.gov/archive/gnss/data/daily/2022/brdc/ 路径中的年份是2022年&#xff0c;可以根据需要进行设置不同年份。往下翻&#xff0…

Shader(GLSL)

GLSL语言编写&#xff0c;主要两类Vertex shader&#xff0c;Fragement shader Shader构造&#xff1a; 预处理 变量定义 通过输入参数和函数算法&#xff0c;计算输出结果&#xff08;main函数&#xff09; 预处理&#xff1a; 预处理的运算在编译时执行 只有一个#行的一行…

【Android -- 开源库】图片加载 Glide 的基本使用

一、简介 Glide 是一个快速高效的 Android 图片加载库&#xff0c;注重于平滑的滚动。 二、开始 1. 在 app/build.gradle 文件当中添加如下依赖&#xff1a; dependencies {compile com.github.bumptech.glide:glide:4.8.0; }2. 在 AndroidManifest.xml 添加网络权限&#…

Glide知识简介

首先Glide是Google为我们推荐的一个快速高效的图片加载库&#xff0c;使用简单。 第一步&#xff1a;添加依赖&#xff1a; //glide的依赖 implementation com.github.bumptech.glide:glide:4.9.0 annotationProcessor com.github.bumptech.glide:compiler:4.9.0 简单使用&…

OpenGL API - glDeleteShader

文章目录 名称原型参数描述错误 https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDeleteShader.xhtml OpenGL API - 笔记汇总 名称 glDeleteShader ---- 删除一个 shader 对象 原型 void glDeleteShader(GLuint shader);参数 shader 指定需要删除的 shader…

Android中的Glide

引入glide <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"androi…

android Glide介绍

目录 1.Glide的基本使用 1. 介绍 2. Glide占位符 2.Glide的进阶使用 1. 过渡动画 2. 变化 transform&#xff08;&#xff09; 3. Generated API 4. GlideExtension与GlideOption 1.Glide的基本使用 1. 介绍 Glide是一个快速高效的Android图片加载库&#xff0c;可以自…

Glide(二)Glide的with,load,into

Glide的with&#xff0c;load&#xff0c;into 在Glide的常规使用中&#xff0c;我们是这样使用的&#xff1a; protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ImageView imageView fin…

Glide学习

Glide框架学习 介绍with&#xff08;生命周期&#xff09;into缓存LRU缓存三级缓存为什么要有两种内存缓存加载顺序活动缓存为什么使用弱引用 介绍 常规方式&#xff1a;Glide.with(this).load(URL).into(imageView) 虽然with方法重载了很多个&#xff0c;我们可以传入不同的对…

Glide讲解

目录 Glide简介Glide的优点Glide的生命周期Glide如何实现图片缓存的内存缓存实现原理磁盘缓存实现原理引入缓存的目的Glide缓存流程从内存缓存读取总结从磁盘缓存读取总结写入磁盘缓存写入内存缓存汇总 Glide源码总结图解with&#xff08;&#xff09;load&#xff08;&#xf…

Glide详解

现在Android上的图片加载框架非常成熟&#xff0c;从最早的老牌图片加载框架UniversalImageLoader&#xff0c;到后来Google推出的Volley&#xff0c;再到后来的新兴军Glide和Picasso&#xff0c;当然还有Facebook的Fresco。每一个都非常稳定&#xff0c;功能也都十分强大。但是…

Android Glide

1.Glide Glide是Google主导的图片加载开源库。它有很多优势&#xff1a; ①使用简单&#xff0c;链式调用。 ②支持多种图片格式&#xff0c;如Gif、WebP、缩略图、Video等。 ③支持生命周期集成。Glide可以感知调用页面的生命周期&#xff0c;根据Activity或Fragment的生命…

[软件更新]gladder2.0.3.3

介绍 gladder是一个Firefox插件&#xff0c;名字被解释为Great Ladder (Ladder for Great Firewall)&#xff0c;目标是帮助人们跨过Great Firewall访问境外被查封的网站。 安装 https://addons.mozilla.org/en-US/firefox/addon/2864 (点击页面中的Install Now按钮) 功能 * 自…

飞机游戏代码(JAVA)

&#xff2d;yGameFrame类: 主要的调用类 package sc.wh.game;import javax.swing.JFrame; import java.awt.Color; import java.awt.Font; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; import sc.wh.game.*; import java.awt.event.KeyAdapte…

基于java的拼图经典游戏(附代码)

拼图游戏是一款经典的益智游戏&#xff0c;游戏开始前图片被随机打乱&#xff0c;空块位于最右下角&#xff0c;玩家通过点击空块周围图片或者按键方式对图片和空块进行相互交换&#xff0c;直到所有图片都回到原位即为游戏胜利。 本次制作的拼图游戏运行界面如下&#xff1a;…

java推箱子游戏源代码_java实现推箱子小游戏(附源码)

先上效果图 可以通过AWSD进行移动和推箱子 自己弄出来的代码玩起来还是很有意思的。 代码一共是三个.java文件,代码内容如下所示 package ss; import java.awt.Graphics; import java.awt.Image; import java.awt.Point; import java.awt.event.KeyEvent; import java.awt.eve…