因为有小伙伴想要那个元素星历数据(格式是.txt),我早已经删除了的,后面又找老师要了一份,数据链接放在评论区里面了!!
import java.io.*;
class WXXl {
static double u =3.986004418E14;
static double OMGe = 7.2921150E-5;
static double toe = 442800;
static double toc = 442800;
static double C =2.99792458E8;
static double F = (-2) * Math.sqrt(u) / (C * C);
static int horse = 115875;
static double tk = horse * 3600 - (689 * 7 * 24 * 3600 + toe);
public static void main(String[] args) throws IOException {
double[][] a = 读入参数(new File("整理过的星历路径,没有表头,直接就是要读取的数据"));
计算(a);
}
public static void 计算(double[][] XL)throws IOException {
for (int i = 0; i < XL.length; i++) {
double Xk=0,Xgk=0,Xk1=0,Yk=0,Ygk=0,Yk1=0,Zk=0,Zgk=0,Zk1=0;
for (int j = 0; j < XL[0].length; j++) {
double A = Math.pow(XL[i][0], 2);
double e = XL[i][1];
double i0 = XL[i][2];
double OMG0 = XL[i][3];
double w = XL[i][4];
double M0 = XL[i][5];
double DLTn = XL[i][6];
double OMG点 = XL[i][7];
double idot = XL[i][8];
double Crs = XL[i][9];
double Crc = XL[i][10];
double Cus = XL[i][11];
double Cuc = XL[i][12];
double Cis = XL[i][13];
double Cic = XL[i][14];
double a0 = XL[i][15];
double a1 = XL[i][16];
double n0 = Math.sqrt(u / (A * A * A));
double n = n0 + DLTn;
double Mk = M0 + n * tk;
double Ek = 0.0;
double delt=0.0;
int temp = 0, CS = 0;
//计算Ek
do {
delt=Ek;
Ek = Mk + e * Math.sin(delt);
} while (Ek-delt>=10E-12);
double vk=0;
double sinvk=Math.sqrt(1 - e * e) * Math.sin(Ek);
double cosvk=(Math.cos(Ek) - e);
if(sinvk > 0 && cosvk > 0) {
vk = Math.atan(sinvk/cosvk);
}
if(sinvk > 0 && cosvk < 0) {
vk = Math.PI+Math.atan(sinvk/cosvk);
System.out.println("2 "+vk);
}
if(sinvk < 0 && cosvk > 0){
vk = Math.PI*2+Math.atan(sinvk/cosvk);
System.out.println("3 "+vk);
}
if(sinvk < 0 && cosvk < 0) {
vk = Math.PI+Math.atan(sinvk/cosvk);
System.out.println("4 "+vk);
}
double ok = vk+ w;
double $uk = Cus * Math.sin(2 * ok) + Cuc * Math.cos(2 * ok);
double $rk = Crs * Math.sin(2 * ok) + Crc * Math.cos(2 * ok);
//以下都没有问题
double $ik = Cis * Math.sin(2 * ok) + Cic * Math.cos(2 * ok);
double uk = ok + $uk;
double rk = A * (1 - e * Math.cos(Ek)) + $rk;
//计算Z坐标的值
double ik = i0 + idot * tk + $ik;
double xk = rk * Math.cos(uk);
double yk = rk * Math.sin(uk);
System.out.println(Mk+"+++"+Ek+"&&&"+ok+"!!!"+$uk+"@@@"+$rk+"###"+$ik+"$$$"+uk+"%%%"+rk+"^^^"+ik+"&&&"+xk+"***"+yk);
//计算 MEO/IGSO 卫星在 CGCS2000 坐标系中的坐标
double OMGk1 = OMG0 + (OMG点 - OMGe) * ik - OMGe * toe;
System.out.println(OMG0+"!!!"+OMG点+"@@@"+OMGe+"###"+toe);
Xk = xk * Math.cos(OMGk1) - yk * Math.cos(ik) * Math.sin(OMGk1);
Yk = xk * Math.sin(OMGk1) + yk * Math.cos(ik) * Math.cos(OMGk1);
Zk = yk * Math.sin(ik);
//计算 GEO 卫星在自定义坐标系系中的坐标
double OMGk2 = OMG0 + OMG点 * ik - OMGe * toe;
Xgk = xk * Math.cos(OMGk2) - yk * Math.cos(ik) * Math.sin(OMGk2);
Ygk = xk * Math.sin(OMGk2) + yk * Math.cos(ik) * Math.cos(OMGk2);
Zgk = yk * Math.sin(ik);
System.out.println(OMGk1+"!!!"+OMGk2);
//计算 GEO 卫星在 CGCS2000 坐标系中的坐标
double x1 = -5 * 180 / Math.PI;
double x2 = OMGe * tk;
double[][] Rx = {{1, 0, 0}, {0, Math.cos(x1), Math.sin(x1)}, {0, -Math.sin(x1), Math.cos(x1)}};
double[][] Rz = {{Math.cos(x2), Math.sin(x2), 0}, {-Math.sin(x2), Math.cos(x2), 0}, {0, 0, 1}};
double[][] C = new double[3][3];
for (int i1 = 0; i1 < 3; i1++) {
for (int j1 = 0; j1 < 3; j1++) {
//矩阵A的行与矩阵B的列相乘求和(k的值与矩阵A的行与矩阵B的列相等)
for (int k = 0; k < 3; k++) {
C[i1][j1] += Rx[i1][k] * Rz[k][j1];
}
}
}
Xk1 = C[0][0] * Xgk + C[0][1] * Ygk + C[0][2] * Zgk;
Yk1 = C[1][0] * Xgk + C[1][1] * Ygk + C[1][2] * Zgk;
Zk1 = C[2][0] * Xgk + C[2][1] * Ygk + C[2][2] * Zgk;
}
FileWriter writer = null;
writer = new FileWriter("D:\\桌面\\坐标计算结果.txt", true);
writer.write("第"+(i+1)+"个星历"+"计算 MEO/IGSO 卫星在 CGCS2000 坐标系中" + "的坐标\n" + " X:" + Xk + " Y:" + Yk + " Z:" + Zk);
writer.write("\nGEO 卫星在自定义坐标系系中的坐标\n" + " X:" + Xgk + " Y:" + Ygk + " Z:" + Zgk);
writer.write("\n计算 GEO 卫星在 CGCS2000 坐标系中的坐标\n" + " X:" + Xk1 + " Y:" + Yk1 + " Z:" + Zk1+"\n\n");
writer.close();
System.out.println("第"+(i+1)+"个星历"+"计算 MEO/IGSO 卫星在 CGCS2000 坐标系中" + "的坐标\n" + " X:" + Xk + " Y:" + Yk + " Z:" + Zk);
System.out.println("\nGEO 卫星在自定义坐标系系中的坐标\n" + " X:" + Xgk + " Y:" + Ygk + " Z:" + Zgk);
System.out.println("\n计算 GEO 卫星在 CGCS2000 坐标系中的坐标\n" + " X:" + Xk1 + " Y:" + Yk1 + " Z:" + Zk1+"\n\n");
}
}
public static double[][] 读入参数(File q) throws IOException {
BufferedReader b = new BufferedReader(new FileReader(q));
StringBuffer buffer = new StringBuffer();//Stringbuffer是动态字符串数组,可以放很多字符串
String value;
int a = 0;//统计行数
do {
value = b.readLine();//循环一次就保存一行字符串(代表着一行像元值)
if (value == null)
break;
System.out.println("第" + (a + 1) + "行: " + value);
a++;//保存星历条数
buffer.append(value + "\t");//append()是往动态字符串添加新的字符串,每循环一次存一行,两行之间有换行符
} while (value != null);
System.out.println(buffer);
System.out.println("@@@@");
String[] temp = buffer.toString().split("\t");
//split()首先是一个分隔符,它会把字符串按照split(‘字符’)里的字符把字符串分割成数组,然后存给一个数组对象。
double[] number = new double[temp.length]; //temp里面的N个字符串代表各个参数
int C = temp.length / a;
System.out.println(q + ":有" + a + "条星历数据,每条数据有" + C + "个参数。" + C + "个像元。" + "\n");
for (int i = 0; i < temp.length; i++) {
number[i] = Double.parseDouble(temp[i]);//字符串数组转换成浮点型数组
}
double[][] D = new double[a][C];
for (int i = 0; i < temp.length; i += C) {
for (int j = i; j < i + C; j++) {
D[i / C][j - i] = number[j];
}
}
return D;
}
}
第1个星历计算得到MEO/IGSO星在CGCS2000坐标系中的坐标:
X:-3234407.4183885325 Y:1.8378662563519806E7 Z:2.073118954620255E7
GEO卫星在自定义坐标系系中的坐标:
X:-3234407.4183885325 Y:1.8378662563519806E7 Z:2.073118954620255E7
GEO卫星在CGCS2000坐标系中的坐标:
X:-3234407.4183885325 Y:-3628648.095331209 Z:-2.746616774551105E7
第2个星历计算得到MEO/IGSO星在CGCS2000坐标系中的坐标:
X:-1.0218648294802241E7 Y:2.5758875303283375E7 Z:-2999318.2048388044
GEO卫星在自定义坐标系系中的坐标:
X:-1.0218648294802241E7 Y:2.5758875303283375E7 Z:-2999318.2048388044
GEO卫星在CGCS2000坐标系中的坐标:
X:-1.0218648294802241E7 Y:-2.302566529907568E7 Z:-1.1930394130912926E7
第3个星历计算得到MEO/IGSO星在CGCS2000坐标系中的坐标:
X:-1.7337644531256896E7 Y:3670879.337492382 Z:2.155766863460922E7
GEO卫星在自定义坐标系系中的坐标:
X:-1.7337644531256896E7 Y:3670879.337492382 Z:2.155766863460922E7
GEO卫星在CGCS2000坐标系中的坐标:
X:-1.7337644531256896E7 Y:9022638.25227477 Z:-1.9919850176109023E7
第4个星历计算得到MEO/IGSO星在CGCS2000坐标系中的坐标:
X:1.3981480365047488E7 Y:2.2873935596407674E7 Z:7715052.2740825
GEO卫星在自定义坐标系系中的坐标:
X:1.3981480365047488E7 Y:2.2873935596407674E7 Z:7715052.2740825
GEO卫星在CGCS2000坐标系中的坐标:
X:1.3981480365047488E7 Y:-1.4638514962557398E7 Z:-1.919512544766027E7