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.
- package/dist/{chunk-E3QCNJL4.js → chunk-U32IU7RO.js} +90 -8
- package/dist/index.cjs +91 -8
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +3 -1
- package/dist/positioning.cjs +91 -8
- package/dist/positioning.d.cts +30 -1
- package/dist/positioning.d.ts +30 -1
- package/dist/positioning.js +3 -1
- package/package.json +1 -1
|
@@ -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 [
|
|
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,
|
|
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
|
-
|
|
3155
|
-
|
|
3156
|
-
|
|
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,
|
|
3222
|
+
l1M = gimSlantIonoDelayL1(gim, rxLat2, rxLon2, azim, elev, timeMs);
|
|
3164
3223
|
if (l1M === null && iono) {
|
|
3165
|
-
l1M = C_LIGHT * klobucharDelay(iono,
|
|
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 [
|
|
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,
|
|
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
|
-
|
|
15085
|
-
|
|
15086
|
-
|
|
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,
|
|
15153
|
+
l1M = gimSlantIonoDelayL1(gim, rxLat2, rxLon2, azim, elev, timeMs);
|
|
15094
15154
|
if (l1M === null && iono) {
|
|
15095
|
-
l1M = C_LIGHT * klobucharDelay(iono,
|
|
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-
|
|
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,
|
package/dist/positioning.cjs
CHANGED
|
@@ -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 [
|
|
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,
|
|
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
|
-
|
|
3700
|
-
|
|
3701
|
-
|
|
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,
|
|
3768
|
+
l1M = gimSlantIonoDelayL1(gim, rxLat2, rxLon2, azim, elev, timeMs);
|
|
3709
3769
|
if (l1M === null && iono) {
|
|
3710
|
-
l1M = C_LIGHT * klobucharDelay(iono,
|
|
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,
|
package/dist/positioning.d.cts
CHANGED
|
@@ -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 };
|
package/dist/positioning.d.ts
CHANGED
|
@@ -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 };
|
package/dist/positioning.js
CHANGED
|
@@ -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-
|
|
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.
|
|
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,
|