gnss-js 0.1.1 → 1.0.0

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 (88) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +171 -5
  3. package/dist/analysis.cjs +1381 -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-354IRDOG.js +239 -0
  12. package/dist/chunk-37QNKGTC.js +65 -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/{index.mjs → chunk-7NOFXKET.js} +179 -198
  17. package/dist/chunk-CB6EOOLA.js +753 -0
  18. package/dist/chunk-HKN3PUGN.js +800 -0
  19. package/dist/chunk-IS4UUDBV.js +577 -0
  20. package/dist/chunk-K7WZQFBV.js +236 -0
  21. package/dist/chunk-LEEU5OIO.js +75 -0
  22. package/dist/chunk-PRSZIWKM.js +1482 -0
  23. package/dist/chunk-SDRRAJT5.js +433 -0
  24. package/dist/chunk-WR7LCB52.js +143 -0
  25. package/dist/chunk-Y3R57B5P.js +473 -0
  26. package/dist/chunk-YDMYO3YK.js +220 -0
  27. package/dist/constants.cjs +394 -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 +334 -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-BUWzfmBy.d.cts +114 -0
  38. package/dist/ephemeris-BUWzfmBy.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 +6286 -0
  42. package/dist/index.d.cts +17 -0
  43. package/dist/index.d.ts +17 -89
  44. package/dist/index.js +355 -479
  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 +169 -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 +504 -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 +1375 -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 +1519 -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 -12
  80. package/.prettierrc +0 -5
  81. package/dist/index.d.mts +0 -89
  82. package/jest.config.js +0 -6
  83. package/test/functions.test.js +0 -69
  84. package/test/gnss-scales.test.js +0 -95
  85. package/test/julian.test.js +0 -41
  86. package/test/rinex.test.js +0 -11
  87. package/test/test.js +0 -11
  88. package/test/utc.test.js +0 -30
@@ -0,0 +1,236 @@
1
+ import {
2
+ WGS84_ECCENTRICITY_SQUARED,
3
+ WGS84_FLATTENING,
4
+ WGS84_SEMI_MAJOR_AXIS,
5
+ WGS84_SEMI_MINOR_AXIS
6
+ } from "./chunk-6FAL6P4G.js";
7
+
8
+ // src/coordinates/units.ts
9
+ function rad2deg(radians) {
10
+ return radians * 180 / Math.PI;
11
+ }
12
+ function deg2rad(degrees) {
13
+ return degrees * Math.PI / 180;
14
+ }
15
+ function deg2dms(deg) {
16
+ deg = Math.abs(deg);
17
+ let d = Math.floor(deg);
18
+ let m = Math.floor(deg * 60) % 60;
19
+ let s = deg * 3600 % 60;
20
+ if (s >= 59.9995) {
21
+ m += 1;
22
+ s = 0;
23
+ }
24
+ if (m === 60) {
25
+ d += 1;
26
+ m = 0;
27
+ }
28
+ return [d, m, s];
29
+ }
30
+
31
+ // src/coordinates/geodesy.ts
32
+ function vincenty(lat1, lon1, lat2, lon2) {
33
+ const U1 = Math.atan((1 - WGS84_FLATTENING) * Math.tan(lat1));
34
+ const U2 = Math.atan((1 - WGS84_FLATTENING) * Math.tan(lat2));
35
+ const sinU1 = Math.sin(U1), cosU1 = Math.cos(U1);
36
+ const sinU2 = Math.sin(U2), cosU2 = Math.cos(U2);
37
+ let lambda = lon2 - lon1;
38
+ let lambdaPrev;
39
+ let sinSigma, cosSigma, sigma;
40
+ let sinAlpha, cos2Alpha, cos2SigmaM;
41
+ let C;
42
+ let iter = 0;
43
+ do {
44
+ const sinLambda2 = Math.sin(lambda);
45
+ const cosLambda2 = Math.cos(lambda);
46
+ sinSigma = Math.sqrt(
47
+ (cosU2 * sinLambda2) ** 2 + (cosU1 * sinU2 - sinU1 * cosU2 * cosLambda2) ** 2
48
+ );
49
+ if (sinSigma === 0) {
50
+ return { distance: 0, initialBearing: 0, finalBearing: 0 };
51
+ }
52
+ cosSigma = sinU1 * sinU2 + cosU1 * cosU2 * cosLambda2;
53
+ sigma = Math.atan2(sinSigma, cosSigma);
54
+ sinAlpha = cosU1 * cosU2 * sinLambda2 / sinSigma;
55
+ cos2Alpha = 1 - sinAlpha ** 2;
56
+ cos2SigmaM = cos2Alpha !== 0 ? cosSigma - 2 * sinU1 * sinU2 / cos2Alpha : 0;
57
+ C = WGS84_FLATTENING / 16 * cos2Alpha * (4 + WGS84_FLATTENING * (4 - 3 * cos2Alpha));
58
+ lambdaPrev = lambda;
59
+ lambda = lon2 - lon1 + (1 - C) * WGS84_FLATTENING * sinAlpha * (sigma + C * sinSigma * (cos2SigmaM + C * cosSigma * (-1 + 2 * cos2SigmaM ** 2)));
60
+ } while (Math.abs(lambda - lambdaPrev) > 1e-12 && ++iter < 200);
61
+ if (iter >= 200) {
62
+ const cosLat1 = Math.cos(lat1), sinLat1 = Math.sin(lat1);
63
+ const cosLat2 = Math.cos(lat2), sinLat2 = Math.sin(lat2);
64
+ const dLon = lon2 - lon1;
65
+ sigma = Math.acos(
66
+ Math.min(1, Math.max(-1, sinLat1 * sinLat2 + cosLat1 * cosLat2 * Math.cos(dLon)))
67
+ );
68
+ const distance2 = WGS84_SEMI_MAJOR_AXIS * sigma;
69
+ const ib = Math.atan2(
70
+ cosLat2 * Math.sin(dLon),
71
+ cosLat1 * sinLat2 - sinLat1 * cosLat2 * Math.cos(dLon)
72
+ );
73
+ const fb = Math.atan2(
74
+ cosLat1 * Math.sin(-dLon),
75
+ -sinLat1 * cosLat2 + cosLat1 * sinLat2 * Math.cos(-dLon)
76
+ );
77
+ return { distance: distance2, initialBearing: ib, finalBearing: fb };
78
+ }
79
+ const uSq = cos2Alpha * (WGS84_SEMI_MAJOR_AXIS ** 2 - WGS84_SEMI_MINOR_AXIS ** 2) / WGS84_SEMI_MINOR_AXIS ** 2;
80
+ const A = 1 + uSq / 16384 * (4096 + uSq * (-768 + uSq * (320 - 175 * uSq)));
81
+ const B = uSq / 1024 * (256 + uSq * (-128 + uSq * (74 - 47 * uSq)));
82
+ const deltaSigma = B * sinSigma * (cos2SigmaM + B / 4 * (cosSigma * (-1 + 2 * cos2SigmaM ** 2) - B / 6 * cos2SigmaM * (-3 + 4 * sinSigma ** 2) * (-3 + 4 * cos2SigmaM ** 2)));
83
+ const distance = WGS84_SEMI_MINOR_AXIS * A * (sigma - deltaSigma);
84
+ const sinLambda = Math.sin(lambda);
85
+ const cosLambda = Math.cos(lambda);
86
+ const initialBearing = Math.atan2(
87
+ cosU2 * sinLambda,
88
+ cosU1 * sinU2 - sinU1 * cosU2 * cosLambda
89
+ );
90
+ const finalBearing = Math.atan2(
91
+ cosU1 * sinLambda,
92
+ -sinU1 * cosU2 + cosU1 * sinU2 * cosLambda
93
+ );
94
+ return { distance, initialBearing, finalBearing };
95
+ }
96
+ function rhumbLine(lat1, lon1, lat2, lon2) {
97
+ const dLat = lat2 - lat1;
98
+ let dLon = lon2 - lon1;
99
+ const MAX_LAT = Math.PI / 2 - 1e-10;
100
+ const isometricLat = (lat) => {
101
+ const clampedLat = Math.max(-MAX_LAT, Math.min(MAX_LAT, lat));
102
+ const sinLat = Math.sin(clampedLat);
103
+ const e = Math.sqrt(WGS84_ECCENTRICITY_SQUARED);
104
+ return Math.log(
105
+ Math.tan(Math.PI / 4 + clampedLat / 2) * ((1 - e * sinLat) / (1 + e * sinLat)) ** (e / 2)
106
+ );
107
+ };
108
+ const psi1 = isometricLat(lat1);
109
+ const psi2 = isometricLat(lat2);
110
+ const dPsi = psi2 - psi1;
111
+ const q = Math.abs(dPsi) > 1e-12 ? dLat / dPsi : Math.cos(lat1);
112
+ if (Math.abs(dLon) > Math.PI) {
113
+ dLon = dLon > 0 ? -(2 * Math.PI - dLon) : 2 * Math.PI + dLon;
114
+ }
115
+ const bearing = Math.atan2(dLon, dPsi);
116
+ const e22 = WGS84_ECCENTRICITY_SQUARED;
117
+ const e4 = e22 * e22;
118
+ const e6 = e4 * e22;
119
+ const meridionalRadius = WGS84_SEMI_MAJOR_AXIS * (1 - e22) * (1 + 3 / 4 * e22 + 45 / 64 * e4 + 175 / 256 * e6);
120
+ const distance = Math.sqrt(dLat ** 2 + q ** 2 * dLon ** 2) * meridionalRadius;
121
+ return { distance, bearing };
122
+ }
123
+ function euclidean3D(x1, y1, z1, x2, y2, z2) {
124
+ return Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2 + (z2 - z1) ** 2);
125
+ }
126
+ function greatCircleMidpoint(lat1, lon1, lat2, lon2) {
127
+ const dLon = lon2 - lon1;
128
+ const Bx = Math.cos(lat2) * Math.cos(dLon);
129
+ const By = Math.cos(lat2) * Math.sin(dLon);
130
+ const sumX = Math.cos(lat1) + Bx;
131
+ const denom = Math.sqrt(sumX ** 2 + By ** 2);
132
+ if (denom < 1e-15) {
133
+ return [(lat1 + lat2) / 2, lon1];
134
+ }
135
+ const latMid = Math.atan2(Math.sin(lat1) + Math.sin(lat2), denom);
136
+ const lonMid = lon1 + Math.atan2(By, sumX);
137
+ return [latMid, lonMid];
138
+ }
139
+ function horizonDistance(heightMeters) {
140
+ if (heightMeters <= 0) return 0;
141
+ const k = 0.13;
142
+ const R = WGS84_SEMI_MAJOR_AXIS;
143
+ const Re = R / (1 - k);
144
+ return Math.sqrt(2 * Re * heightMeters + heightMeters ** 2);
145
+ }
146
+
147
+ // src/coordinates/projections.ts
148
+ var e2 = WGS84_ECCENTRICITY_SQUARED;
149
+ var k0 = 0.9996;
150
+ function geodeticToUtm(lat, lon) {
151
+ const MAX_UTM_LAT = 84 * (Math.PI / 180);
152
+ lat = Math.max(-MAX_UTM_LAT, Math.min(MAX_UTM_LAT, lat));
153
+ const latDeg = lat * 180 / Math.PI;
154
+ const lonDeg = lon * 180 / Math.PI;
155
+ const zone = Math.floor((lonDeg + 180) / 6) + 1;
156
+ const lon0 = ((zone - 1) * 6 - 180 + 3) * (Math.PI / 180);
157
+ const ep2 = e2 / (1 - e2);
158
+ const N = WGS84_SEMI_MAJOR_AXIS / Math.sqrt(1 - e2 * Math.sin(lat) ** 2);
159
+ const T = Math.tan(lat) ** 2;
160
+ const C = ep2 * Math.cos(lat) ** 2;
161
+ const A = Math.cos(lat) * (lon - lon0);
162
+ const M = WGS84_SEMI_MAJOR_AXIS * ((1 - e2 / 4 - 3 * e2 ** 2 / 64 - 5 * e2 ** 3 / 256) * lat - (3 * e2 / 8 + 3 * e2 ** 2 / 32 + 45 * e2 ** 3 / 1024) * Math.sin(2 * lat) + (15 * e2 ** 2 / 256 + 45 * e2 ** 3 / 1024) * Math.sin(4 * lat) - 35 * e2 ** 3 / 3072 * Math.sin(6 * lat));
163
+ const easting = k0 * N * (A + (1 - T + C) * A ** 3 / 6 + (5 - 18 * T + T ** 2 + 72 * C - 58 * ep2) * A ** 5 / 120) + 5e5;
164
+ let northing = k0 * (M + N * Math.tan(lat) * (A ** 2 / 2 + (5 - T + 9 * C + 4 * C ** 2) * A ** 4 / 24 + (61 - 58 * T + T ** 2 + 600 * C - 330 * ep2) * A ** 6 / 720));
165
+ const hemisphere = latDeg >= 0 ? "N" : "S";
166
+ if (hemisphere === "S") {
167
+ northing += 1e7;
168
+ }
169
+ return { easting, northing, zone, hemisphere };
170
+ }
171
+ function geodeticToMaidenhead(lat, lon) {
172
+ const latDeg = Math.max(0, Math.min(179.999999, lat * 180 / Math.PI + 90));
173
+ const lonDeg = Math.max(0, Math.min(359.999999, lon * 180 / Math.PI + 180));
174
+ const chars = "ABCDEFGHIJKLMNOPQRSTUVWX";
175
+ const idx = (i) => Math.max(0, Math.min(23, i));
176
+ const a1 = chars[idx(Math.floor(lonDeg / 20))];
177
+ const a2 = chars[idx(Math.floor(latDeg / 10))];
178
+ const a3 = Math.floor(lonDeg % 20 / 2);
179
+ const a4 = Math.floor(latDeg % 10);
180
+ const a5 = chars[idx(Math.floor(lonDeg % 2 * 12))];
181
+ const a6 = chars[idx(Math.floor(latDeg % 1 * 24))];
182
+ return `${a1}${a2}${a3}${a4}${a5.toLowerCase()}${a6.toLowerCase()}`;
183
+ }
184
+ function geodeticToGeohash(lat, lon, precision = 8) {
185
+ const latDeg = lat * 180 / Math.PI;
186
+ const lonDeg = lon * 180 / Math.PI;
187
+ const base32 = "0123456789bcdefghjkmnpqrstuvwxyz";
188
+ let minLat = -90, maxLat = 90;
189
+ let minLon = -180, maxLon = 180;
190
+ let hash = "";
191
+ let bit = 0;
192
+ let ch = 0;
193
+ let isLon = true;
194
+ while (hash.length < precision) {
195
+ if (isLon) {
196
+ const mid = (minLon + maxLon) / 2;
197
+ if (lonDeg >= mid) {
198
+ ch = ch | 1 << 4 - bit;
199
+ minLon = mid;
200
+ } else {
201
+ maxLon = mid;
202
+ }
203
+ } else {
204
+ const mid = (minLat + maxLat) / 2;
205
+ if (latDeg >= mid) {
206
+ ch = ch | 1 << 4 - bit;
207
+ minLat = mid;
208
+ } else {
209
+ maxLat = mid;
210
+ }
211
+ }
212
+ isLon = !isLon;
213
+ if (bit < 4) {
214
+ bit++;
215
+ } else {
216
+ hash += base32[ch];
217
+ bit = 0;
218
+ ch = 0;
219
+ }
220
+ }
221
+ return hash;
222
+ }
223
+
224
+ export {
225
+ rad2deg,
226
+ deg2rad,
227
+ deg2dms,
228
+ vincenty,
229
+ rhumbLine,
230
+ euclidean3D,
231
+ greatCircleMidpoint,
232
+ horizonDistance,
233
+ geodeticToUtm,
234
+ geodeticToMaidenhead,
235
+ geodeticToGeohash
236
+ };
@@ -0,0 +1,75 @@
1
+ // src/constants/time.ts
2
+ var SECONDS_IN_WEEK = 604800;
3
+ var SECONDS_IN_DAY = 86400;
4
+ var SECONDS_IN_HOUR = 3600;
5
+ var SECONDS_IN_MINUTE = 60;
6
+ var MILLISECONDS_IN_WEEK = 6048e5;
7
+ var MILLISECONDS_IN_DAY = 864e5;
8
+ var MILLISECONDS_IN_HOUR = 36e5;
9
+ var MILLISECONDS_IN_MINUTE = 6e4;
10
+ var MILLISECONDS_IN_SECOND = 1e3;
11
+ var MILLISECONDS_TT_TAI = 32184;
12
+ var MILLISECONDS_GPS_TAI = 19e3;
13
+ var START_GPS_TIME = /* @__PURE__ */ new Date("1980-01-06T00:00:00Z");
14
+ var START_GAL_TIME = /* @__PURE__ */ new Date("1999-08-22T00:00:00Z");
15
+ var START_BDS_TIME = /* @__PURE__ */ new Date("2006-01-01T00:00:14Z");
16
+ var START_UNIX_TIME = /* @__PURE__ */ new Date("1969-12-31T23:59:49Z");
17
+ var START_NTP_TIME = /* @__PURE__ */ new Date("1900-01-01T00:00:00Z");
18
+ var START_GLO_LEAP = /* @__PURE__ */ new Date("1996-01-01T00:00:00Z");
19
+ var START_TAI_TIME = /* @__PURE__ */ new Date("1957-12-31T23:59:41Z");
20
+ var RINEX_CODES = [
21
+ "a",
22
+ "b",
23
+ "c",
24
+ "d",
25
+ "e",
26
+ "f",
27
+ "g",
28
+ "h",
29
+ "i",
30
+ "j",
31
+ "k",
32
+ "l",
33
+ "m",
34
+ "n",
35
+ "o",
36
+ "p",
37
+ "q",
38
+ "r",
39
+ "s",
40
+ "t",
41
+ "u",
42
+ "v",
43
+ "w",
44
+ "x"
45
+ ];
46
+ var START_JULIAN_TAI = 24362045e-1;
47
+ var DAYS_MJD_JULIAN = 24000005e-1;
48
+ var DAYS_MJD2000_MJD = 51544.5;
49
+ var START_MJD_UNIX_SECONDS = 40587;
50
+
51
+ export {
52
+ SECONDS_IN_WEEK,
53
+ SECONDS_IN_DAY,
54
+ SECONDS_IN_HOUR,
55
+ SECONDS_IN_MINUTE,
56
+ MILLISECONDS_IN_WEEK,
57
+ MILLISECONDS_IN_DAY,
58
+ MILLISECONDS_IN_HOUR,
59
+ MILLISECONDS_IN_MINUTE,
60
+ MILLISECONDS_IN_SECOND,
61
+ MILLISECONDS_TT_TAI,
62
+ MILLISECONDS_GPS_TAI,
63
+ START_GPS_TIME,
64
+ START_GAL_TIME,
65
+ START_BDS_TIME,
66
+ START_UNIX_TIME,
67
+ START_NTP_TIME,
68
+ START_GLO_LEAP,
69
+ START_TAI_TIME,
70
+ RINEX_CODES,
71
+ START_JULIAN_TAI,
72
+ DAYS_MJD_JULIAN,
73
+ DAYS_MJD2000_MJD,
74
+ START_MJD_UNIX_SECONDS
75
+ };