1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.files.sp3;
18
19 import java.util.ArrayList;
20 import java.util.Collections;
21 import java.util.List;
22
23 import org.orekit.files.general.EphemerisFile;
24 import org.orekit.frames.Frame;
25 import org.orekit.time.AbsoluteDate;
26 import org.orekit.time.AggregatedClockModel;
27 import org.orekit.time.ClockModel;
28 import org.orekit.utils.CartesianDerivativesFilter;
29 import org.orekit.utils.TimeSpanMap;
30
31
32
33
34
35 public class SP3Ephemeris implements EphemerisFile.SatelliteEphemeris<SP3Coordinate, SP3Segment> {
36
37
38 private final String id;
39
40
41 private final double mu;
42
43
44 private final Frame frame;
45
46
47 private final int interpolationSamples;
48
49
50 private final CartesianDerivativesFilter filter;
51
52
53 private final List<SP3Segment> segments;
54
55
56
57
58
59
60
61
62
63 public SP3Ephemeris(final String id, final double mu, final Frame frame,
64 final int interpolationSamples, final CartesianDerivativesFilter filter) {
65 this.id = id;
66 this.mu = mu;
67 this.frame = frame;
68 this.interpolationSamples = interpolationSamples;
69 this.filter = filter;
70 this.segments = new ArrayList<>();
71 }
72
73
74 @Override
75 public String getId() {
76 return this.id;
77 }
78
79
80 @Override
81 public double getMu() {
82 return mu;
83 }
84
85
86 @Override
87 public List<SP3Segment> getSegments() {
88 return Collections.unmodifiableList(segments);
89 }
90
91
92 @Override
93 public AbsoluteDate getStart() {
94 return segments.isEmpty() ? null : segments.get(0).getStart();
95 }
96
97
98 @Override
99 public AbsoluteDate getStop() {
100 return segments.isEmpty() ? null : segments.get(segments.size() - 1).getStop();
101 }
102
103
104
105
106 public Frame getFrame() {
107 return frame;
108 }
109
110
111
112
113 public int getInterpolationSamples() {
114 return interpolationSamples;
115 }
116
117
118
119
120 public CartesianDerivativesFilter getAvailableDerivatives() {
121 return filter;
122 }
123
124
125
126
127
128 public void addCoordinate(final SP3Coordinate coord, final double maxGap) {
129 final AbsoluteDate lastDate = getStop();
130 final SP3Segment segment;
131 if (lastDate == null || coord.getDate().durationFrom(lastDate) > maxGap) {
132
133 segment = new SP3Segment(mu, frame, interpolationSamples, filter);
134 segments.add(segment);
135 } else {
136 segment = segments.get(segments.size() - 1);
137 }
138 segment.addCoordinate(coord);
139 }
140
141
142
143
144
145
146
147
148
149
150
151
152 public AggregatedClockModel extractClockModel() {
153
154 final TimeSpanMap<ClockModel> models = new TimeSpanMap<>(null);
155 segments.forEach(segment -> models.addValidBetween(segment.extractClockModel(),
156 segment.getStart(),
157 segment.getStop()));
158 return new AggregatedClockModel(models);
159 }
160
161 }