Java读取星历excel数据并计算卫星坐标

   因为有小伙伴想要那个元素星历数据(格式是.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

你可能感兴趣的:(java,星历,excel,数据,计算,卫星坐标,读取)