gnss-js 1.51.0 → 1.52.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.
@@ -3048,6 +3048,65 @@ function sagnac2(pos, travelTimeS) {
3048
3048
  const s = Math.sin(theta);
3049
3049
  return [pos.x * c + pos.y * s, -pos.x * s + pos.y * c, pos.z];
3050
3050
  }
3051
+ function sbasAirTropoVar(elRad) {
3052
+ const elDeg = elRad * 180 / Math.PI;
3053
+ const sigMp = 0.13 + 0.53 * Math.exp(-elDeg / 10);
3054
+ const sigNoise = 0.15 + 0.43 * Math.exp(-elDeg / 6.9);
3055
+ const m = 1.001 / Math.sqrt(2001e-6 + Math.sin(elRad) * Math.sin(elRad));
3056
+ const sigTropo = 0.12 * m;
3057
+ return sigMp * sigMp + sigNoise * sigNoise + sigTropo * sigTropo;
3058
+ }
3059
+ function invertMatrix(A) {
3060
+ const n = A.length;
3061
+ const M = A.map((row, i) => [
3062
+ ...row,
3063
+ ...Array.from({ length: n }, (_, j) => i === j ? 1 : 0)
3064
+ ]);
3065
+ for (let col = 0; col < n; col++) {
3066
+ let piv = col;
3067
+ for (let r = col + 1; r < n; r++)
3068
+ if (Math.abs(M[r][col]) > Math.abs(M[piv][col])) piv = r;
3069
+ if (Math.abs(M[piv][col]) < 1e-12) return null;
3070
+ [M[col], M[piv]] = [M[piv], M[col]];
3071
+ const d = M[col][col];
3072
+ for (let j = 0; j < 2 * n; j++) M[col][j] /= d;
3073
+ for (let r = 0; r < n; r++) {
3074
+ if (r === col) continue;
3075
+ const f = M[r][col];
3076
+ for (let j = 0; j < 2 * n; j++) M[r][j] -= f * M[col][j];
3077
+ }
3078
+ }
3079
+ return M.map((row) => row.slice(n));
3080
+ }
3081
+ function sbasProtectionLevels(sats, opts = {}) {
3082
+ const kH = opts.kH ?? 6;
3083
+ const kV = opts.kV ?? 5.33;
3084
+ if (sats.length < 4) return null;
3085
+ const N = [0, 1, 2, 3].map(() => [0, 0, 0, 0]);
3086
+ for (const s of sats) {
3087
+ if (!(s.variance > 0)) continue;
3088
+ const ce = Math.cos(s.elRad);
3089
+ const g = [
3090
+ ce * Math.sin(s.azRad),
3091
+ ce * Math.cos(s.azRad),
3092
+ Math.sin(s.elRad),
3093
+ 1
3094
+ ];
3095
+ const w = 1 / s.variance;
3096
+ for (let i = 0; i < 4; i++)
3097
+ for (let j = 0; j < 4; j++) N[i][j] += w * g[i] * g[j];
3098
+ }
3099
+ const cov = invertMatrix(N);
3100
+ if (!cov) return null;
3101
+ const dE2 = cov[0][0];
3102
+ const dN2 = cov[1][1];
3103
+ const dEN = cov[0][1];
3104
+ const dU = Math.sqrt(Math.max(cov[2][2], 0));
3105
+ const dMajor = Math.sqrt(
3106
+ (dE2 + dN2) / 2 + Math.sqrt(((dE2 - dN2) / 2) ** 2 + dEN * dEN)
3107
+ );
3108
+ return { hpl: kH * dMajor, vpl: kV * dU, dMajor, dU };
3109
+ }
3051
3110
  function solveLinear(A, b) {
3052
3111
  const n = b.length;
3053
3112
  const M = A.map((row, i) => [...row, b[i]]);
@@ -3104,7 +3163,7 @@ function solveSpp(pseudoranges, ephemerides, timeMs, opts = {}) {
3104
3163
  const sysRows = new Map(systems.map((s) => [s, 0]));
3105
3164
  for (const k of Object.keys(residuals2)) delete residuals2[k];
3106
3165
  const positionSaneIter = x9 * x9 + y2 * y2 + z2 * z2 > 1e12;
3107
- const [rxLat, rxLon, rxHgt] = positionSaneIter ? ecefToGeodetic(x9, y2, z2) : [0, 0, 0];
3166
+ const [rxLat2, rxLon2, rxHgt2] = positionSaneIter ? ecefToGeodetic(x9, y2, z2) : [0, 0, 0];
3108
3167
  for (const prn of prns) {
3109
3168
  const psr = pseudoranges.get(prn);
3110
3169
  const eph = ephemerides.get(prn);
@@ -3143,7 +3202,7 @@ function solveSpp(pseudoranges, ephemerides, timeMs, opts = {}) {
3143
3202
  const sinEl = Math.max(Math.sin(elev), 0.1);
3144
3203
  weight = sinEl * sinEl;
3145
3204
  }
3146
- const tropo = troposphere && positionSane ? tropoDelay2(elev, rxLat, rxHgt) : 0;
3205
+ const tropo = troposphere && positionSane ? tropoDelay2(elev, rxLat2, rxHgt2) : 0;
3147
3206
  let ionoM = 0;
3148
3207
  if ((sbas || gim || iono) && positionSane) {
3149
3208
  let l1M = null;
@@ -3151,18 +3210,18 @@ function solveSpp(pseudoranges, ephemerides, timeMs, opts = {}) {
3151
3210
  const si = sbas.ionoDelay(
3152
3211
  gpsWeek,
3153
3212
  gpsTow,
3154
- rxLat,
3155
- rxLon,
3156
- rxHgt,
3213
+ rxLat2,
3214
+ rxLon2,
3215
+ rxHgt2,
3157
3216
  azim,
3158
3217
  elev
3159
3218
  );
3160
3219
  if (si) l1M = si.delayM;
3161
3220
  }
3162
3221
  if (l1M === null && gim)
3163
- l1M = gimSlantIonoDelayL1(gim, rxLat, rxLon, azim, elev, timeMs);
3222
+ l1M = gimSlantIonoDelayL1(gim, rxLat2, rxLon2, azim, elev, timeMs);
3164
3223
  if (l1M === null && iono) {
3165
- l1M = C_LIGHT * klobucharDelay(iono, rxLat, rxLon, azim, elev, gpsTow);
3224
+ l1M = C_LIGHT * klobucharDelay(iono, rxLat2, rxLon2, azim, elev, gpsTow);
3166
3225
  }
3167
3226
  if (l1M !== null) {
3168
3227
  const f = PRIMARY_FREQ_HZ[sys] ?? F_L12;
@@ -3235,6 +3294,8 @@ function solveSpp(pseudoranges, ephemerides, timeMs, opts = {}) {
3235
3294
  const { x, y, z, clock, residuals, iterations, converged } = inner;
3236
3295
  const used = [];
3237
3296
  const azels = [];
3297
+ const [rxLat, rxLon, rxHgt] = ecefToGeodetic(x, y, z);
3298
+ const sbasRows = [];
3238
3299
  for (const prn of candidates) {
3239
3300
  if (!(prn in residuals)) continue;
3240
3301
  const eph = ephemerides.get(prn);
@@ -3244,8 +3305,27 @@ function solveSpp(pseudoranges, ephemerides, timeMs, opts = {}) {
3244
3305
  if (azel.el >= elevationMaskDeg * Math.PI / 180) {
3245
3306
  used.push(prn);
3246
3307
  azels.push(azel);
3308
+ if (sbas) {
3309
+ const sc = sbas.satCorrection(prn, gpsWeek, gpsTow);
3310
+ const si = sbas.ionoDelay(
3311
+ gpsWeek,
3312
+ gpsTow,
3313
+ rxLat,
3314
+ rxLon,
3315
+ rxHgt,
3316
+ azel.az,
3317
+ azel.el
3318
+ );
3319
+ if (sc && si)
3320
+ sbasRows.push({
3321
+ azRad: azel.az,
3322
+ elRad: azel.el,
3323
+ variance: sc.varM2 + si.varM2 + sbasAirTropoVar(azel.el)
3324
+ });
3325
+ }
3247
3326
  }
3248
3327
  }
3328
+ const pl = sbas ? sbasProtectionLevels(sbasRows) : null;
3249
3329
  return {
3250
3330
  position: [x, y, z],
3251
3331
  clockBias: Object.fromEntries(clock),
@@ -3254,7 +3334,8 @@ function solveSpp(pseudoranges, ephemerides, timeMs, opts = {}) {
3254
3334
  residuals,
3255
3335
  dop: computeDop(azels),
3256
3336
  iterations,
3257
- converged
3337
+ converged,
3338
+ ...pl ? { hpl: pl.hpl, vpl: pl.vpl, sbasSats: sbasRows.length } : sbas ? { sbasSats: sbasRows.length } : {}
3258
3339
  };
3259
3340
  }
3260
3341
 
@@ -3288,5 +3369,6 @@ export {
3288
3369
  estimateNetworkFcbs,
3289
3370
  satClockCorrection,
3290
3371
  ionoFree,
3372
+ sbasProtectionLevels,
3291
3373
  solveSpp
3292
3374
  };
package/dist/index.cjs CHANGED
@@ -294,6 +294,7 @@ __export(src_exports, {
294
294
  rhumbLine: () => rhumbLine,
295
295
  rtcm3Constellation: () => rtcm3Constellation,
296
296
  satClockCorrection: () => satClockCorrection,
297
+ sbasProtectionLevels: () => sbasProtectionLevels,
297
298
  sbfCrc16: () => crc16,
298
299
  scanSbfFrames: () => scanSbfFrames,
299
300
  selectEphemeris: () => selectEphemeris,
@@ -14978,6 +14979,65 @@ function sagnac2(pos, travelTimeS) {
14978
14979
  const s = Math.sin(theta);
14979
14980
  return [pos.x * c + pos.y * s, -pos.x * s + pos.y * c, pos.z];
14980
14981
  }
14982
+ function sbasAirTropoVar(elRad) {
14983
+ const elDeg = elRad * 180 / Math.PI;
14984
+ const sigMp = 0.13 + 0.53 * Math.exp(-elDeg / 10);
14985
+ const sigNoise = 0.15 + 0.43 * Math.exp(-elDeg / 6.9);
14986
+ const m = 1.001 / Math.sqrt(2001e-6 + Math.sin(elRad) * Math.sin(elRad));
14987
+ const sigTropo = 0.12 * m;
14988
+ return sigMp * sigMp + sigNoise * sigNoise + sigTropo * sigTropo;
14989
+ }
14990
+ function invertMatrix(A) {
14991
+ const n = A.length;
14992
+ const M = A.map((row, i) => [
14993
+ ...row,
14994
+ ...Array.from({ length: n }, (_, j) => i === j ? 1 : 0)
14995
+ ]);
14996
+ for (let col = 0; col < n; col++) {
14997
+ let piv = col;
14998
+ for (let r = col + 1; r < n; r++)
14999
+ if (Math.abs(M[r][col]) > Math.abs(M[piv][col])) piv = r;
15000
+ if (Math.abs(M[piv][col]) < 1e-12) return null;
15001
+ [M[col], M[piv]] = [M[piv], M[col]];
15002
+ const d = M[col][col];
15003
+ for (let j = 0; j < 2 * n; j++) M[col][j] /= d;
15004
+ for (let r = 0; r < n; r++) {
15005
+ if (r === col) continue;
15006
+ const f = M[r][col];
15007
+ for (let j = 0; j < 2 * n; j++) M[r][j] -= f * M[col][j];
15008
+ }
15009
+ }
15010
+ return M.map((row) => row.slice(n));
15011
+ }
15012
+ function sbasProtectionLevels(sats, opts = {}) {
15013
+ const kH = opts.kH ?? 6;
15014
+ const kV = opts.kV ?? 5.33;
15015
+ if (sats.length < 4) return null;
15016
+ const N = [0, 1, 2, 3].map(() => [0, 0, 0, 0]);
15017
+ for (const s of sats) {
15018
+ if (!(s.variance > 0)) continue;
15019
+ const ce = Math.cos(s.elRad);
15020
+ const g = [
15021
+ ce * Math.sin(s.azRad),
15022
+ ce * Math.cos(s.azRad),
15023
+ Math.sin(s.elRad),
15024
+ 1
15025
+ ];
15026
+ const w = 1 / s.variance;
15027
+ for (let i = 0; i < 4; i++)
15028
+ for (let j = 0; j < 4; j++) N[i][j] += w * g[i] * g[j];
15029
+ }
15030
+ const cov = invertMatrix(N);
15031
+ if (!cov) return null;
15032
+ const dE2 = cov[0][0];
15033
+ const dN2 = cov[1][1];
15034
+ const dEN = cov[0][1];
15035
+ const dU = Math.sqrt(Math.max(cov[2][2], 0));
15036
+ const dMajor = Math.sqrt(
15037
+ (dE2 + dN2) / 2 + Math.sqrt(((dE2 - dN2) / 2) ** 2 + dEN * dEN)
15038
+ );
15039
+ return { hpl: kH * dMajor, vpl: kV * dU, dMajor, dU };
15040
+ }
14981
15041
  function solveLinear(A, b) {
14982
15042
  const n = b.length;
14983
15043
  const M = A.map((row, i) => [...row, b[i]]);
@@ -15034,7 +15094,7 @@ function solveSpp(pseudoranges, ephemerides, timeMs, opts = {}) {
15034
15094
  const sysRows = new Map(systems.map((s) => [s, 0]));
15035
15095
  for (const k of Object.keys(residuals2)) delete residuals2[k];
15036
15096
  const positionSaneIter = x9 * x9 + y2 * y2 + z2 * z2 > 1e12;
15037
- const [rxLat, rxLon, rxHgt] = positionSaneIter ? ecefToGeodetic(x9, y2, z2) : [0, 0, 0];
15097
+ const [rxLat2, rxLon2, rxHgt2] = positionSaneIter ? ecefToGeodetic(x9, y2, z2) : [0, 0, 0];
15038
15098
  for (const prn of prns) {
15039
15099
  const psr = pseudoranges.get(prn);
15040
15100
  const eph = ephemerides.get(prn);
@@ -15073,7 +15133,7 @@ function solveSpp(pseudoranges, ephemerides, timeMs, opts = {}) {
15073
15133
  const sinEl = Math.max(Math.sin(elev), 0.1);
15074
15134
  weight = sinEl * sinEl;
15075
15135
  }
15076
- const tropo = troposphere && positionSane ? tropoDelay2(elev, rxLat, rxHgt) : 0;
15136
+ const tropo = troposphere && positionSane ? tropoDelay2(elev, rxLat2, rxHgt2) : 0;
15077
15137
  let ionoM = 0;
15078
15138
  if ((sbas || gim || iono) && positionSane) {
15079
15139
  let l1M = null;
@@ -15081,18 +15141,18 @@ function solveSpp(pseudoranges, ephemerides, timeMs, opts = {}) {
15081
15141
  const si = sbas.ionoDelay(
15082
15142
  gpsWeek,
15083
15143
  gpsTow,
15084
- rxLat,
15085
- rxLon,
15086
- rxHgt,
15144
+ rxLat2,
15145
+ rxLon2,
15146
+ rxHgt2,
15087
15147
  azim,
15088
15148
  elev
15089
15149
  );
15090
15150
  if (si) l1M = si.delayM;
15091
15151
  }
15092
15152
  if (l1M === null && gim)
15093
- l1M = gimSlantIonoDelayL1(gim, rxLat, rxLon, azim, elev, timeMs);
15153
+ l1M = gimSlantIonoDelayL1(gim, rxLat2, rxLon2, azim, elev, timeMs);
15094
15154
  if (l1M === null && iono) {
15095
- l1M = C_LIGHT * klobucharDelay(iono, rxLat, rxLon, azim, elev, gpsTow);
15155
+ l1M = C_LIGHT * klobucharDelay(iono, rxLat2, rxLon2, azim, elev, gpsTow);
15096
15156
  }
15097
15157
  if (l1M !== null) {
15098
15158
  const f = PRIMARY_FREQ_HZ[sys] ?? F_L12;
@@ -15165,6 +15225,8 @@ function solveSpp(pseudoranges, ephemerides, timeMs, opts = {}) {
15165
15225
  const { x, y, z, clock, residuals, iterations, converged } = inner;
15166
15226
  const used = [];
15167
15227
  const azels = [];
15228
+ const [rxLat, rxLon, rxHgt] = ecefToGeodetic(x, y, z);
15229
+ const sbasRows = [];
15168
15230
  for (const prn of candidates) {
15169
15231
  if (!(prn in residuals)) continue;
15170
15232
  const eph = ephemerides.get(prn);
@@ -15174,8 +15236,27 @@ function solveSpp(pseudoranges, ephemerides, timeMs, opts = {}) {
15174
15236
  if (azel.el >= elevationMaskDeg * Math.PI / 180) {
15175
15237
  used.push(prn);
15176
15238
  azels.push(azel);
15239
+ if (sbas) {
15240
+ const sc = sbas.satCorrection(prn, gpsWeek, gpsTow);
15241
+ const si = sbas.ionoDelay(
15242
+ gpsWeek,
15243
+ gpsTow,
15244
+ rxLat,
15245
+ rxLon,
15246
+ rxHgt,
15247
+ azel.az,
15248
+ azel.el
15249
+ );
15250
+ if (sc && si)
15251
+ sbasRows.push({
15252
+ azRad: azel.az,
15253
+ elRad: azel.el,
15254
+ variance: sc.varM2 + si.varM2 + sbasAirTropoVar(azel.el)
15255
+ });
15256
+ }
15177
15257
  }
15178
15258
  }
15259
+ const pl = sbas ? sbasProtectionLevels(sbasRows) : null;
15179
15260
  return {
15180
15261
  position: [x, y, z],
15181
15262
  clockBias: Object.fromEntries(clock),
@@ -15184,7 +15265,8 @@ function solveSpp(pseudoranges, ephemerides, timeMs, opts = {}) {
15184
15265
  residuals,
15185
15266
  dop: computeDop(azels),
15186
15267
  iterations,
15187
- converged
15268
+ converged,
15269
+ ...pl ? { hpl: pl.hpl, vpl: pl.vpl, sbasSats: sbasRows.length } : sbas ? { sbasSats: sbasRows.length } : {}
15188
15270
  };
15189
15271
  }
15190
15272
 
@@ -17722,6 +17804,7 @@ function computePsdDb(centerMHz, halfSpanChips, numPoints, psdFn, f0 = 1023e3, f
17722
17804
  rhumbLine,
17723
17805
  rtcm3Constellation,
17724
17806
  satClockCorrection,
17807
+ sbasProtectionLevels,
17725
17808
  sbfCrc16,
17726
17809
  scanSbfFrames,
17727
17810
  selectEphemeris,
package/dist/index.d.cts CHANGED
@@ -17,7 +17,7 @@ export { TrimbleEpoch, TrimbleFrame, TrimbleMeasurement, TrimbleNavResult, Trimb
17
17
  export { BinexEpoch, BinexMeasurement, BinexParseResult, BinexRecord, binexCrc16, binexCrc32, binexCsum8, binexRecords, decodeBinexEph, getBnxi, parseBinex } from './binex.cjs';
18
18
  export { AllPositionsData, AlmanacPosition, DopValues, EpochSkyData, SatAzEl, SatPoint, SatPosition, VisibilityPass, VisibilityResult, almanacEpochMs, almanacSatPosition, computeAllPositions, computeDop, computeLiveSkyPositions, computeSatPosition, computeVisibility, computeVisibilityFromPositions, dopplerHz, ecefToAzEl, ephInfoToEphemeris, glonassAlmanacEpochMs, glonassAlmanacPosition, glonassPosition, keplerPosition, maskRadForAzimuth, navTimesFromEph, rangeRate, selectEphemeris } from './orbit.cjs';
19
19
  export { Helmert14, REFERENCE_FRAMES, ReferenceFrame, applyHelmert, dateToEpoch, transformFrame } from './frames.cjs';
20
- export { AntennaOffset, ArFixedSat, ArOptions, ArResult, ArSat, CorrectionResult, DgnssOptions, DgnssSolution, EphemerisSource, FixedPositionResult, IONO_L1_M_PER_TECU, KlobucharCoeffs, LambdaResult, NetworkFcbResult, NetworkFcbSummary, NlArc, NlFcbResult, PppAntennaModel, PppArc, PppCorrectionConfig, PppCorrections, PppEpoch, PppEpochContext, PppEpochResult, PppFixState, PppOptions, PppSatObs, PppSolution, RawObservation, RtkEpochMeasurements, RtkFloatEngine, RtkFloatOptions, RtkFloatSolution, RtkMeasurement, RtkObsEpoch, RtkObsInput, RtkPostProcessOptions, RtkPostProcessResult, RtkTrackPoint, SatGeom, SbasCorrectionSource, SbasIonoDelay, SbasProcessor, SbasSatCorrection, SppOptions, SppSolution, TropoMapping, WlArc, WlFcbOptions, WlFcbResult, WlObs, buildPppAntenna, createPppCorrections, estimateNarrowlaneFcb, estimateNetworkFcbs, estimateWidelaneFcb, extractWidelaneArcs, fixPppPosition, gimSlantIonoDelayL1, gimVerticalTec, gmst, ionoFree, klobucharDelay, lambdaReduction, lambdaSearch, moonEcef, niellMapping, nlWavelength, postProcessRtk, resolvePppAmbiguities, satClockCorrection, solidEarthTide, solveDgnss, solvePpp, solveSpp, sunEcef, toRtkEpoch, wlWavelength } from './positioning.cjs';
20
+ export { AntennaOffset, ArFixedSat, ArOptions, ArResult, ArSat, CorrectionResult, DgnssOptions, DgnssSolution, EphemerisSource, FixedPositionResult, IONO_L1_M_PER_TECU, KlobucharCoeffs, LambdaResult, NetworkFcbResult, NetworkFcbSummary, NlArc, NlFcbResult, PppAntennaModel, PppArc, PppCorrectionConfig, PppCorrections, PppEpoch, PppEpochContext, PppEpochResult, PppFixState, PppOptions, PppSatObs, PppSolution, RawObservation, RtkEpochMeasurements, RtkFloatEngine, RtkFloatOptions, RtkFloatSolution, RtkMeasurement, RtkObsEpoch, RtkObsInput, RtkPostProcessOptions, RtkPostProcessResult, RtkTrackPoint, SatGeom, SbasCorrectionSource, SbasIonoDelay, SbasProcessor, SbasSatCorrection, SppOptions, SppSolution, TropoMapping, WlArc, WlFcbOptions, WlFcbResult, WlObs, buildPppAntenna, createPppCorrections, estimateNarrowlaneFcb, estimateNetworkFcbs, estimateWidelaneFcb, extractWidelaneArcs, fixPppPosition, gimSlantIonoDelayL1, gimVerticalTec, gmst, ionoFree, klobucharDelay, lambdaReduction, lambdaSearch, moonEcef, niellMapping, nlWavelength, postProcessRtk, resolvePppAmbiguities, satClockCorrection, sbasProtectionLevels, solidEarthTide, solveDgnss, solvePpp, solveSpp, sunEcef, toRtkEpoch, wlWavelength } from './positioning.cjs';
21
21
  export { NtripCaster, NtripConnectionInfo, NtripNetwork, NtripStream, NtripStreamConnection, NtripVersion, Sourcetable, SourcetableEntry, connectToMountpoint, fetchSourcetable, parseSourcetable } from './ntrip.cjs';
22
22
  export { CompleteSatSignal, CompleteSignalStats, CompletenessAccumulator, CompletenessResult, CycleSlipAccumulator, CycleSlipEvent, CycleSlipResult, CycleSlipSignalStats, IonoAccumulator, IonoDcbResult, IonoPoint, IonoRatePoint, IonoRateSeries, IonoResult, IonoSeries, MultipathAccumulator, MultipathPoint, MultipathResult, MultipathSeries, MultipathSignalStat, QualityResult, SatDcbMap, analyzeQuality, applyIonoDcb, computeIonoRate, detrendIonoArcs, parseSinexBiasDcb } from './analysis.cjs';
23
23
  export { AntennaEntry, AntexFile, FrequencyData, frequencyLabel, parseAntex } from './antex.cjs';
package/dist/index.d.ts CHANGED
@@ -17,7 +17,7 @@ export { TrimbleEpoch, TrimbleFrame, TrimbleMeasurement, TrimbleNavResult, Trimb
17
17
  export { BinexEpoch, BinexMeasurement, BinexParseResult, BinexRecord, binexCrc16, binexCrc32, binexCsum8, binexRecords, decodeBinexEph, getBnxi, parseBinex } from './binex.js';
18
18
  export { AllPositionsData, AlmanacPosition, DopValues, EpochSkyData, SatAzEl, SatPoint, SatPosition, VisibilityPass, VisibilityResult, almanacEpochMs, almanacSatPosition, computeAllPositions, computeDop, computeLiveSkyPositions, computeSatPosition, computeVisibility, computeVisibilityFromPositions, dopplerHz, ecefToAzEl, ephInfoToEphemeris, glonassAlmanacEpochMs, glonassAlmanacPosition, glonassPosition, keplerPosition, maskRadForAzimuth, navTimesFromEph, rangeRate, selectEphemeris } from './orbit.js';
19
19
  export { Helmert14, REFERENCE_FRAMES, ReferenceFrame, applyHelmert, dateToEpoch, transformFrame } from './frames.js';
20
- export { AntennaOffset, ArFixedSat, ArOptions, ArResult, ArSat, CorrectionResult, DgnssOptions, DgnssSolution, EphemerisSource, FixedPositionResult, IONO_L1_M_PER_TECU, KlobucharCoeffs, LambdaResult, NetworkFcbResult, NetworkFcbSummary, NlArc, NlFcbResult, PppAntennaModel, PppArc, PppCorrectionConfig, PppCorrections, PppEpoch, PppEpochContext, PppEpochResult, PppFixState, PppOptions, PppSatObs, PppSolution, RawObservation, RtkEpochMeasurements, RtkFloatEngine, RtkFloatOptions, RtkFloatSolution, RtkMeasurement, RtkObsEpoch, RtkObsInput, RtkPostProcessOptions, RtkPostProcessResult, RtkTrackPoint, SatGeom, SbasCorrectionSource, SbasIonoDelay, SbasProcessor, SbasSatCorrection, SppOptions, SppSolution, TropoMapping, WlArc, WlFcbOptions, WlFcbResult, WlObs, buildPppAntenna, createPppCorrections, estimateNarrowlaneFcb, estimateNetworkFcbs, estimateWidelaneFcb, extractWidelaneArcs, fixPppPosition, gimSlantIonoDelayL1, gimVerticalTec, gmst, ionoFree, klobucharDelay, lambdaReduction, lambdaSearch, moonEcef, niellMapping, nlWavelength, postProcessRtk, resolvePppAmbiguities, satClockCorrection, solidEarthTide, solveDgnss, solvePpp, solveSpp, sunEcef, toRtkEpoch, wlWavelength } from './positioning.js';
20
+ export { AntennaOffset, ArFixedSat, ArOptions, ArResult, ArSat, CorrectionResult, DgnssOptions, DgnssSolution, EphemerisSource, FixedPositionResult, IONO_L1_M_PER_TECU, KlobucharCoeffs, LambdaResult, NetworkFcbResult, NetworkFcbSummary, NlArc, NlFcbResult, PppAntennaModel, PppArc, PppCorrectionConfig, PppCorrections, PppEpoch, PppEpochContext, PppEpochResult, PppFixState, PppOptions, PppSatObs, PppSolution, RawObservation, RtkEpochMeasurements, RtkFloatEngine, RtkFloatOptions, RtkFloatSolution, RtkMeasurement, RtkObsEpoch, RtkObsInput, RtkPostProcessOptions, RtkPostProcessResult, RtkTrackPoint, SatGeom, SbasCorrectionSource, SbasIonoDelay, SbasProcessor, SbasSatCorrection, SppOptions, SppSolution, TropoMapping, WlArc, WlFcbOptions, WlFcbResult, WlObs, buildPppAntenna, createPppCorrections, estimateNarrowlaneFcb, estimateNetworkFcbs, estimateWidelaneFcb, extractWidelaneArcs, fixPppPosition, gimSlantIonoDelayL1, gimVerticalTec, gmst, ionoFree, klobucharDelay, lambdaReduction, lambdaSearch, moonEcef, niellMapping, nlWavelength, postProcessRtk, resolvePppAmbiguities, satClockCorrection, sbasProtectionLevels, solidEarthTide, solveDgnss, solvePpp, solveSpp, sunEcef, toRtkEpoch, wlWavelength } from './positioning.js';
21
21
  export { NtripCaster, NtripConnectionInfo, NtripNetwork, NtripStream, NtripStreamConnection, NtripVersion, Sourcetable, SourcetableEntry, connectToMountpoint, fetchSourcetable, parseSourcetable } from './ntrip.js';
22
22
  export { CompleteSatSignal, CompleteSignalStats, CompletenessAccumulator, CompletenessResult, CycleSlipAccumulator, CycleSlipEvent, CycleSlipResult, CycleSlipSignalStats, IonoAccumulator, IonoDcbResult, IonoPoint, IonoRatePoint, IonoRateSeries, IonoResult, IonoSeries, MultipathAccumulator, MultipathPoint, MultipathResult, MultipathSeries, MultipathSignalStat, QualityResult, SatDcbMap, analyzeQuality, applyIonoDcb, computeIonoRate, detrendIonoArcs, parseSinexBiasDcb } from './analysis.js';
23
23
  export { AntennaEntry, AntexFile, FrequencyData, frequencyLabel, parseAntex } from './antex.js';
package/dist/index.js CHANGED
@@ -157,6 +157,7 @@ import {
157
157
  postProcessRtk,
158
158
  resolvePppAmbiguities,
159
159
  satClockCorrection,
160
+ sbasProtectionLevels,
160
161
  solidEarthTide,
161
162
  solveDgnss,
162
163
  solvePpp,
@@ -164,7 +165,7 @@ import {
164
165
  sunEcef,
165
166
  toRtkEpoch,
166
167
  wlWavelength
167
- } from "./chunk-E3QCNJL4.js";
168
+ } from "./chunk-U32IU7RO.js";
168
169
  import "./chunk-WQX354KD.js";
169
170
  import {
170
171
  almanacEpochMs,
@@ -630,6 +631,7 @@ export {
630
631
  rhumbLine,
631
632
  rtcm3Constellation,
632
633
  satClockCorrection,
634
+ sbasProtectionLevels,
633
635
  crc16 as sbfCrc16,
634
636
  scanSbfFrames,
635
637
  selectEphemeris,
@@ -43,6 +43,7 @@ __export(positioning_exports, {
43
43
  postProcessRtk: () => postProcessRtk,
44
44
  resolvePppAmbiguities: () => resolvePppAmbiguities,
45
45
  satClockCorrection: () => satClockCorrection,
46
+ sbasProtectionLevels: () => sbasProtectionLevels,
46
47
  solidEarthTide: () => solidEarthTide,
47
48
  solveDgnss: () => solveDgnss,
48
49
  solvePpp: () => solvePpp,
@@ -3593,6 +3594,65 @@ function sagnac2(pos, travelTimeS) {
3593
3594
  const s = Math.sin(theta);
3594
3595
  return [pos.x * c + pos.y * s, -pos.x * s + pos.y * c, pos.z];
3595
3596
  }
3597
+ function sbasAirTropoVar(elRad) {
3598
+ const elDeg = elRad * 180 / Math.PI;
3599
+ const sigMp = 0.13 + 0.53 * Math.exp(-elDeg / 10);
3600
+ const sigNoise = 0.15 + 0.43 * Math.exp(-elDeg / 6.9);
3601
+ const m = 1.001 / Math.sqrt(2001e-6 + Math.sin(elRad) * Math.sin(elRad));
3602
+ const sigTropo = 0.12 * m;
3603
+ return sigMp * sigMp + sigNoise * sigNoise + sigTropo * sigTropo;
3604
+ }
3605
+ function invertMatrix(A) {
3606
+ const n = A.length;
3607
+ const M = A.map((row, i) => [
3608
+ ...row,
3609
+ ...Array.from({ length: n }, (_, j) => i === j ? 1 : 0)
3610
+ ]);
3611
+ for (let col = 0; col < n; col++) {
3612
+ let piv = col;
3613
+ for (let r = col + 1; r < n; r++)
3614
+ if (Math.abs(M[r][col]) > Math.abs(M[piv][col])) piv = r;
3615
+ if (Math.abs(M[piv][col]) < 1e-12) return null;
3616
+ [M[col], M[piv]] = [M[piv], M[col]];
3617
+ const d = M[col][col];
3618
+ for (let j = 0; j < 2 * n; j++) M[col][j] /= d;
3619
+ for (let r = 0; r < n; r++) {
3620
+ if (r === col) continue;
3621
+ const f = M[r][col];
3622
+ for (let j = 0; j < 2 * n; j++) M[r][j] -= f * M[col][j];
3623
+ }
3624
+ }
3625
+ return M.map((row) => row.slice(n));
3626
+ }
3627
+ function sbasProtectionLevels(sats, opts = {}) {
3628
+ const kH = opts.kH ?? 6;
3629
+ const kV = opts.kV ?? 5.33;
3630
+ if (sats.length < 4) return null;
3631
+ const N = [0, 1, 2, 3].map(() => [0, 0, 0, 0]);
3632
+ for (const s of sats) {
3633
+ if (!(s.variance > 0)) continue;
3634
+ const ce = Math.cos(s.elRad);
3635
+ const g = [
3636
+ ce * Math.sin(s.azRad),
3637
+ ce * Math.cos(s.azRad),
3638
+ Math.sin(s.elRad),
3639
+ 1
3640
+ ];
3641
+ const w = 1 / s.variance;
3642
+ for (let i = 0; i < 4; i++)
3643
+ for (let j = 0; j < 4; j++) N[i][j] += w * g[i] * g[j];
3644
+ }
3645
+ const cov = invertMatrix(N);
3646
+ if (!cov) return null;
3647
+ const dE2 = cov[0][0];
3648
+ const dN2 = cov[1][1];
3649
+ const dEN = cov[0][1];
3650
+ const dU = Math.sqrt(Math.max(cov[2][2], 0));
3651
+ const dMajor = Math.sqrt(
3652
+ (dE2 + dN2) / 2 + Math.sqrt(((dE2 - dN2) / 2) ** 2 + dEN * dEN)
3653
+ );
3654
+ return { hpl: kH * dMajor, vpl: kV * dU, dMajor, dU };
3655
+ }
3596
3656
  function solveLinear(A, b) {
3597
3657
  const n = b.length;
3598
3658
  const M = A.map((row, i) => [...row, b[i]]);
@@ -3649,7 +3709,7 @@ function solveSpp(pseudoranges, ephemerides, timeMs, opts = {}) {
3649
3709
  const sysRows = new Map(systems.map((s) => [s, 0]));
3650
3710
  for (const k of Object.keys(residuals2)) delete residuals2[k];
3651
3711
  const positionSaneIter = x9 * x9 + y2 * y2 + z2 * z2 > 1e12;
3652
- const [rxLat, rxLon, rxHgt] = positionSaneIter ? ecefToGeodetic(x9, y2, z2) : [0, 0, 0];
3712
+ const [rxLat2, rxLon2, rxHgt2] = positionSaneIter ? ecefToGeodetic(x9, y2, z2) : [0, 0, 0];
3653
3713
  for (const prn of prns) {
3654
3714
  const psr = pseudoranges.get(prn);
3655
3715
  const eph = ephemerides.get(prn);
@@ -3688,7 +3748,7 @@ function solveSpp(pseudoranges, ephemerides, timeMs, opts = {}) {
3688
3748
  const sinEl = Math.max(Math.sin(elev), 0.1);
3689
3749
  weight = sinEl * sinEl;
3690
3750
  }
3691
- const tropo = troposphere && positionSane ? tropoDelay2(elev, rxLat, rxHgt) : 0;
3751
+ const tropo = troposphere && positionSane ? tropoDelay2(elev, rxLat2, rxHgt2) : 0;
3692
3752
  let ionoM = 0;
3693
3753
  if ((sbas || gim || iono) && positionSane) {
3694
3754
  let l1M = null;
@@ -3696,18 +3756,18 @@ function solveSpp(pseudoranges, ephemerides, timeMs, opts = {}) {
3696
3756
  const si = sbas.ionoDelay(
3697
3757
  gpsWeek,
3698
3758
  gpsTow,
3699
- rxLat,
3700
- rxLon,
3701
- rxHgt,
3759
+ rxLat2,
3760
+ rxLon2,
3761
+ rxHgt2,
3702
3762
  azim,
3703
3763
  elev
3704
3764
  );
3705
3765
  if (si) l1M = si.delayM;
3706
3766
  }
3707
3767
  if (l1M === null && gim)
3708
- l1M = gimSlantIonoDelayL1(gim, rxLat, rxLon, azim, elev, timeMs);
3768
+ l1M = gimSlantIonoDelayL1(gim, rxLat2, rxLon2, azim, elev, timeMs);
3709
3769
  if (l1M === null && iono) {
3710
- l1M = C_LIGHT * klobucharDelay(iono, rxLat, rxLon, azim, elev, gpsTow);
3770
+ l1M = C_LIGHT * klobucharDelay(iono, rxLat2, rxLon2, azim, elev, gpsTow);
3711
3771
  }
3712
3772
  if (l1M !== null) {
3713
3773
  const f = PRIMARY_FREQ_HZ[sys] ?? F_L12;
@@ -3780,6 +3840,8 @@ function solveSpp(pseudoranges, ephemerides, timeMs, opts = {}) {
3780
3840
  const { x, y, z, clock, residuals, iterations, converged } = inner;
3781
3841
  const used = [];
3782
3842
  const azels = [];
3843
+ const [rxLat, rxLon, rxHgt] = ecefToGeodetic(x, y, z);
3844
+ const sbasRows = [];
3783
3845
  for (const prn of candidates) {
3784
3846
  if (!(prn in residuals)) continue;
3785
3847
  const eph = ephemerides.get(prn);
@@ -3789,8 +3851,27 @@ function solveSpp(pseudoranges, ephemerides, timeMs, opts = {}) {
3789
3851
  if (azel.el >= elevationMaskDeg * Math.PI / 180) {
3790
3852
  used.push(prn);
3791
3853
  azels.push(azel);
3854
+ if (sbas) {
3855
+ const sc = sbas.satCorrection(prn, gpsWeek, gpsTow);
3856
+ const si = sbas.ionoDelay(
3857
+ gpsWeek,
3858
+ gpsTow,
3859
+ rxLat,
3860
+ rxLon,
3861
+ rxHgt,
3862
+ azel.az,
3863
+ azel.el
3864
+ );
3865
+ if (sc && si)
3866
+ sbasRows.push({
3867
+ azRad: azel.az,
3868
+ elRad: azel.el,
3869
+ variance: sc.varM2 + si.varM2 + sbasAirTropoVar(azel.el)
3870
+ });
3871
+ }
3792
3872
  }
3793
3873
  }
3874
+ const pl = sbas ? sbasProtectionLevels(sbasRows) : null;
3794
3875
  return {
3795
3876
  position: [x, y, z],
3796
3877
  clockBias: Object.fromEntries(clock),
@@ -3799,7 +3880,8 @@ function solveSpp(pseudoranges, ephemerides, timeMs, opts = {}) {
3799
3880
  residuals,
3800
3881
  dop: computeDop(azels),
3801
3882
  iterations,
3802
- converged
3883
+ converged,
3884
+ ...pl ? { hpl: pl.hpl, vpl: pl.vpl, sbasSats: sbasRows.length } : sbas ? { sbasSats: sbasRows.length } : {}
3803
3885
  };
3804
3886
  }
3805
3887
  // Annotate the CommonJS export names for ESM import in node:
@@ -3827,6 +3909,7 @@ function solveSpp(pseudoranges, ephemerides, timeMs, opts = {}) {
3827
3909
  postProcessRtk,
3828
3910
  resolvePppAmbiguities,
3829
3911
  satClockCorrection,
3912
+ sbasProtectionLevels,
3830
3913
  solidEarthTide,
3831
3914
  solveDgnss,
3832
3915
  solvePpp,
@@ -1261,6 +1261,15 @@ interface SppSolution {
1261
1261
  dop: DopValues | null;
1262
1262
  iterations: number;
1263
1263
  converged: boolean;
1264
+ /**
1265
+ * SBAS integrity, present only when the `sbas` option was given and enough
1266
+ * corrected satellites were available. Horizontal/vertical protection levels
1267
+ * (m) — the DO-229 statistical error bounds — and the count of SBAS-corrected
1268
+ * satellites they were computed from.
1269
+ */
1270
+ hpl?: number;
1271
+ vpl?: number;
1272
+ sbasSats?: number;
1264
1273
  }
1265
1274
  /**
1266
1275
  * Broadcast satellite clock correction in seconds at time `tMs`
@@ -1273,6 +1282,26 @@ declare function satClockCorrection(eph: Ephemeris, tMs: number): number;
1273
1282
  * Removes the first-order ionospheric delay.
1274
1283
  */
1275
1284
  declare function ionoFree(p1: number, p2: number, f1: number, f2: number): number;
1285
+ /**
1286
+ * SBAS horizontal/vertical protection levels (m) from the per-satellite ENU
1287
+ * geometry and total error variances. HPL = K_H·d_major, VPL = K_V·d_U, where
1288
+ * d_major is the semi-major axis of the horizontal position-error ellipse and
1289
+ * d_U the vertical std, both from the variance-weighted least-squares
1290
+ * covariance (DO-229 §2.1.4.10). Needs ≥ 4 satellites.
1291
+ */
1292
+ declare function sbasProtectionLevels(sats: readonly {
1293
+ azRad: number;
1294
+ elRad: number;
1295
+ variance: number;
1296
+ }[], opts?: {
1297
+ kH?: number;
1298
+ kV?: number;
1299
+ }): {
1300
+ hpl: number;
1301
+ vpl: number;
1302
+ dMajor: number;
1303
+ dU: number;
1304
+ } | null;
1276
1305
  /**
1277
1306
  * Solve receiver position from one epoch of pseudoranges.
1278
1307
  *
@@ -1285,4 +1314,4 @@ declare function ionoFree(p1: number, p2: number, f1: number, f2: number): numbe
1285
1314
  */
1286
1315
  declare function solveSpp(pseudoranges: Map<string, number>, ephemerides: Map<string, Ephemeris>, timeMs: number, opts?: SppOptions): SppSolution | null;
1287
1316
 
1288
- export { type AntennaOffset, type ArFixedSat, type ArOptions, type ArResult, type ArSat, type CorrectionResult, type DgnssOptions, type DgnssSolution, type EphemerisSource, type FixedPositionResult, IONO_L1_M_PER_TECU, type KlobucharCoeffs, type LambdaResult, type NetworkFcbResult, type NetworkFcbSummary, type NlArc, type NlFcbResult, type PppAntennaModel, type PppArc, type PppCorrectionConfig, type PppCorrections, type PppEpoch, type PppEpochContext, type PppEpochResult, type PppFixState, type PppOptions, type PppSatObs, type PppSolution, type RawObservation, type RtkEpochMeasurements, RtkFloatEngine, type RtkFloatOptions, type RtkFloatSolution, type RtkMeasurement, type RtkObsEpoch, type RtkObsInput, type RtkPostProcessOptions, type RtkPostProcessResult, type RtkTrackPoint, type SatGeom, type SbasCorrectionSource, type SbasIonoDelay, SbasProcessor, type SbasSatCorrection, type SppOptions, type SppSolution, type TropoMapping, type WlArc, type WlFcbOptions, type WlFcbResult, type WlObs, buildPppAntenna, createPppCorrections, estimateNarrowlaneFcb, estimateNetworkFcbs, estimateWidelaneFcb, extractWidelaneArcs, fixPppPosition, gimSlantIonoDelayL1, gimVerticalTec, gmst, ionoFree, klobucharDelay, lambdaReduction, lambdaSearch, moonEcef, niellMapping, nlWavelength, postProcessRtk, resolvePppAmbiguities, satClockCorrection, solidEarthTide, solveDgnss, solvePpp, solveSpp, sunEcef, toRtkEpoch, wlWavelength };
1317
+ export { type AntennaOffset, type ArFixedSat, type ArOptions, type ArResult, type ArSat, type CorrectionResult, type DgnssOptions, type DgnssSolution, type EphemerisSource, type FixedPositionResult, IONO_L1_M_PER_TECU, type KlobucharCoeffs, type LambdaResult, type NetworkFcbResult, type NetworkFcbSummary, type NlArc, type NlFcbResult, type PppAntennaModel, type PppArc, type PppCorrectionConfig, type PppCorrections, type PppEpoch, type PppEpochContext, type PppEpochResult, type PppFixState, type PppOptions, type PppSatObs, type PppSolution, type RawObservation, type RtkEpochMeasurements, RtkFloatEngine, type RtkFloatOptions, type RtkFloatSolution, type RtkMeasurement, type RtkObsEpoch, type RtkObsInput, type RtkPostProcessOptions, type RtkPostProcessResult, type RtkTrackPoint, type SatGeom, type SbasCorrectionSource, type SbasIonoDelay, SbasProcessor, type SbasSatCorrection, type SppOptions, type SppSolution, type TropoMapping, type WlArc, type WlFcbOptions, type WlFcbResult, type WlObs, buildPppAntenna, createPppCorrections, estimateNarrowlaneFcb, estimateNetworkFcbs, estimateWidelaneFcb, extractWidelaneArcs, fixPppPosition, gimSlantIonoDelayL1, gimVerticalTec, gmst, ionoFree, klobucharDelay, lambdaReduction, lambdaSearch, moonEcef, niellMapping, nlWavelength, postProcessRtk, resolvePppAmbiguities, satClockCorrection, sbasProtectionLevels, solidEarthTide, solveDgnss, solvePpp, solveSpp, sunEcef, toRtkEpoch, wlWavelength };
@@ -1261,6 +1261,15 @@ interface SppSolution {
1261
1261
  dop: DopValues | null;
1262
1262
  iterations: number;
1263
1263
  converged: boolean;
1264
+ /**
1265
+ * SBAS integrity, present only when the `sbas` option was given and enough
1266
+ * corrected satellites were available. Horizontal/vertical protection levels
1267
+ * (m) — the DO-229 statistical error bounds — and the count of SBAS-corrected
1268
+ * satellites they were computed from.
1269
+ */
1270
+ hpl?: number;
1271
+ vpl?: number;
1272
+ sbasSats?: number;
1264
1273
  }
1265
1274
  /**
1266
1275
  * Broadcast satellite clock correction in seconds at time `tMs`
@@ -1273,6 +1282,26 @@ declare function satClockCorrection(eph: Ephemeris, tMs: number): number;
1273
1282
  * Removes the first-order ionospheric delay.
1274
1283
  */
1275
1284
  declare function ionoFree(p1: number, p2: number, f1: number, f2: number): number;
1285
+ /**
1286
+ * SBAS horizontal/vertical protection levels (m) from the per-satellite ENU
1287
+ * geometry and total error variances. HPL = K_H·d_major, VPL = K_V·d_U, where
1288
+ * d_major is the semi-major axis of the horizontal position-error ellipse and
1289
+ * d_U the vertical std, both from the variance-weighted least-squares
1290
+ * covariance (DO-229 §2.1.4.10). Needs ≥ 4 satellites.
1291
+ */
1292
+ declare function sbasProtectionLevels(sats: readonly {
1293
+ azRad: number;
1294
+ elRad: number;
1295
+ variance: number;
1296
+ }[], opts?: {
1297
+ kH?: number;
1298
+ kV?: number;
1299
+ }): {
1300
+ hpl: number;
1301
+ vpl: number;
1302
+ dMajor: number;
1303
+ dU: number;
1304
+ } | null;
1276
1305
  /**
1277
1306
  * Solve receiver position from one epoch of pseudoranges.
1278
1307
  *
@@ -1285,4 +1314,4 @@ declare function ionoFree(p1: number, p2: number, f1: number, f2: number): numbe
1285
1314
  */
1286
1315
  declare function solveSpp(pseudoranges: Map<string, number>, ephemerides: Map<string, Ephemeris>, timeMs: number, opts?: SppOptions): SppSolution | null;
1287
1316
 
1288
- export { type AntennaOffset, type ArFixedSat, type ArOptions, type ArResult, type ArSat, type CorrectionResult, type DgnssOptions, type DgnssSolution, type EphemerisSource, type FixedPositionResult, IONO_L1_M_PER_TECU, type KlobucharCoeffs, type LambdaResult, type NetworkFcbResult, type NetworkFcbSummary, type NlArc, type NlFcbResult, type PppAntennaModel, type PppArc, type PppCorrectionConfig, type PppCorrections, type PppEpoch, type PppEpochContext, type PppEpochResult, type PppFixState, type PppOptions, type PppSatObs, type PppSolution, type RawObservation, type RtkEpochMeasurements, RtkFloatEngine, type RtkFloatOptions, type RtkFloatSolution, type RtkMeasurement, type RtkObsEpoch, type RtkObsInput, type RtkPostProcessOptions, type RtkPostProcessResult, type RtkTrackPoint, type SatGeom, type SbasCorrectionSource, type SbasIonoDelay, SbasProcessor, type SbasSatCorrection, type SppOptions, type SppSolution, type TropoMapping, type WlArc, type WlFcbOptions, type WlFcbResult, type WlObs, buildPppAntenna, createPppCorrections, estimateNarrowlaneFcb, estimateNetworkFcbs, estimateWidelaneFcb, extractWidelaneArcs, fixPppPosition, gimSlantIonoDelayL1, gimVerticalTec, gmst, ionoFree, klobucharDelay, lambdaReduction, lambdaSearch, moonEcef, niellMapping, nlWavelength, postProcessRtk, resolvePppAmbiguities, satClockCorrection, solidEarthTide, solveDgnss, solvePpp, solveSpp, sunEcef, toRtkEpoch, wlWavelength };
1317
+ export { type AntennaOffset, type ArFixedSat, type ArOptions, type ArResult, type ArSat, type CorrectionResult, type DgnssOptions, type DgnssSolution, type EphemerisSource, type FixedPositionResult, IONO_L1_M_PER_TECU, type KlobucharCoeffs, type LambdaResult, type NetworkFcbResult, type NetworkFcbSummary, type NlArc, type NlFcbResult, type PppAntennaModel, type PppArc, type PppCorrectionConfig, type PppCorrections, type PppEpoch, type PppEpochContext, type PppEpochResult, type PppFixState, type PppOptions, type PppSatObs, type PppSolution, type RawObservation, type RtkEpochMeasurements, RtkFloatEngine, type RtkFloatOptions, type RtkFloatSolution, type RtkMeasurement, type RtkObsEpoch, type RtkObsInput, type RtkPostProcessOptions, type RtkPostProcessResult, type RtkTrackPoint, type SatGeom, type SbasCorrectionSource, type SbasIonoDelay, SbasProcessor, type SbasSatCorrection, type SppOptions, type SppSolution, type TropoMapping, type WlArc, type WlFcbOptions, type WlFcbResult, type WlObs, buildPppAntenna, createPppCorrections, estimateNarrowlaneFcb, estimateNetworkFcbs, estimateWidelaneFcb, extractWidelaneArcs, fixPppPosition, gimSlantIonoDelayL1, gimVerticalTec, gmst, ionoFree, klobucharDelay, lambdaReduction, lambdaSearch, moonEcef, niellMapping, nlWavelength, postProcessRtk, resolvePppAmbiguities, satClockCorrection, sbasProtectionLevels, solidEarthTide, solveDgnss, solvePpp, solveSpp, sunEcef, toRtkEpoch, wlWavelength };
@@ -22,6 +22,7 @@ import {
22
22
  postProcessRtk,
23
23
  resolvePppAmbiguities,
24
24
  satClockCorrection,
25
+ sbasProtectionLevels,
25
26
  solidEarthTide,
26
27
  solveDgnss,
27
28
  solvePpp,
@@ -29,7 +30,7 @@ import {
29
30
  sunEcef,
30
31
  toRtkEpoch,
31
32
  wlWavelength
32
- } from "./chunk-E3QCNJL4.js";
33
+ } from "./chunk-U32IU7RO.js";
33
34
  import "./chunk-WQX354KD.js";
34
35
  import "./chunk-MHGNKSSH.js";
35
36
  import "./chunk-MIIM4LDY.js";
@@ -65,6 +66,7 @@ export {
65
66
  postProcessRtk,
66
67
  resolvePppAmbiguities,
67
68
  satClockCorrection,
69
+ sbasProtectionLevels,
68
70
  solidEarthTide,
69
71
  solveDgnss,
70
72
  solvePpp,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gnss-js",
3
- "version": "1.51.0",
3
+ "version": "1.52.0",
4
4
  "description": "Comprehensive GNSS library for JavaScript — time scales, coordinates, RINEX parsing, RTCM3 decoding, orbit computation, and signal analysis",
5
5
  "type": "module",
6
6
  "sideEffects": false,