根据北⽃⼴播星历计算卫星位置的⼩程序Java版本
RINEXVERSION3.04
package location;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import flect.Array;
import flect.Constructor;
DateFormat;
FieldPosition;
ParsePosition;
import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.ListIterator;
import java.util.Stack;
import Matcher;
import Pattern;
public class location {
public static String calculateLocation(String satellite,double sqrt_a,double delta_n,double t,double toe,double M0,double e,double omg,double Cuc,double Cus,do //长半径
double a=Math.pow(sqrt_a, 2);
//地球重⼒常数
double constGM=3.9860047e14;
//平均⾓速度
double n0=Math.sqrt(constGM/Math.pow(a, 3));
double n=n0+delta_n;
//平近点⾓
Double tk=t-toe;
double Mk=M0+n*(t-toe);
//偏近点⾓
double Ek0=0;
double Ek1=Mk;
while(Math.abs(Ek1-Ek0)>10e-12) {
Ek0=Ek1;
Ek1=Mk+e*Math.sin(Ek0);
}
double Ek=Ek0;
//真近点⾓
double vk=Math.acos((s(Ek)-e)/(s(Ek)));
//升交⾓距
double uk=vk+omg;
//扰动改正
double delta_uk=s(2*uk)+Cus*Math.sin(2*uk);
double delta_rk=s(2*uk)+Crs*Math.sin(2*uk);
double delta_ik=s(2*uk)+Cis*Math.sin(2*uk);
/
/⾚经半径轨道倾⾓改正
double u=uk+delta_uk;
double r=a*(s(Ek))+delta_rk;
double i=i0+delta_ik;
double i=i0+delta_ik;
//卫星在轨道上的位置
double x=s(u);
double y=r*Math.sin(u);
//地球⾃转⾓速度
double omge=7.292115e-5;
//历元t升交点的⾚纬
double lambda=OMG0+(OMG0_DOT*omge)*tk-omge*toe;
//卫星在地⼼地固坐标系中的位置
double x_E=r*(s(u)*s(lambda)-Math.sin(u)*s(i)*Math.sin(lambda)); double y_E=r*(s(u)*Math.sin(lambda)+Math.sin(u)*s(i)*s(lambda)); double z_E=r*(Math.sin(u)*Math.sin(i));
return "卫星:"+satellite+",长半径:"+a+",平均⾓速度:"+n0
+",\n偏近点⾓:"+Ek+",真近点⾓"+vk+",升交⾓据:"+uk
+",\n改正⾚经:"+u+",改正半径:"+r+",改正轨道倾⾓:"+i
+",\n卫星在轨道上的位置("+x+","+y+"),⾚纬:"+lambda
+",\n卫星在地⼼地固坐标系中的位置:("+x_E+","+y_E+","+z_E+")\n\n";
}
public static void main(String[] args) throws FileNotFoundException,IOException {
//打开导航电⽂⽂件 windows⽂件地址⼿动输复制会产⽣空格
File file=new File("D:\\gnss\\");
//字符流
BufferedReader br=new BufferedReader(new FileReader(file));
String line=null;
StringBuffer navMsg=new StringBuffer();
while((adLine())!=null) {
//System.out.println(line);
navMsg.append(line+"\n");
}
//类型转换 StringBuffer->String
String String();
br.close();
//处理格式问题
//将字符串拆分为单个字符数组
String[] arrayChar=navStr.split("");
// for(String i:arrayChar) {
// System.out.print(i+",");
// }
ArrayList<String> al=new ArrayList<String>();
for(String element:arrayChar) {
al.add(element);
/
/ System.out.print(element+",");
}
ListIterator<String> iter=al.listIterator();
//格式修改
while(iter.hasNext()) {
String ();
// System.out.print(ele);
if(ele.equals("-")) {
//后移
<();
//后移
String ();
//判断负号后第⼆位是否为"."
if(after1.equals(".")) {
//前移
iter.previous();
//前移
iter.previous();
//前移
iter.previous();
有趣的java小程序//替换
iter.set(" -");
}
}
}
}
String[] toarray=(String[])al.toArray(new String[0]);
StringBuffer sb=new StringBuffer();
for(String element:toarray) {
sb.append(element);
// System.out.print(element);
}
String String();
/
/拆分字符串,⽣成数组,数组中的每⼀个字符串代表卫星的⼀个数据组
String[] arrayGroup=newNavStr.split(" ");
StringBuffer sb_output=new StringBuffer();
//头尾去掉
for(int i=2;i<arrayGroup.length-1;i++) {
String[] arrayElement=arrayGroup[i].split(" ");
// for(String j:arrayElement) {
// System.out.print(j+",");
// }
//数据龄期
String satellite=arrayElement[0].split("\n")[1];
Double IODE=Double.parseDouble(arrayElement[14]);
//Crs
Double Crs=Double.parseDouble(arrayElement[15]);
//⾓速度改正数
Double delta_n=Double.parseDouble(arrayElement[16]);
//参考时刻的平近点⾓
Double M0=Double.parseDouble(arrayElement[17]);
//Cuc
Double Cuc=Double.parseDouble(arrayElement[22]);
//偏⼼率
Double e=Double.parseDouble(arrayElement[23]);
/
/Cus
Double Cus=Double.parseDouble(arrayElement[24]);
//长半轴的开⽅
Double sqrt_a=Double.parseDouble(arrayElement[25]);
//toe
Double toe=Double.parseDouble(arrayElement[30]);
//Cic
Double Cic=Double.parseDouble(arrayElement[31]);
//参考时刻的升交点⾚经
Double OMG0=Double.parseDouble(arrayElement[32]);
//Cis
Double Cis=Double.parseDouble(arrayElement[33]);
//参考时刻的轨道倾⾓
Double i0=Double.parseDouble(arrayElement[38]);
//Crc
Double Crc=Double.parseDouble(arrayElement[39]);
//参考时刻的近地点⾓距
Double omg=Double.parseDouble(arrayElement[40]);
//升交点⾚经变化率
Double OMG0_DOT=Double.parseDouble(arrayElement[41]);
//轨道倾⾓变化率
Double IDOT=Double.parseDouble(arrayElement[46]);
/
/toc 时钟时间的周内秒
Integer year=Integer.parseInt(arrayElement[1]);
Integer month=Integer.parseInt(arrayElement[2]);
Integer date=Integer.parseInt(arrayElement[3]);
Integer hour=Integer.parseInt(arrayElement[4]);
Integer minu=Integer.parseInt(arrayElement[5]);
Integer sec=Integer.parseInt(arrayElement[6]);
LocalDateTime time=LocalDateTime.of(year, month, date, hour, minu, sec); Date dtTime=Date.from(time.atZone(ZoneId.systemDefault()).toInstant()); Long Time();
//BDT起始时间 2006年1⽉1⽇0时0分0秒星期⽇
LocalDateTime time0=LocalDateTime.of(2006,1,1,0,0,0);
Date dtTime0=Date.from(time0.atZone(ZoneId.systemDefault()).toInstant());
Date dtTime0=Date.from(time0.atZone(ZoneId.systemDefault()).toInstant());
Long Time();
//求toc 时钟时间
Long toc=((timeSec-time0Sec)/1000)%(604800);
//钟差参数 a0,a1,a2
Double a0=Double.parseDouble(arrayElement[7]);
Double a1=Double.parseDouble(arrayElement[8]);
Double a2=Double.parseDouble(arrayElement[9]);
//设置观测时间为每分钟的第13秒
Long t0=toc+13;
LocalDateTime time_ob=LocalDateTime.of(year, month, date, hour, minu, sec+13);
Double dt=a0+a1*(t0-toc)+a2*Math.pow((t0-toc), 2);
Double t=t0-dt;
System.out.print("观测时间:"+time_ob+"\n");
System.out.print(calculateLocation(satellite,sqrt_a,delta_n,t,toe,M0,e,omg,Cuc,Cus,Crc,Crs,Cic,Cis,i0,OMG0,OMG0_DOT));
sb_output.append("观测时间:"+time_ob+"\n"+calculateLocation(satellite,sqrt_a,delta_n,t,toe,M0,e,omg,Cuc,Cus,Crc,Crs,Cic,Cis,i0,OMG0,OMG0_DOT)); }
String outputStr=String();
//向⽂件中写⼊计算结果
File outFile=new File("D:\\gnss\\");
FileWriter write=new FileWriter(outFile,true);
BufferedWriter rt=new BufferedWriter(write);
rt.write(outputStr);
rt.flush();
write.close();
rt.close();
}
}
适⽤于 RINEX 3.04格式,⽐较早的格式可能⽆法运⾏。(格式的原因导致我最终⽆法解算⽼师给的古早星历⽂件,写了个阉割版交上去
了,⼼塞。)
放出来交流,如有错误,欢迎指正。
(感觉可以结合Cesium做个⼩程序玩玩。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论