1. 导航电文格式解读

C01 2021 12 01 00 00 00-0.392390531488E-03 0.396518373691E-10 0.000000000000E+00
0.100000000000E+01 0.923312500000E+03-0.175864468318E-08 0.562177079103E-01
0.299839302897E-04 0.664370250888E-03 0.300258398056E-05 0.649344501495E+04
0.259200000000E+06-0.103842467070E-06-0.306687686883E+01-0.428408384323E-07
0.803862571188E-01-0.865156250000E+02-0.697794080599E+00 0.264403870625E-08
-0.402159608705E-09 0.160000000000E+02 0.830000000000E+03 0.000000000000E+00
0.200000000000E+01 0.000000000000E+00-0.560000000000E-08-0.104000000000E-07
0.259200000000E+06 0.000000000000E+00

名称 对应数值
卫星系统 C
卫星编号(PRN) 01
BDT时间的年 2021
月、日、时、分、秒 12 01 00 00 00
卫星时钟偏差钟差(S) -0.392390531488E-03
卫星时钟漂移(S/S) 0.396518373691E-10
卫星时钟漂移率(S/$S^2$) 0.000000000000E+00
名称 对应数值
星历数据的有效龄期 0.100000000000E+01
Crs轨道半径正弦改正项 0.923312500000E+03
△n平均运动修正量 -0.175864468318E-08
$M_0$ toe时的平近点角 0.562177079103E-01
名称 对应数值
Cuc 纬度幅角余弦改正项 0.299839302897E-04
e 卫星轨道偏心率 0.664370250888E-03
Cus 纬度幅角正弦改正项 0.300258398056E-05
$\sqrt A$ 轨道长半径平根 0.649344501495E+04
名称 对应数值
toe 星历的基准时间 0.259200000000E+06
Cic 轨道倾角余弦调和项 -0.103842467070E-06
Ω 升交点赤经 -0.306687686883E+01
Cis 轨道倾角正弦项 -0.428408384323E-07
名称 对应数值
I 轨道倾角 0.803862571188E-01
Crc 轨道半径余弦调和项 -0.865156250000E+02
ω 近地点角距 -0.697794080599E+00
$Ω_{dot}$ 升交点赤经变率 0.264403870625E-08
名称 对应数值
$I_{dot}$ 轨道倾角变化率 -0.402159608705E-09
L2 0.160000000000E+02
GPS星期数(TOE) 0.830000000000E+03
L2P数据标志 0.000000000000E+00
名称 对应数值
卫星精度(m) 0.200000000000E+01
卫星健康(MSB) 0.000000000000E+00
TGD单频机延迟改正数 -0.560000000000E-08
IODC时钟数据有效期 -0.104000000000E-07
名称 对应数值
电文发送时间 0.259200000000E+06
拟合区间(h) 0.000000000000E+00

2. 代码部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
public class Read {
public List<SatelliteData> ReadB(String fileName) {
//BDT起始时间 2006年1月1日0时0分0秒 星期日
Long time0Sec = dateToSec(2006, 1, 1, 0, 0, 0);
List<SatelliteData> SatelliteDataList = null;
try {
SatelliteDataList = ReadN(new File("..\\Data\\21b\\" +"tarc"+fileName+"0.21b"));
} catch (IOException e) {
System.out.println("文件读取错误");
}
//StringBuilder resultOutput = new StringBuilder();
for (SatelliteData satelliteData : SatelliteDataList) {
Long timeSec = dateToSec(satelliteData.year, satelliteData.month, satelliteData.day, satelliteData.hour, satelliteData.min, satelliteData.sec);
//求toc 时钟时间 周内时间
Long toc = ((timeSec - time0Sec) / 1000) % (604800);
//由于 BDS和 GPS的时间系统不统一,需要把归化时间减去14s来纳入 GPS时
Long t0 = toc-14;
Double dt = satelliteData.clockDeviation + satelliteData.clockDrift * (t0 - toc) + satelliteData.clockDriftRate * Math.pow((t0 - toc), 2);
Double t = t0 - dt;
//LocalDateTime time = LocalDateTime.of(satelliteData.year, satelliteData.month, satelliteData.day, satelliteData.hour, satelliteData.min, satelliteData.sec);
/*String resultData = */calculateLocation(satelliteData, t);
//String result = "时间" + time + "\n" + resultData + "\n";
//System.out.print(result);
//resultOutput.append(result);
}
//String output=resultOutput.toString();
//File outFile = new File("..\\Result\\" + filename + ".txt");
//FileWriter fileWriter = new FileWriter(outFile, true);
//BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
//bufferedWriter.write(output);
//bufferedWriter.flush();
//fileWriter.close();
//bufferedWriter.close();
return SatelliteDataList;
}

public static List<SatelliteData> ReadN(File file) throws IOException {
//打开导航电文文件 windows文件地址手动输 复制会产生空格
BufferedReader br = new BufferedReader(new FileReader(file));
//头文件结束的标志
int header = 0;
//初始化读取行数
int row = 1;
int i = 0;
List<SatelliteData> satelliteDataList = new ArrayList<>();
String line;
while ((line = br.readLine()) != null) {
if (line.equals("")){
break;
}
if (header == 1) {
switch (row) {
case 1:
SatelliteData satelliteData = new SatelliteData();
satelliteDataList.add(satelliteData);
SatelliteData satelliteData1 = satelliteDataList.get(i);
satelliteData1.PRN = Integer.parseInt(line.substring(1, 3));
satelliteData1.year = Integer.parseInt(line.substring(4, 8));
satelliteData1.month = Integer.parseInt(line.substring(9, 11));
satelliteData1.day = Integer.parseInt(line.substring(12, 14));
satelliteData1.hour = Integer.parseInt(line.substring(15, 17));
satelliteData1.min = Integer.parseInt(line.substring(18, 20));
satelliteData1.sec = Integer.parseInt(line.substring(21, 23));
satelliteData1.clockDeviation = Double.parseDouble(line.substring(23, 42).trim());
satelliteData1.clockDrift = Double.parseDouble(line.substring(42, 61).trim());
satelliteData1.clockDriftRate = Double.parseDouble(line.substring(61, 80).trim());
row++;
break;
case (2):
SatelliteData satelliteData2 = satelliteDataList.get(i);
satelliteData2.effectiveAge = Double.parseDouble(line.substring(4, 23).trim());
satelliteData2.Crs = Double.parseDouble(line.substring(23, 42).trim());
satelliteData2.delta_n = Double.parseDouble(line.substring(42, 61).trim());
satelliteData2.M0 = Double.parseDouble(line.substring(61, 80).trim());
row++;
break;
case (3):
SatelliteData satelliteData3 = satelliteDataList.get(i);
satelliteData3.Cuc = Double.parseDouble(line.substring(4, 23).trim());
satelliteData3.e = Double.parseDouble(line.substring(23, 42).trim());
satelliteData3.Cus = Double.parseDouble(line.substring(42, 61).trim());
satelliteData3.sqrt_a = Double.parseDouble(line.substring(61, 80).trim());
row++;
break;
case (4):
SatelliteData satelliteData4 = satelliteDataList.get(i);
satelliteData4.toe = Double.parseDouble(line.substring(4, 23).trim());
satelliteData4.Cic = Double.parseDouble(line.substring(23, 42).trim());
satelliteData4.OMG0 = Double.parseDouble(line.substring(42, 61).trim());
satelliteData4.Cis = Double.parseDouble(line.substring(61, 80).trim());
row++;
break;
case (5):
SatelliteData satelliteData5 = satelliteDataList.get(i);
satelliteData5.I = Double.parseDouble(line.substring(4, 23).trim());
satelliteData5.Crc = Double.parseDouble(line.substring(23, 42).trim());
satelliteData5.omg = Double.parseDouble(line.substring(42, 61).trim());
satelliteData5.OMG0_DOT = Double.parseDouble(line.substring(61, 80).trim());
row++;
break;
case (6):
SatelliteData satelliteData6 = satelliteDataList.get(i);
satelliteData6.I_dot = Double.parseDouble(line.substring(4, 23).trim());
row++;
break;
case (7):
row++;
break;
case (8):
i++;
row = 1;
break;
}
}
if (line.contains("END OF HEADER")) {
header = 1;
}
}
br.close();
return satelliteDataList;
}

public static Long dateToSec(int year, int month, int day, int hour, int min, int sec) {
LocalDateTime time = LocalDateTime.of(year, month, day, hour, min, sec);
java.util.Date dtTime = java.util.Date.from(time.atZone(ZoneId.systemDefault()).toInstant());
return dtTime.getTime();
}

public static String calculateLocation(SatelliteData satelliteData, Double t) {


//长半径
double A = Math.pow(satelliteData.sqrt_a, 2);
//地球重力常数
double constGM = 3.986004418e14;
//平均角速度
double n0 = Math.sqrt(constGM / Math.pow(A, 3));
double n = n0 + satelliteData.delta_n;
//计算归化时间
double tk = t - satelliteData.toe;
//平近点角
double Mk = satelliteData.M0 + n * tk;
//偏近点角
double Ek0 = 0;
double Ek1 = Mk;
while (Math.abs(Ek1 - Ek0) > 10e-12) {
Ek0 = Ek1;
Ek1 = Mk + satelliteData.e * Math.sin(Ek0);
}
double Ek = Ek0;
//真近点角 纬度幅角参数
double vk = Math.atan(Math.sqrt(1-Math.pow(satelliteData.e,2))*Math.sin(Ek)/(Math.cos(Ek)-satelliteData.e));
//vk=2*Math.atan((Math.sqrt((1+satelliteData.e)/(1-satelliteData.e))*tan(Ek/2)));
//升交角距
//vk=2*Math.atan((Math.sqrt((1+satelliteData.e)/(1-satelliteData.e))*Math.tan(Ek/2))); //\\
double phi_k = vk + satelliteData.omg;
//扰动改正
double delta_uk = satelliteData.Cuc * Math.cos(2 * phi_k) + satelliteData.Cus * Math.sin(2 * phi_k);
double delta_rk = satelliteData.Crc * Math.cos(2 * phi_k) + satelliteData.Crs * Math.sin(2 * phi_k);
double delta_ik = satelliteData.Cic * Math.cos(2 * phi_k) + satelliteData.Cis * Math.sin(2 * phi_k);
//赤经 半径 轨道倾角改正
double uk = phi_k + delta_uk;
double rk = A * (1 - satelliteData.e * Math.cos(Ek)) + delta_rk;
double ik = satelliteData.I + satelliteData.I_dot*tk+delta_ik;
//卫星在轨道上的位置
double xk = rk * Math.cos(uk);
double yk = rk * Math.sin(uk);
//地球自转角速度
double OMGe = 7.292115e-5;
//PRN>5 的为MEO/IGSO 卫星在 CGCS2000坐标系中的坐标
if (satelliteData.PRN > 5) {
//历元t升交点的赤赤经
double OMGk = satelliteData.OMG0 + (satelliteData.OMG0_DOT - OMGe) * tk - OMGe * satelliteData.toe;
//卫星在地心地固坐标系中的位置
double x_E = xk * Math.cos(OMGk) - yk * Math.cos(ik) * Math.sin(OMGk);
double y_E = xk * Math.sin(OMGk) + yk * Math.cos(ik) * Math.cos(OMGk);
double z_E = yk * Math.sin(ik);
satelliteData.X = x_E;
satelliteData.Y = y_E;
satelliteData.Z = z_E;
} else {
//历元t升交点的赤经
double OMGk = satelliteData.OMG0 + satelliteData.OMG0_DOT * tk - OMGe * satelliteData.toe;
//计算 GEO 卫星在自定义坐标系系中的坐标
double x_E = xk * Math.cos(OMGk) - yk * Math.cos(ik) * Math.sin(OMGk);
double y_E = xk * Math.sin(OMGk) + yk * Math.cos(ik) * Math.cos(OMGk);
double z_E = yk * Math.sin(ik);
//计算 GEO卫星在CGCS2000坐标系中的坐标
double v = Math.toRadians(-5);
double[][] rx = {{1, 0, 0}, {0, Math.cos(v), Math.sin(v)}, {0, -Math.sin(v), Math.cos(v)}};
double[][] rz = {{Math.cos(OMGe * tk), Math.sin(OMGe * tk), 0}, {-Math.sin(OMGe * tk), Math.cos(OMGe * tk), 0}, {0, 0, 1}};
double[][] location = {{x_E}, {y_E}, {z_E}};
double[][] d1 = MatrixMultiply(rz, rx);
double[][] d = MatrixMultiply(d1, location);
satelliteData.X = d[0][0] ;
satelliteData.Y = d[1][0];
satelliteData.Z = d[2][0];
}
return "卫星:" + satelliteData.PRN + /*",长半径:" + A + ",平均角速度:" + n0
+ ",\n偏近点角:" + Ek + ",真近点角" + vk + ",升交角距:" + phi_k
+ ",\n改正赤经:" + uk + ",改正半径:" + rk + ",改正轨道倾角:" + ik
+ ",\n卫星在轨道上的位置(" + xk + "," + yk + "),赤纬:" + lambda
+ */",\n卫星在地心地固坐标系中的位置:(" + satelliteData.X + "," + satelliteData.Y + "," + satelliteData.Z + ")\n";
}

public static double[][] MatrixMultiply(double[][] m1,double[][] m2){
if(m1==null||m2==null||m1[0].length!=m2.length) {
return null;
}

double[][] m=new double[m1.length][m2[0].length];
for(int i=0;i<m1.length;++i){
for(int j=0;j<m2[0].length;++j){
for (int k=0;k<m1[i].length;++k){
m[i][j]+=m1[i][k]*m2[k][j];
}
}
}

return m;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public class ReadSp3 {
public List<SatelliteData> ReadSp3(String fileName) {
List<SatelliteData> satelliteDataSP3List = null;
try {
satelliteDataSP3List = ReadSP3(new File("..\\Data\\SP3\\" +"GBM0MGXRAP_2021"+fileName+"0000_01D_05M_ORB.SP3"));
} catch (IOException e) {
System.out.println("读取错误");
}
//for (SatelliteData satelliteDataSP3 : satelliteDataSP3List) {
// LocalDateTime time = LocalDateTime.of(satelliteDataSP3.year, satelliteDataSP3.month, satelliteDataSP3.day, satelliteDataSP3.hour, satelliteDataSP3.min, satelliteDataSP3.sec);
// System.out.println(time);
// System.out.println("卫星:" + satelliteDataSP3.PRN +
// ",\n卫星在地心地固坐标系中的位置:(" + satelliteDataSP3.X + "," + satelliteDataSP3.Y + "," + satelliteDataSP3.Z + ")\n");
//}
return satelliteDataSP3List;

}

public static List<SatelliteData> ReadSP3(File file) throws IOException {
List<SatelliteData> satelliteDataSP3List = new ArrayList<>();
BufferedReader br = new BufferedReader(new FileReader(file));
SatelliteData satelliteData = new SatelliteData();
String line;
while ((line = br.readLine()) != null) {
if (line.charAt(0) == '*') {
satelliteData.year = Integer.parseInt(line.substring(3, 7));
satelliteData.month = Integer.parseInt(line.substring(8, 10).trim());
satelliteData.day = Integer.parseInt(line.substring(11, 13).trim());
satelliteData.hour = Integer.parseInt(line.substring(14, 16).trim());
satelliteData.min = Integer.parseInt(line.substring(17, 19).trim());
satelliteData.sec = Integer.parseInt(line.substring(20, 22).trim());
}
if (line.substring(0, 2).equals("PC")) {
SatelliteData satelliteDataSP3 = new SatelliteData();
satelliteDataSP3.setYear(satelliteData.year);
satelliteDataSP3.setMonth(satelliteData.month);
satelliteDataSP3.setDay(satelliteData.day);
satelliteDataSP3.setHour(satelliteData.hour);
satelliteDataSP3.setMin(satelliteData.min);
satelliteDataSP3.setSec(satelliteData.sec);
satelliteDataSP3.PRN = Integer.parseInt(line.substring(2, 4));
satelliteDataSP3.X = Double.parseDouble(line.substring(5, 18).trim())*1000;
satelliteDataSP3.Y = Double.parseDouble(line.substring(19, 32).trim())*1000;
satelliteDataSP3.Z = Double.parseDouble(line.substring(33, 46).trim())*1000;
satelliteDataSP3List.add(satelliteDataSP3);
}
}
return satelliteDataSP3List;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
public class SatelliteData {
Integer PRN;//卫星的PRN码
//卫星时间
Integer year;
Integer month;
Integer day;
Integer hour;
Integer min;
Integer sec;
//卫星时钟参数
Double clockDeviation;//卫星时钟偏差钟差
Double clockDrift;//卫星时钟漂移
Double clockDriftRate;//卫星时钟漂移率

Double effectiveAge;//星历数据的有效龄期
Double Crs;// 轨道半径正弦改正项
Double delta_n;//平均运动修正量
Double M0;//toe 时的平近点角

Double Cuc;//纬度幅角余弦改正项
Double e;//卫星轨道偏心率
Double Cus;//纬度幅角正弦改正项
Double sqrt_a;//轨道长半径平根

Double toe;//星历的基准时间
Double Cic;//轨道倾角余弦调和项
Double OMG0;//升交点赤经
Double Cis;//轨道倾角正弦项

Double I;//轨道倾角
Double Crc;//轨道半径余弦调和项
Double omg;//近地点角距
Double OMG0_DOT;//升交点赤经变率

Double I_dot;//轨道倾角变化率

@Override
public String toString() {
return "SatelliteData{" +
"PRN=" + PRN +
", year=" + year +
", month=" + month +
", day=" + day +
", hour=" + hour +
", min=" + min +
", sec=" + sec +
", clockDeviation=" + clockDeviation +
", clockDrift=" + clockDrift +
", clockDriftRate=" + clockDriftRate +
", effectiveAge=" + effectiveAge +
", Crs=" + Crs +
", delta_n=" + delta_n +
", M0=" + M0 +
", Cuc=" + Cuc +
", e=" + e +
", Cus=" + Cus +
", sqrt_a=" + sqrt_a +
", toe=" + toe +
", Cic=" + Cic +
", OMG0=" + OMG0 +
", Cis=" + Cis +
", I=" + I +
", Crc=" + Crc +
", omg=" + omg +
", OMG0_DOT=" + OMG0_DOT +
", I_dot=" + I_dot +
", X=" + X +
", Y=" + Y +
", Z=" + Z +
'}';
}

Double X;
Double Y;
Double Z;

Double dx;
Double dy;
Double dz;


public Double getX() {
return X;
}

public void setX(Double x) {
X = x;
}

public Double getY() {
return Y;
}

public void setY(Double y) {
Y = y;
}

public Double getZ() {
return Z;
}

public void setZ(Double z) {
Z = z;
}

public int getPRN() {
return PRN;
}

public void setPRN(int PRN) {
this.PRN = PRN;
}

public Integer getYear() {
return year;
}

public void setYear(Integer year) {
this.year = year;
}

public Integer getMonth() {
return month;
}

public void setMonth(Integer month) {
this.month = month;
}

public Integer getDay() {
return day;
}

public void setDay(Integer day) {
this.day = day;
}

public Integer getHour() {
return hour;
}

public void setHour(Integer hour) {
this.hour = hour;
}

public Integer getMin() {
return min;
}

public void setMin(Integer min) {
this.min = min;
}

public Integer getSec() {
return sec;
}

public void setSec(Integer sec) {
this.sec = sec;
}

public Double getClockDeviation() {
return clockDeviation;
}

public void setClockDeviation(Double clockDeviation) {
this.clockDeviation = clockDeviation;
}

public Double getClockDrift() {
return clockDrift;
}

public void setClockDrift(Double clockDrift) {
this.clockDrift = clockDrift;
}

public Double getClockDriftRate() {
return clockDriftRate;
}

public void setClockDriftRate(Double clockDriftRate) {
this.clockDriftRate = clockDriftRate;
}

public Double getEffectiveAge() {
return effectiveAge;
}

public void setEffectiveAge(Double effectiveAge) {
this.effectiveAge = effectiveAge;
}

public Double getCrs() {
return Crs;
}

public void setCrs(Double crs) {
Crs = crs;
}

public Double getDelta_n() {
return delta_n;
}

public void setDelta_n(Double delta_n) {
this.delta_n = delta_n;
}

public Double getM0() {
return M0;
}

public void setM0(Double m0) {
M0 = m0;
}

public Double getCuc() {
return Cuc;
}

public void setCuc(Double cuc) {
Cuc = cuc;
}

public Double getE() {
return e;
}

public void setE(Double e) {
this.e = e;
}

public Double getCus() {
return Cus;
}

public void setCus(Double cus) {
Cus = cus;
}

public Double getSqrt_a() {
return sqrt_a;
}

public void setSqrt_a(Double sqrt_a) {
this.sqrt_a = sqrt_a;
}

public Double getToe() {
return toe;
}

public void setToe(Double toe) {
this.toe = toe;
}

public Double getCic() {
return Cic;
}

public void setCic(Double cic) {
Cic = cic;
}

public Double getOMG0() {
return OMG0;
}

public void setOMG0(Double OMG0) {
this.OMG0 = OMG0;
}

public Double getCis() {
return Cis;
}

public void setCis(Double cis) {
Cis = cis;
}

public Double getI() {
return I;
}

public void setI(Double i) {
I = i;
}

public Double getCrc() {
return Crc;
}

public void setCrc(Double crc) {
Crc = crc;
}

public Double getOmg() {
return omg;
}

public void setOmg(Double omg) {
this.omg = omg;
}

public Double getOMG0_DOT() {
return OMG0_DOT;
}

public void setOMG0_DOT(Double OMG0_DOT) {
this.OMG0_DOT = OMG0_DOT;
}

public Double getI_dot() {
return I_dot;
}

public void setI_dot(Double i_dot) {
I_dot = i_dot;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
public class Demo {
public static void main(String[] args) throws IOException {
Read read = new Read();
ReadSp3 readSp3 = new ReadSp3();
int[] a=new int[61];
int b=0;
int c=0;
int n=0;
double dx=0;
double dy=0;
double dz=0;
double rx=0;
double ry=0;
double rz=0;
double RMS=0;
StringBuilder resultOutput = new StringBuilder();
for (int i = 335; i < 335+31; i++) {
List<SatelliteData> satelliteDataList = read.ReadB(String.valueOf(i));
List<SatelliteData> satelliteDataSP3List = readSp3.ReadSp3(String.valueOf(i));
for (SatelliteData satelliteData:satelliteDataList){
LocalDateTime time = LocalDateTime.of(satelliteData.year, satelliteData.month, satelliteData.day, satelliteData.hour, satelliteData.min, satelliteData.sec);
for (SatelliteData satelliteDataSP3:satelliteDataSP3List){
LocalDateTime timeSP3 = LocalDateTime.of(satelliteDataSP3.year, satelliteDataSP3.month, satelliteDataSP3.day, satelliteDataSP3.hour, satelliteDataSP3.min, satelliteDataSP3.sec);
if (time.isEqual(timeSP3)&& satelliteData.PRN.equals(satelliteDataSP3.PRN)){
double X=satelliteData.X-satelliteDataSP3.X;
double Y=satelliteData.Y-satelliteDataSP3.Y;
double Z=satelliteData.Z-satelliteDataSP3.Z;
double D=Math.sqrt(X*X+Y*Y+Z*Z);
c++;
//if (Math.abs(X) > 10 || Math.abs(Y) > 10|| Math.abs(Z) > 10){
if (Math.abs(X) < 10 && Math.abs(Y) < 10 && Math.abs(Z) < 10&&(satelliteData.PRN==22)) {
System.out.println(satelliteData.PRN + "," + satelliteData.day + " " + satelliteData.hour + "," + X + "," + Y + "," + Z+","+D);
dx+=X;
dy+=Y;
dz+=Z;
rx+=X*X;
ry+=Y*Y;
rz+=Z*Z;
//System.out.println(X+" "+Y+" "+Z);
resultOutput.append(satelliteData.PRN + "," + ((satelliteData.day-1)*24+ satelliteData.hour) + "," + X + "," + Y + "," + Z +","+D +"\n");
//resultOutput.append(satelliteData.PRN + "," +satelliteData.day+ ","+ satelliteData.hour+ "," + X + "," + Y + "," + Z +","+D +"\n");
a[satelliteData.PRN]++;
n+=X*X+Y*Y+Z*Z;
b++;
}
}
}
}
}
System.out.println("dx均值为"+dx/b);
System.out.println("dxRMS为"+Math.sqrt(rx/b));
System.out.println("dy均值为"+dy/b);
System.out.println("dyRMS为"+Math.sqrt(ry/b));
System.out.println("dz均值为"+dz/b);
System.out.println("dzRMS为"+Math.sqrt(rz/b));
System.out.println(Math.sqrt(n/b));
String output = resultOutput.toString();
//File file = new File("..\\Result\\所有卫星小时误差小于10.txt");
//FileWriter fileWriter = new FileWriter(file, true);
//BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
//bufferedWriter.write(output);
//bufferedWriter.flush();
//fileWriter.close();
//bufferedWriter.close();
}
}