gnss-js 0.1.2 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +171 -5
  3. package/dist/analysis.cjs +1488 -0
  4. package/dist/analysis.d.cts +211 -0
  5. package/dist/analysis.d.ts +211 -0
  6. package/dist/analysis.js +14 -0
  7. package/dist/antex.cjs +239 -0
  8. package/dist/antex.d.cts +77 -0
  9. package/dist/antex.d.ts +77 -0
  10. package/dist/antex.js +8 -0
  11. package/dist/chunk-37QNKGTC.js +65 -0
  12. package/dist/chunk-4YN353Q7.js +440 -0
  13. package/dist/chunk-5CMSYIYM.js +214 -0
  14. package/dist/chunk-5S5MONFK.js +0 -0
  15. package/dist/chunk-6FAL6P4G.js +12 -0
  16. package/dist/chunk-7NOFXKET.js +433 -0
  17. package/dist/chunk-BJHTBYNG.js +154 -0
  18. package/dist/chunk-HBLU2EJ4.js +802 -0
  19. package/dist/chunk-HKN3PUGN.js +800 -0
  20. package/dist/chunk-LEEU5OIO.js +75 -0
  21. package/dist/chunk-LWNTWBHB.js +268 -0
  22. package/dist/chunk-MIIM4LDY.js +239 -0
  23. package/dist/chunk-SO3POWWR.js +502 -0
  24. package/dist/chunk-W4YMQKWH.js +622 -0
  25. package/dist/chunk-WP2JFDLA.js +1475 -0
  26. package/dist/chunk-YDMYO3YK.js +220 -0
  27. package/dist/constants.cjs +423 -0
  28. package/dist/constants.d.cts +14 -0
  29. package/dist/constants.d.ts +14 -0
  30. package/dist/constants.js +103 -0
  31. package/dist/coordinates.cjs +337 -0
  32. package/dist/coordinates.d.cts +81 -0
  33. package/dist/coordinates.d.ts +81 -0
  34. package/dist/coordinates.js +39 -0
  35. package/dist/ecef-CF0uAysr.d.cts +40 -0
  36. package/dist/ecef-CF0uAysr.d.ts +40 -0
  37. package/dist/ephemeris-C10stHhM.d.cts +114 -0
  38. package/dist/ephemeris-C10stHhM.d.ts +114 -0
  39. package/dist/gnss-BT6ulR17.d.cts +56 -0
  40. package/dist/gnss-C-tgoYNa.d.ts +56 -0
  41. package/dist/index.cjs +5940 -78
  42. package/dist/index.d.cts +17 -96
  43. package/dist/index.d.ts +17 -96
  44. package/dist/index.js +352 -415
  45. package/dist/nav-BAI1a9vK.d.cts +108 -0
  46. package/dist/nav-BAI1a9vK.d.ts +108 -0
  47. package/dist/nmea.cjs +247 -0
  48. package/dist/nmea.d.cts +37 -0
  49. package/dist/nmea.d.ts +37 -0
  50. package/dist/nmea.js +12 -0
  51. package/dist/ntrip.cjs +180 -0
  52. package/dist/ntrip.d.cts +98 -0
  53. package/dist/ntrip.d.ts +98 -0
  54. package/dist/ntrip.js +10 -0
  55. package/dist/orbit.cjs +511 -0
  56. package/dist/orbit.d.cts +117 -0
  57. package/dist/orbit.d.ts +117 -0
  58. package/dist/orbit.js +29 -0
  59. package/dist/parser-JPjjFgeP.d.cts +73 -0
  60. package/dist/parser-JPjjFgeP.d.ts +73 -0
  61. package/dist/rinex.cjs +1469 -0
  62. package/dist/rinex.d.cts +116 -0
  63. package/dist/rinex.d.ts +116 -0
  64. package/dist/rinex.js +37 -0
  65. package/dist/rtcm3.cjs +1512 -0
  66. package/dist/rtcm3.d.cts +143 -0
  67. package/dist/rtcm3.d.ts +143 -0
  68. package/dist/rtcm3.js +31 -0
  69. package/dist/signals.cjs +858 -0
  70. package/dist/signals.d.cts +93 -0
  71. package/dist/signals.d.ts +93 -0
  72. package/dist/signals.js +70 -0
  73. package/dist/time-DnI1VpE8.d.cts +33 -0
  74. package/dist/time-DnI1VpE8.d.ts +33 -0
  75. package/dist/time.cjs +585 -0
  76. package/dist/time.d.cts +307 -0
  77. package/dist/time.d.ts +307 -0
  78. package/dist/time.js +154 -0
  79. package/package.json +112 -14
  80. package/.prettierrc +0 -5
  81. package/jest.config.ts +0 -9
  82. package/test/functions.test.ts +0 -63
  83. package/test/gnss-scales.test.ts +0 -95
  84. package/test/julian.test.ts +0 -145
  85. package/test/rinex.test.ts +0 -11
  86. package/test/test.ts +0 -10
  87. package/test/utc.test.ts +0 -25
@@ -0,0 +1,214 @@
1
+ // src/antex/index.ts
2
+ function label(line) {
3
+ return (line.length >= 80 ? line.substring(60, 80) : line.substring(60)).trimEnd();
4
+ }
5
+ function parseFloat10(s) {
6
+ return parseFloat(s) || 0;
7
+ }
8
+ function parseFloat6(s) {
9
+ return parseFloat(s) || 0;
10
+ }
11
+ function parseInt6(s) {
12
+ return parseInt(s, 10) || 0;
13
+ }
14
+ function parseValidityDate(line) {
15
+ const year = parseInt(line.substring(0, 6), 10);
16
+ const month = parseInt(line.substring(6, 12), 10);
17
+ const day = parseInt(line.substring(12, 18), 10);
18
+ const hour = parseInt(line.substring(18, 24), 10);
19
+ const min = parseInt(line.substring(24, 30), 10);
20
+ if (isNaN(year)) return "";
21
+ return `${year}-${String(month).padStart(2, "0")}-${String(day).padStart(2, "0")} ${String(hour).padStart(2, "0")}:${String(min).padStart(2, "0")}`;
22
+ }
23
+ function parsePcvRow(line, offset, count) {
24
+ const vals = [];
25
+ for (let i = 0; i < count; i++) {
26
+ const start = offset + i * 8;
27
+ const s = line.substring(start, start + 8);
28
+ vals.push(parseFloat(s) || 0);
29
+ }
30
+ return vals;
31
+ }
32
+ function parseFrequencyBlock(lines, numZen, hasAzimuth, _numAzi) {
33
+ let frequency = "";
34
+ let pcoN = 0, pcoE = 0, pcoU = 0;
35
+ const pcvNoazi = [];
36
+ const pcv = [];
37
+ for (const line of lines) {
38
+ const lbl = label(line);
39
+ if (lbl === "START OF FREQUENCY") {
40
+ frequency = line.substring(3, 6).trim();
41
+ } else if (lbl === "NORTH / EAST / UP") {
42
+ pcoN = parseFloat10(line.substring(0, 10));
43
+ pcoE = parseFloat10(line.substring(10, 20));
44
+ pcoU = parseFloat10(line.substring(20, 30));
45
+ } else if (line.substring(3, 8) === "NOAZI") {
46
+ pcvNoazi.push(...parsePcvRow(line, 8, numZen));
47
+ } else if (lbl !== "END OF FREQUENCY" && lbl !== "START OF FREQUENCY") {
48
+ if (hasAzimuth && line.length > 8) {
49
+ const row = parsePcvRow(line, 8, numZen);
50
+ pcv.push(row);
51
+ }
52
+ }
53
+ }
54
+ return { frequency, pcoN, pcoE, pcoU, pcvNoazi, pcv };
55
+ }
56
+ function parseAntex(text) {
57
+ const allLines = text.split(/\r?\n/);
58
+ let version = 0;
59
+ let system = "";
60
+ let pcvType = "";
61
+ let refAntenna = "";
62
+ const comments = [];
63
+ const antennas = [];
64
+ let inHeader = true;
65
+ let inAntenna = false;
66
+ let inFreq = false;
67
+ let freqLines = [];
68
+ let type = "", serialNo = "", svnCode = "", cosparId = "";
69
+ let method = "", agency = "", date = "";
70
+ let numCalibrated = 0;
71
+ let dazi = 0, zen1 = 0, zen2 = 0, dzen = 0;
72
+ let sinexCode = "", validFrom = "", validUntil = "";
73
+ let frequencies = [];
74
+ let isSatellite = false;
75
+ for (const rawLine of allLines) {
76
+ const line = rawLine.length < 80 ? rawLine.padEnd(80) : rawLine;
77
+ const lbl = label(line);
78
+ if (inHeader) {
79
+ if (lbl === "ANTEX VERSION / SYST") {
80
+ version = parseFloat(line.substring(0, 8)) || 0;
81
+ system = line.substring(20, 21).trim();
82
+ } else if (lbl === "PCV TYPE / REFANT") {
83
+ pcvType = line.substring(0, 1).trim();
84
+ refAntenna = line.substring(20, 40).trim();
85
+ } else if (lbl === "COMMENT") {
86
+ comments.push(line.substring(0, 60).trim());
87
+ } else if (lbl === "END OF HEADER") {
88
+ inHeader = false;
89
+ }
90
+ continue;
91
+ }
92
+ if (lbl === "START OF ANTENNA") {
93
+ inAntenna = true;
94
+ type = "";
95
+ serialNo = "";
96
+ svnCode = "";
97
+ cosparId = "";
98
+ method = "";
99
+ agency = "";
100
+ date = "";
101
+ numCalibrated = 0;
102
+ dazi = 0;
103
+ zen1 = 0;
104
+ zen2 = 0;
105
+ dzen = 0;
106
+ sinexCode = "";
107
+ validFrom = "";
108
+ validUntil = "";
109
+ frequencies = [];
110
+ isSatellite = false;
111
+ continue;
112
+ }
113
+ if (!inAntenna) continue;
114
+ if (lbl === "END OF ANTENNA") {
115
+ antennas.push({
116
+ type,
117
+ serialNo,
118
+ svnCode,
119
+ cosparId,
120
+ isSatellite,
121
+ method,
122
+ agency,
123
+ numCalibrated,
124
+ date,
125
+ dazi,
126
+ zen1,
127
+ zen2,
128
+ dzen,
129
+ sinexCode,
130
+ validFrom,
131
+ validUntil,
132
+ frequencies
133
+ });
134
+ inAntenna = false;
135
+ continue;
136
+ }
137
+ if (lbl === "TYPE / SERIAL NO") {
138
+ type = line.substring(0, 20).trim();
139
+ serialNo = line.substring(20, 40).trim();
140
+ svnCode = line.substring(40, 50).trim();
141
+ cosparId = line.substring(50, 60).trim();
142
+ isSatellite = /^[GRECIJS]\d{2,3}$/.test(serialNo);
143
+ } else if (lbl === "METH / BY / # / DATE") {
144
+ method = line.substring(0, 20).trim();
145
+ agency = line.substring(20, 40).trim();
146
+ numCalibrated = parseInt6(line.substring(40, 46));
147
+ date = line.substring(50, 60).trim();
148
+ } else if (lbl === "DAZI") {
149
+ dazi = parseFloat6(line.substring(2, 8));
150
+ } else if (lbl === "ZEN1 / ZEN2 / DZEN") {
151
+ zen1 = parseFloat6(line.substring(2, 8));
152
+ zen2 = parseFloat6(line.substring(8, 14));
153
+ dzen = parseFloat6(line.substring(14, 20));
154
+ } else if (lbl === "SINEX CODE") {
155
+ sinexCode = line.substring(0, 10).trim();
156
+ } else if (lbl === "VALID FROM") {
157
+ validFrom = parseValidityDate(line);
158
+ } else if (lbl === "VALID UNTIL") {
159
+ validUntil = parseValidityDate(line);
160
+ } else if (lbl === "START OF FREQUENCY") {
161
+ inFreq = true;
162
+ freqLines = [line];
163
+ } else if (lbl === "END OF FREQUENCY") {
164
+ freqLines.push(line);
165
+ inFreq = false;
166
+ const numZen = dzen > 0 ? Math.round((zen2 - zen1) / dzen) + 1 : 0;
167
+ const hasAzimuth = dazi > 0;
168
+ const numAzi = hasAzimuth ? Math.round(360 / dazi) + 1 : 0;
169
+ frequencies.push(
170
+ parseFrequencyBlock(freqLines, numZen, hasAzimuth, numAzi)
171
+ );
172
+ } else if (lbl === "START OF FREQ RMS") {
173
+ inFreq = false;
174
+ } else if (inFreq) {
175
+ freqLines.push(line);
176
+ }
177
+ }
178
+ return { version, system, pcvType, refAntenna, comments, antennas };
179
+ }
180
+ var FREQ_LABELS = {
181
+ G01: "GPS L1",
182
+ G02: "GPS L2",
183
+ G05: "GPS L5",
184
+ R01: "GLO G1",
185
+ R02: "GLO G2",
186
+ R04: "GLO G1a",
187
+ R06: "GLO G2a",
188
+ E01: "GAL E1",
189
+ E05: "GAL E5a",
190
+ E06: "GAL E6",
191
+ E07: "GAL E5b",
192
+ E08: "GAL E5",
193
+ C01: "BDS B1",
194
+ C02: "BDS B1-2",
195
+ C05: "BDS B2a",
196
+ C06: "BDS B3",
197
+ C07: "BDS B2b",
198
+ C08: "BDS B2",
199
+ J01: "QZS L1",
200
+ J02: "QZS L2",
201
+ J05: "QZS L5",
202
+ J06: "QZS LEX",
203
+ S01: "SBS L1",
204
+ S05: "SBS L5",
205
+ I05: "NIC L5"
206
+ };
207
+ function frequencyLabel(code) {
208
+ return FREQ_LABELS[code] ?? code;
209
+ }
210
+
211
+ export {
212
+ parseAntex,
213
+ frequencyLabel
214
+ };
File without changes
@@ -0,0 +1,12 @@
1
+ // src/constants/wgs84.ts
2
+ var WGS84_SEMI_MAJOR_AXIS = 6378137;
3
+ var WGS84_SEMI_MINOR_AXIS = 6356752314245e-6;
4
+ var WGS84_FLATTENING = 1 / 298.257223563;
5
+ var WGS84_ECCENTRICITY_SQUARED = 0.006694379990197;
6
+
7
+ export {
8
+ WGS84_SEMI_MAJOR_AXIS,
9
+ WGS84_SEMI_MINOR_AXIS,
10
+ WGS84_FLATTENING,
11
+ WGS84_ECCENTRICITY_SQUARED
12
+ };
@@ -0,0 +1,433 @@
1
+ import {
2
+ DAYS_MJD2000_MJD,
3
+ DAYS_MJD_JULIAN,
4
+ MILLISECONDS_GPS_TAI,
5
+ MILLISECONDS_IN_DAY,
6
+ MILLISECONDS_IN_HOUR,
7
+ MILLISECONDS_IN_MINUTE,
8
+ MILLISECONDS_IN_SECOND,
9
+ MILLISECONDS_IN_WEEK,
10
+ MILLISECONDS_TT_TAI,
11
+ RINEX_CODES,
12
+ START_BDS_TIME,
13
+ START_GAL_TIME,
14
+ START_GLO_LEAP,
15
+ START_GPS_TIME,
16
+ START_JULIAN_TAI,
17
+ START_NTP_TIME,
18
+ START_TAI_TIME
19
+ } from "./chunk-LEEU5OIO.js";
20
+
21
+ // src/types/enums.ts
22
+ var Scale = /* @__PURE__ */ ((Scale2) => {
23
+ Scale2[Scale2["TAI"] = 0] = "TAI";
24
+ Scale2[Scale2["TT"] = 1] = "TT";
25
+ Scale2[Scale2["GPS"] = 2] = "GPS";
26
+ Scale2[Scale2["UTC"] = 3] = "UTC";
27
+ return Scale2;
28
+ })(Scale || {});
29
+
30
+ // src/time/functions.ts
31
+ function getTimeOfDay(date) {
32
+ return date.getTime() - Date.UTC(
33
+ date.getUTCFullYear(),
34
+ date.getUTCMonth(),
35
+ date.getUTCDate(),
36
+ 0,
37
+ 0,
38
+ 0
39
+ );
40
+ }
41
+ function getDateFromTimeOfDay(timeOfDay, dateRaw) {
42
+ return new Date(
43
+ Date.UTC(
44
+ dateRaw.getUTCFullYear(),
45
+ dateRaw.getUTCMonth(),
46
+ dateRaw.getUTCDate(),
47
+ 0,
48
+ 0,
49
+ 0
50
+ ) + timeOfDay
51
+ );
52
+ }
53
+ function getDayOfYear(date) {
54
+ return Math.floor(
55
+ (date.getTime() - Date.UTC(date.getUTCFullYear())) / MILLISECONDS_IN_DAY
56
+ ) + 1;
57
+ }
58
+ function getDateFromDayOfYear(dayOfYear, date) {
59
+ return new Date(
60
+ Date.UTC(
61
+ date.getUTCFullYear(),
62
+ 0,
63
+ 1,
64
+ date.getUTCHours(),
65
+ date.getUTCMinutes(),
66
+ date.getUTCSeconds(),
67
+ date.getUTCMilliseconds()
68
+ ) + (dayOfYear - 1) * MILLISECONDS_IN_DAY
69
+ );
70
+ }
71
+ function getDayOfWeek(date) {
72
+ return date.getUTCDay();
73
+ }
74
+ function getDateFromDayOfWeek(dayOfWeek, dateRaw) {
75
+ if (dayOfWeek < 0 || dayOfWeek > 6)
76
+ throw new Error("Day of week must be a value between 0 and 7");
77
+ return new Date(
78
+ dateRaw.getTime() + (dayOfWeek - dateRaw.getUTCDay()) * MILLISECONDS_IN_DAY
79
+ );
80
+ }
81
+ function getDateFromHourCode(hourCode, date) {
82
+ const hour = RINEX_CODES.indexOf(hourCode);
83
+ if (hour === -1)
84
+ throw new Error("Hour code must be a lowercase letter between a and x");
85
+ const newDate = new Date(date.getTime());
86
+ newDate.setUTCHours(hour);
87
+ return newDate;
88
+ }
89
+ function getHourCode(date) {
90
+ return RINEX_CODES[date.getUTCHours()];
91
+ }
92
+ function getWeekOfYear(date) {
93
+ const target = new Date(
94
+ Date.UTC(date.getFullYear(), date.getMonth(), date.getDate())
95
+ );
96
+ const dayNr = (target.getUTCDay() + 6) % 7;
97
+ target.setUTCDate(target.getUTCDate() - dayNr + 3);
98
+ const firstThursday = new Date(Date.UTC(target.getUTCFullYear(), 0, 4));
99
+ const dayDiff = (target.getTime() - firstThursday.getTime()) / (86400 * 1e3);
100
+ return 1 + Math.floor(dayDiff / 7) + 1;
101
+ }
102
+
103
+ // src/time/time-difference.ts
104
+ function getTimeDifference(startDate, finalDate) {
105
+ return Math.floor(finalDate.getTime() - startDate.getTime());
106
+ }
107
+ function getSecondsFromTimeDifference(timeDifference) {
108
+ return Math.floor(
109
+ timeDifference % MILLISECONDS_IN_MINUTE / MILLISECONDS_IN_SECOND
110
+ );
111
+ }
112
+ function getMinutesFromTimeDifference(timeDifference) {
113
+ return Math.floor(
114
+ timeDifference % MILLISECONDS_IN_HOUR / MILLISECONDS_IN_MINUTE
115
+ );
116
+ }
117
+ function getHoursFromTimeDifference(timeDifference) {
118
+ return Math.floor(
119
+ timeDifference % MILLISECONDS_IN_DAY / MILLISECONDS_IN_HOUR
120
+ );
121
+ }
122
+ function getTotalDaysFromTimeDifference(timeDifference) {
123
+ return Math.floor(timeDifference / MILLISECONDS_IN_DAY);
124
+ }
125
+ function getTimeDifferenceFromSeconds(seconds) {
126
+ return seconds * MILLISECONDS_IN_SECOND;
127
+ }
128
+ function getTimeDifferenceFromMinutes(minutes) {
129
+ return minutes * MILLISECONDS_IN_MINUTE;
130
+ }
131
+ function getTimeDifferenceFromHours(hours) {
132
+ return hours * MILLISECONDS_IN_HOUR;
133
+ }
134
+ function getTimeDifferenceFromDays(days) {
135
+ return days * MILLISECONDS_IN_DAY;
136
+ }
137
+ function getTimeDifferenceFromObject(timeDifferenceObject) {
138
+ const { seconds, minutes, hours, days } = timeDifferenceObject;
139
+ return getTimeDifferenceFromSeconds(seconds) + getTimeDifferenceFromMinutes(minutes) + getTimeDifferenceFromHours(hours) + getTimeDifferenceFromDays(days);
140
+ }
141
+
142
+ // src/time/utc.ts
143
+ var LEAP_SECONDS_TABLE = [
144
+ [3692217600, 37],
145
+ // 1 Jan 2017
146
+ [3644697600, 36],
147
+ // 1 Jul 2015
148
+ [3550089600, 35],
149
+ // 1 Jul 2012
150
+ [3439756800, 34],
151
+ // 1 Jan 2009
152
+ [3345062400, 33],
153
+ // 1 Jan 2006
154
+ [3124137600, 32],
155
+ // 1 Jan 1999
156
+ [3076704e3, 31],
157
+ // 1 Jul 1997
158
+ [3029443200, 30],
159
+ // 1 Jan 1996
160
+ [2982009600, 29],
161
+ // 1 Jul 1994
162
+ [2950473600, 28],
163
+ // 1 Jul 1993
164
+ [2918937600, 27],
165
+ // 1 Jul 1992
166
+ [2871676800, 26],
167
+ // 1 Jan 1991
168
+ [2840140800, 25],
169
+ // 1 Jan 1990
170
+ [2776982400, 24],
171
+ // 1 Jan 1988
172
+ [2698012800, 23],
173
+ // 1 Jul 1985
174
+ [2634854400, 22],
175
+ // 1 Jul 1983
176
+ [2603318400, 21],
177
+ // 1 Jul 1982
178
+ [2571782400, 20],
179
+ // 1 Jul 1981
180
+ [2524521600, 19],
181
+ // 1 Jan 1980
182
+ [2492985600, 18],
183
+ // 1 Jan 1979
184
+ [2461449600, 17],
185
+ // 1 Jan 1978
186
+ [2429913600, 16],
187
+ // 1 Jan 1977
188
+ [2398291200, 15],
189
+ // 1 Jan 1976
190
+ [2366755200, 14],
191
+ // 1 Jan 1975
192
+ [2335219200, 13],
193
+ // 1 Jan 1974
194
+ [2303683200, 12],
195
+ // 1 Jan 1973
196
+ [2287785600, 11],
197
+ // 1 Jul 1972
198
+ [2272060800, 10]
199
+ // 1 Jan 1972
200
+ ];
201
+ function getLeap(date) {
202
+ const ntp_time = getNtpTime(date);
203
+ for (const [timestamp, leapSeconds] of LEAP_SECONDS_TABLE) {
204
+ if (ntp_time / MILLISECONDS_IN_SECOND - leapSeconds >= timestamp) {
205
+ return leapSeconds;
206
+ }
207
+ }
208
+ return 8;
209
+ }
210
+ function getGpsLeap(date) {
211
+ const leap_seconds = getLeap(date);
212
+ if (leap_seconds < 0) return 0;
213
+ return leap_seconds - 19;
214
+ }
215
+ function getUtcDate(date) {
216
+ const tai_date = getTaiDate(date);
217
+ const leap_seconds = getLeap(date);
218
+ return new Date(tai_date.getTime() - leap_seconds * MILLISECONDS_IN_SECOND);
219
+ }
220
+ function getDateFromUtc(utc_date) {
221
+ const tai_date = new Date(
222
+ utc_date.getTime() + getLeap(utc_date) * MILLISECONDS_IN_SECOND
223
+ );
224
+ const leap_seconds = getLeap(getDateFromTai(tai_date));
225
+ const gps_date = getDateFromTai(
226
+ new Date(utc_date.getTime() + leap_seconds * MILLISECONDS_IN_SECOND)
227
+ );
228
+ return gps_date;
229
+ }
230
+
231
+ // src/time/gnss.ts
232
+ function getGpsTime(date) {
233
+ return date.getTime() - START_GPS_TIME.getTime();
234
+ }
235
+ function getDateFromGpsTime(gpsTime) {
236
+ return new Date(gpsTime + START_GPS_TIME.getTime());
237
+ }
238
+ function getGalTime(date) {
239
+ return date.getTime() - START_GAL_TIME.getTime();
240
+ }
241
+ function getDateFromGalTime(galTime) {
242
+ return new Date(galTime + START_GAL_TIME.getTime());
243
+ }
244
+ function getBdsTime(date) {
245
+ return date.getTime() - START_BDS_TIME.getTime();
246
+ }
247
+ function getDateFromBdsTime(bdsTime) {
248
+ return new Date(bdsTime + START_BDS_TIME.getTime());
249
+ }
250
+ function getUnixTime(date) {
251
+ const utc_date = getUtcDate(date);
252
+ return utc_date.getTime();
253
+ }
254
+ function getDateFromUnixTime(unixTime) {
255
+ return getDateFromUtc(new Date(unixTime));
256
+ }
257
+ function getWeekNumber(date) {
258
+ return Math.floor(getGpsTime(date) / MILLISECONDS_IN_WEEK);
259
+ }
260
+ function getTimeOfWeek(date) {
261
+ return getGpsTime(date) % MILLISECONDS_IN_WEEK;
262
+ }
263
+ function getDateFromGpsData(weekNumber, timeOfWeek) {
264
+ return new Date(
265
+ weekNumber * MILLISECONDS_IN_WEEK + timeOfWeek + START_GPS_TIME.getTime()
266
+ );
267
+ }
268
+ function getTaiDate(date) {
269
+ return new Date(date.getTime() + MILLISECONDS_GPS_TAI);
270
+ }
271
+ function getDateFromTai(tai_date) {
272
+ return new Date(tai_date.getTime() - MILLISECONDS_GPS_TAI);
273
+ }
274
+ function getTtDate(date) {
275
+ return new Date(date.getTime() + MILLISECONDS_GPS_TAI + MILLISECONDS_TT_TAI);
276
+ }
277
+ function getDateFromTt(tt_date) {
278
+ return new Date(
279
+ tt_date.getTime() - MILLISECONDS_GPS_TAI - MILLISECONDS_TT_TAI
280
+ );
281
+ }
282
+ function getGloN4(date) {
283
+ return Math.floor((date.getUTCFullYear() - START_GLO_LEAP.getFullYear()) / 4);
284
+ }
285
+ function getGloNA(date) {
286
+ const n4 = getGloN4(date);
287
+ const init4YearPeriod = new Date(START_GLO_LEAP);
288
+ init4YearPeriod.setUTCFullYear(init4YearPeriod.getUTCFullYear() + n4 * 4);
289
+ return Math.floor(getTimeDifference(init4YearPeriod, date) / MILLISECONDS_IN_DAY) + 1;
290
+ }
291
+ function getDateFromGloN(n4, na, tod) {
292
+ const date = new Date(START_GLO_LEAP);
293
+ date.setFullYear(date.getUTCFullYear() + n4 * 4);
294
+ date.setTime(date.getTime() + (na - 1) * MILLISECONDS_IN_DAY + tod);
295
+ return date;
296
+ }
297
+ function getNtpTime(date) {
298
+ return getTaiDate(date).getTime() - START_NTP_TIME.getTime();
299
+ }
300
+
301
+ // src/time/rinex.ts
302
+ function getRINEX(date) {
303
+ const seconds = date.getUTCSeconds();
304
+ const milliseconds = date.getUTCMilliseconds();
305
+ const fractionalSeconds = (milliseconds / MILLISECONDS_IN_SECOND).toFixed(7).slice(1);
306
+ const formatted = `> ${date.getUTCFullYear()} ${String(
307
+ date.getUTCMonth() + 1
308
+ ).padStart(2, "0")} ${String(date.getUTCDate()).padStart(2, "0")} ${String(
309
+ date.getUTCHours()
310
+ ).padStart(2, "0")} ${String(date.getUTCMinutes()).padStart(
311
+ 2,
312
+ "0"
313
+ )} ${String(seconds).padStart(2, "0")}${fractionalSeconds}`;
314
+ return formatted;
315
+ }
316
+ function getDateFromRINEX(rinex) {
317
+ const year = Number.parseInt(rinex.substring(2, 6));
318
+ const month = Number.parseInt(rinex.substring(7, 9)) - 1;
319
+ const day = Number.parseInt(rinex.substring(10, 12));
320
+ const hour = Number.parseInt(rinex.substring(13, 15));
321
+ const minute = Number.parseInt(rinex.substring(16, 18));
322
+ const second = Number.parseInt(rinex.substring(19, 21));
323
+ const millisecond = Number.parseInt(rinex.substring(22, 29)) / 1e4;
324
+ const date = new Date(
325
+ Date.UTC(year, month, day, hour, minute, second, millisecond)
326
+ );
327
+ return date;
328
+ }
329
+
330
+ // src/time/julian.ts
331
+ function getJulianDate(date, scale = 1 /* TT */) {
332
+ if (scale === 0 /* TAI */) {
333
+ return (date.getTime() - START_TAI_TIME.getTime()) / MILLISECONDS_IN_DAY + START_JULIAN_TAI;
334
+ }
335
+ if (scale === 2 /* GPS */) {
336
+ return (date.getTime() - START_TAI_TIME.getTime() - MILLISECONDS_GPS_TAI) / MILLISECONDS_IN_DAY + START_JULIAN_TAI;
337
+ }
338
+ if (scale === 3 /* UTC */) {
339
+ return (date.getTime() - START_TAI_TIME.getTime() - getLeap(date) * MILLISECONDS_IN_SECOND) / MILLISECONDS_IN_DAY + START_JULIAN_TAI;
340
+ }
341
+ return (date.getTime() - START_TAI_TIME.getTime() + MILLISECONDS_TT_TAI) / MILLISECONDS_IN_DAY + START_JULIAN_TAI;
342
+ }
343
+ function getDateFromJulianDate(julianDate, scale = 1 /* TT */) {
344
+ if (scale === 0 /* TAI */) {
345
+ return new Date(
346
+ (julianDate - START_JULIAN_TAI) * MILLISECONDS_IN_DAY + START_TAI_TIME.getTime()
347
+ );
348
+ }
349
+ if (scale === 2 /* GPS */) {
350
+ return new Date(
351
+ (julianDate - START_JULIAN_TAI) * MILLISECONDS_IN_DAY + START_TAI_TIME.getTime() + MILLISECONDS_GPS_TAI
352
+ );
353
+ }
354
+ if (scale === 3 /* UTC */) {
355
+ const utc_date = new Date(
356
+ (julianDate - START_JULIAN_TAI) * MILLISECONDS_IN_DAY + START_TAI_TIME.getTime()
357
+ );
358
+ const tai_date = new Date(
359
+ utc_date.getTime() + getLeap(utc_date) * MILLISECONDS_IN_SECOND
360
+ );
361
+ const leap_seconds = getLeap(getDateFromTai(tai_date));
362
+ return new Date(utc_date.getTime() + leap_seconds * MILLISECONDS_IN_SECOND);
363
+ }
364
+ return new Date(
365
+ (julianDate - START_JULIAN_TAI) * MILLISECONDS_IN_DAY + START_TAI_TIME.getTime() - MILLISECONDS_TT_TAI
366
+ );
367
+ }
368
+ function getMJD(date, scale = 1 /* TT */) {
369
+ return getJulianDate(date, scale) - DAYS_MJD_JULIAN;
370
+ }
371
+ function getDateFromMJD(mjd, scale = 1 /* TT */) {
372
+ return getDateFromJulianDate(mjd + DAYS_MJD_JULIAN, scale);
373
+ }
374
+ function getMJD2000(date, scale = 1 /* TT */) {
375
+ return getMJD(date, scale) - DAYS_MJD2000_MJD;
376
+ }
377
+ function getDateFromMJD2000(mjd2000, scale = 1 /* TT */) {
378
+ return getDateFromMJD(mjd2000 + DAYS_MJD2000_MJD, scale);
379
+ }
380
+
381
+ export {
382
+ Scale,
383
+ getTimeOfDay,
384
+ getDateFromTimeOfDay,
385
+ getDayOfYear,
386
+ getDateFromDayOfYear,
387
+ getDayOfWeek,
388
+ getDateFromDayOfWeek,
389
+ getDateFromHourCode,
390
+ getHourCode,
391
+ getWeekOfYear,
392
+ getTimeDifference,
393
+ getSecondsFromTimeDifference,
394
+ getMinutesFromTimeDifference,
395
+ getHoursFromTimeDifference,
396
+ getTotalDaysFromTimeDifference,
397
+ getTimeDifferenceFromSeconds,
398
+ getTimeDifferenceFromMinutes,
399
+ getTimeDifferenceFromHours,
400
+ getTimeDifferenceFromDays,
401
+ getTimeDifferenceFromObject,
402
+ getLeap,
403
+ getGpsLeap,
404
+ getUtcDate,
405
+ getDateFromUtc,
406
+ getGpsTime,
407
+ getDateFromGpsTime,
408
+ getGalTime,
409
+ getDateFromGalTime,
410
+ getBdsTime,
411
+ getDateFromBdsTime,
412
+ getUnixTime,
413
+ getDateFromUnixTime,
414
+ getWeekNumber,
415
+ getTimeOfWeek,
416
+ getDateFromGpsData,
417
+ getTaiDate,
418
+ getDateFromTai,
419
+ getTtDate,
420
+ getDateFromTt,
421
+ getGloN4,
422
+ getGloNA,
423
+ getDateFromGloN,
424
+ getNtpTime,
425
+ getRINEX,
426
+ getDateFromRINEX,
427
+ getJulianDate,
428
+ getDateFromJulianDate,
429
+ getMJD,
430
+ getDateFromMJD,
431
+ getMJD2000,
432
+ getDateFromMJD2000
433
+ };