1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.frames;
18
19 import java.util.regex.Matcher;
20 import java.util.regex.Pattern;
21
22 import org.hipparchus.CalculusFieldElement;
23 import org.orekit.annotation.DefaultDataContext;
24 import org.orekit.data.DataContext;
25 import org.orekit.errors.OrekitException;
26 import org.orekit.errors.OrekitMessages;
27 import org.orekit.time.AbsoluteDate;
28 import org.orekit.time.FieldAbsoluteDate;
29 import org.orekit.time.TimeScale;
30
31
32
33
34
35
36
37 public enum ITRFVersion {
38
39
40 ITRF_2014(2014),
41
42
43 ITRF_2008(2008),
44
45
46 ITRF_2005(2005),
47
48
49 ITRF_2000(2000),
50
51
52 ITRF_1997(1997),
53
54
55 ITRF_1996(1996),
56
57
58 ITRF_1994(1994),
59
60
61 ITRF_1993(1993),
62
63
64 ITRF_1992(1992),
65
66
67 ITRF_1991(1991),
68
69
70 ITRF_1990(1990),
71
72
73 ITRF_1989(1989),
74
75
76 ITRF_1988(1988);
77
78
79 private static final Pattern PATTERN = Pattern.compile("[Ii][Tt][Rr][Ff][-_ ]?([0-9]{2,4})");
80
81
82 private final int year;
83
84
85 private final String name;
86
87
88
89
90 ITRFVersion(final int year) {
91 this.year = year;
92 this.name = "ITRF-" + year;
93 }
94
95
96
97
98 public int getYear() {
99 return year;
100 }
101
102
103
104
105 public String getName() {
106 return name;
107 }
108
109
110
111
112
113 public static ITRFVersion getITRFVersion(final int year) {
114
115 final int fixedYear = (year > 87 && year < 100) ? (year + 1900) : year;
116
117
118 for (final ITRFVersion version : values()) {
119 if (version.getYear() == fixedYear) {
120 return version;
121 }
122 }
123
124
125 throw new OrekitException(OrekitMessages.NO_SUCH_ITRF_FRAME, year);
126
127 }
128
129
130
131
132
133 public static ITRFVersion getITRFVersion(final String name) {
134
135
136 final Matcher matcher = PATTERN.matcher(name);
137 if (matcher.matches()) {
138 try {
139 return getITRFVersion(Integer.parseInt(matcher.group(1)));
140 } catch (OrekitException oe) {
141 throw new OrekitException(OrekitMessages.NO_SUCH_ITRF_FRAME, name);
142 }
143 }
144
145
146 throw new OrekitException(OrekitMessages.NO_SUCH_ITRF_FRAME, name);
147
148 }
149
150
151
152
153
154
155
156
157
158
159 @DefaultDataContext
160 public static Converter getConverter(final ITRFVersion origin, final ITRFVersion destination) {
161 return getConverter(origin, destination,
162 DataContext.getDefault().getTimeScales().getTT());
163 }
164
165
166
167
168
169
170
171
172 public static Converter getConverter(final ITRFVersion origin,
173 final ITRFVersion destination,
174 final TimeScale tt) {
175
176 TransformProvider provider = null;
177
178
179 if (origin == destination) {
180 provider = TransformProviderUtils.IDENTITY_PROVIDER;
181 }
182
183 if (provider == null) {
184
185 provider = getDirectTransformProvider(origin, destination, tt);
186 }
187
188 if (provider == null) {
189
190 provider = TransformProviderUtils.getCombinedProvider(getDirectTransformProvider(origin, ITRF_2014, tt),
191 getDirectTransformProvider(ITRF_2014, destination, tt));
192 }
193
194
195 return new Converter(origin, destination, provider);
196
197 }
198
199
200
201
202
203
204
205 private static TransformProvider getDirectTransformProvider(
206 final ITRFVersion origin,
207 final ITRFVersion destination,
208 final TimeScale tt) {
209
210
211 for (final HelmertTransformation.Predefined predefined : HelmertTransformation.Predefined.values()) {
212 if (predefined.getOrigin() == origin && predefined.getDestination() == destination) {
213
214 return predefined.getTransformation(tt);
215 } else if (predefined.getOrigin() == destination && predefined.getDestination() == origin) {
216
217 return TransformProviderUtils.getReversedProvider(predefined.getTransformation(tt));
218 }
219 }
220
221
222 return null;
223
224 }
225
226
227 public static class Converter implements TransformProvider {
228
229
230 private static final long serialVersionUID = 20180330L;
231
232
233 private final ITRFVersion origin;
234
235
236 private final ITRFVersion destination;
237
238
239 private final TransformProvider provider;
240
241
242
243
244
245
246 Converter(final ITRFVersion origin, final ITRFVersion destination, final TransformProvider provider) {
247 this.origin = origin;
248 this.destination = destination;
249 this.provider = provider;
250 }
251
252
253
254
255 public ITRFVersion getOrigin() {
256 return origin;
257 }
258
259
260
261
262 public ITRFVersion getDestination() {
263 return destination;
264 }
265
266
267 @Override
268 public Transform getTransform(final AbsoluteDate date) {
269 return provider.getTransform(date);
270 }
271
272
273 @Override
274 public <T extends CalculusFieldElement<T>> FieldTransform<T> getTransform(final FieldAbsoluteDate<T> date) {
275 return provider.getTransform(date);
276 }
277
278 }
279
280 }