gnss-js 1.34.0 → 1.35.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.
@@ -2221,6 +2221,39 @@ function estimateNarrowlaneFcb(arcs, wl, opts = {}) {
2221
2221
  const res = decomposeFcb(entries, { fixWindow: 0.15, ...opts });
2222
2222
  return { ...res, usedArcs: entries.length, wlRejected };
2223
2223
  }
2224
+ function estimateNetworkFcbs(arcs, opts = {}) {
2225
+ const minArcEpochs = opts.minArcEpochs ?? 120;
2226
+ const minWlObs = opts.minWlObs ?? 40;
2227
+ const fixWindow = opts.fixWindow ?? 0.15;
2228
+ const satWlFcb = /* @__PURE__ */ new Map();
2229
+ const satNlFcb = /* @__PURE__ */ new Map();
2230
+ const perSystem = {};
2231
+ const systems = [...new Set(arcs.map((a) => a.prn[0]))].sort();
2232
+ for (const sys of systems) {
2233
+ const sysArcs = arcs.filter((a) => a.prn[0] === sys);
2234
+ const wlArcs = sysArcs.filter((a) => a.nEpochs >= minWlObs).map((a) => ({
2235
+ station: a.station,
2236
+ prn: a.prn,
2237
+ wlFloat: a.mwCyc,
2238
+ nObs: a.nEpochs
2239
+ }));
2240
+ if (wlArcs.length < 3) continue;
2241
+ const wl = estimateWidelaneFcb(wlArcs, { fixWindow });
2242
+ const nlInput = sysArcs.filter((a) => a.nEpochs >= minArcEpochs);
2243
+ const nl = estimateNarrowlaneFcb(nlInput, wl, { fixWindow });
2244
+ for (const [prn, v] of wl.satFcb) satWlFcb.set(prn, v);
2245
+ for (const [prn, v] of nl.satFcb) satNlFcb.set(prn, v);
2246
+ perSystem[sys] = {
2247
+ wlFixRate: wl.fixRate,
2248
+ wlResidRms: wl.residRms,
2249
+ nlUsedArcs: nl.usedArcs,
2250
+ nlFixRate: nl.fixRate,
2251
+ nlResidRms: nl.residRms,
2252
+ wlRejected: nl.wlRejected
2253
+ };
2254
+ }
2255
+ return { satWlFcb, satNlFcb, perSystem };
2256
+ }
2224
2257
 
2225
2258
  // src/positioning/index.ts
2226
2259
  var GM_GPS = 3986005e8;
@@ -2474,6 +2507,7 @@ export {
2474
2507
  extractWidelaneArcs,
2475
2508
  estimateWidelaneFcb,
2476
2509
  estimateNarrowlaneFcb,
2510
+ estimateNetworkFcbs,
2477
2511
  satClockCorrection,
2478
2512
  ionoFree,
2479
2513
  solveSpp
package/dist/index.cjs CHANGED
@@ -150,6 +150,7 @@ __export(src_exports, {
150
150
  ecefToGeodetic: () => ecefToGeodetic,
151
151
  ephInfoToEphemeris: () => ephInfoToEphemeris,
152
152
  estimateNarrowlaneFcb: () => estimateNarrowlaneFcb,
153
+ estimateNetworkFcbs: () => estimateNetworkFcbs,
153
154
  estimateWidelaneFcb: () => estimateWidelaneFcb,
154
155
  euclidean3D: () => euclidean3D,
155
156
  extractWidelaneArcs: () => extractWidelaneArcs,
@@ -13618,6 +13619,39 @@ function estimateNarrowlaneFcb(arcs, wl, opts = {}) {
13618
13619
  const res = decomposeFcb(entries, { fixWindow: 0.15, ...opts });
13619
13620
  return { ...res, usedArcs: entries.length, wlRejected };
13620
13621
  }
13622
+ function estimateNetworkFcbs(arcs, opts = {}) {
13623
+ const minArcEpochs = opts.minArcEpochs ?? 120;
13624
+ const minWlObs = opts.minWlObs ?? 40;
13625
+ const fixWindow = opts.fixWindow ?? 0.15;
13626
+ const satWlFcb = /* @__PURE__ */ new Map();
13627
+ const satNlFcb = /* @__PURE__ */ new Map();
13628
+ const perSystem = {};
13629
+ const systems = [...new Set(arcs.map((a) => a.prn[0]))].sort();
13630
+ for (const sys of systems) {
13631
+ const sysArcs = arcs.filter((a) => a.prn[0] === sys);
13632
+ const wlArcs = sysArcs.filter((a) => a.nEpochs >= minWlObs).map((a) => ({
13633
+ station: a.station,
13634
+ prn: a.prn,
13635
+ wlFloat: a.mwCyc,
13636
+ nObs: a.nEpochs
13637
+ }));
13638
+ if (wlArcs.length < 3) continue;
13639
+ const wl = estimateWidelaneFcb(wlArcs, { fixWindow });
13640
+ const nlInput = sysArcs.filter((a) => a.nEpochs >= minArcEpochs);
13641
+ const nl = estimateNarrowlaneFcb(nlInput, wl, { fixWindow });
13642
+ for (const [prn, v] of wl.satFcb) satWlFcb.set(prn, v);
13643
+ for (const [prn, v] of nl.satFcb) satNlFcb.set(prn, v);
13644
+ perSystem[sys] = {
13645
+ wlFixRate: wl.fixRate,
13646
+ wlResidRms: wl.residRms,
13647
+ nlUsedArcs: nl.usedArcs,
13648
+ nlFixRate: nl.fixRate,
13649
+ nlResidRms: nl.residRms,
13650
+ wlRejected: nl.wlRejected
13651
+ };
13652
+ }
13653
+ return { satWlFcb, satNlFcb, perSystem };
13654
+ }
13621
13655
 
13622
13656
  // src/positioning/index.ts
13623
13657
  var GM_GPS3 = 3986005e8;
@@ -16237,6 +16271,7 @@ function computePsdDb(centerMHz, halfSpanChips, numPoints, psdFn, f0 = 1023e3, f
16237
16271
  ecefToGeodetic,
16238
16272
  ephInfoToEphemeris,
16239
16273
  estimateNarrowlaneFcb,
16274
+ estimateNetworkFcbs,
16240
16275
  estimateWidelaneFcb,
16241
16276
  euclidean3D,
16242
16277
  extractWidelaneArcs,
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, IONO_L1_M_PER_TECU, KlobucharCoeffs, LambdaResult, NlArc, NlFcbResult, PppAntennaModel, PppArc, PppCorrectionConfig, PppCorrections, PppEpoch, PppEpochContext, PppEpochResult, PppOptions, PppSatObs, PppSolution, RawObservation, RtkEpochMeasurements, RtkFloatEngine, RtkFloatOptions, RtkFloatSolution, RtkMeasurement, SatGeom, SppOptions, SppSolution, TropoMapping, WlArc, WlFcbOptions, WlFcbResult, WlObs, buildPppAntenna, createPppCorrections, estimateNarrowlaneFcb, estimateWidelaneFcb, extractWidelaneArcs, gimSlantIonoDelayL1, gimVerticalTec, gmst, ionoFree, klobucharDelay, lambdaReduction, lambdaSearch, moonEcef, niellMapping, nlWavelength, resolvePppAmbiguities, satClockCorrection, solidEarthTide, solveDgnss, solvePpp, solveSpp, sunEcef, toRtkEpoch, wlWavelength } from './positioning.cjs';
20
+ export { AntennaOffset, ArFixedSat, ArOptions, ArResult, ArSat, CorrectionResult, DgnssOptions, DgnssSolution, EphemerisSource, IONO_L1_M_PER_TECU, KlobucharCoeffs, LambdaResult, NetworkFcbResult, NetworkFcbSummary, NlArc, NlFcbResult, PppAntennaModel, PppArc, PppCorrectionConfig, PppCorrections, PppEpoch, PppEpochContext, PppEpochResult, PppOptions, PppSatObs, PppSolution, RawObservation, RtkEpochMeasurements, RtkFloatEngine, RtkFloatOptions, RtkFloatSolution, RtkMeasurement, SatGeom, SppOptions, SppSolution, TropoMapping, WlArc, WlFcbOptions, WlFcbResult, WlObs, buildPppAntenna, createPppCorrections, estimateNarrowlaneFcb, estimateNetworkFcbs, estimateWidelaneFcb, extractWidelaneArcs, gimSlantIonoDelayL1, gimVerticalTec, gmst, ionoFree, klobucharDelay, lambdaReduction, lambdaSearch, moonEcef, niellMapping, nlWavelength, resolvePppAmbiguities, satClockCorrection, 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, IONO_L1_M_PER_TECU, KlobucharCoeffs, LambdaResult, NlArc, NlFcbResult, PppAntennaModel, PppArc, PppCorrectionConfig, PppCorrections, PppEpoch, PppEpochContext, PppEpochResult, PppOptions, PppSatObs, PppSolution, RawObservation, RtkEpochMeasurements, RtkFloatEngine, RtkFloatOptions, RtkFloatSolution, RtkMeasurement, SatGeom, SppOptions, SppSolution, TropoMapping, WlArc, WlFcbOptions, WlFcbResult, WlObs, buildPppAntenna, createPppCorrections, estimateNarrowlaneFcb, estimateWidelaneFcb, extractWidelaneArcs, gimSlantIonoDelayL1, gimVerticalTec, gmst, ionoFree, klobucharDelay, lambdaReduction, lambdaSearch, moonEcef, niellMapping, nlWavelength, resolvePppAmbiguities, satClockCorrection, solidEarthTide, solveDgnss, solvePpp, solveSpp, sunEcef, toRtkEpoch, wlWavelength } from './positioning.js';
20
+ export { AntennaOffset, ArFixedSat, ArOptions, ArResult, ArSat, CorrectionResult, DgnssOptions, DgnssSolution, EphemerisSource, IONO_L1_M_PER_TECU, KlobucharCoeffs, LambdaResult, NetworkFcbResult, NetworkFcbSummary, NlArc, NlFcbResult, PppAntennaModel, PppArc, PppCorrectionConfig, PppCorrections, PppEpoch, PppEpochContext, PppEpochResult, PppOptions, PppSatObs, PppSolution, RawObservation, RtkEpochMeasurements, RtkFloatEngine, RtkFloatOptions, RtkFloatSolution, RtkMeasurement, SatGeom, SppOptions, SppSolution, TropoMapping, WlArc, WlFcbOptions, WlFcbResult, WlObs, buildPppAntenna, createPppCorrections, estimateNarrowlaneFcb, estimateNetworkFcbs, estimateWidelaneFcb, extractWidelaneArcs, gimSlantIonoDelayL1, gimVerticalTec, gmst, ionoFree, klobucharDelay, lambdaReduction, lambdaSearch, moonEcef, niellMapping, nlWavelength, resolvePppAmbiguities, satClockCorrection, 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
@@ -147,6 +147,7 @@ import {
147
147
  buildPppAntenna,
148
148
  createPppCorrections,
149
149
  estimateNarrowlaneFcb,
150
+ estimateNetworkFcbs,
150
151
  estimateWidelaneFcb,
151
152
  extractWidelaneArcs,
152
153
  gimSlantIonoDelayL1,
@@ -168,7 +169,7 @@ import {
168
169
  sunEcef,
169
170
  toRtkEpoch,
170
171
  wlWavelength
171
- } from "./chunk-H73PZB5C.js";
172
+ } from "./chunk-BLGBMRX7.js";
172
173
  import {
173
174
  almanacEpochMs,
174
175
  almanacSatPosition,
@@ -476,6 +477,7 @@ export {
476
477
  ecefToGeodetic,
477
478
  ephInfoToEphemeris,
478
479
  estimateNarrowlaneFcb,
480
+ estimateNetworkFcbs,
479
481
  estimateWidelaneFcb,
480
482
  euclidean3D,
481
483
  extractWidelaneArcs,
@@ -25,6 +25,7 @@ __export(positioning_exports, {
25
25
  buildPppAntenna: () => buildPppAntenna,
26
26
  createPppCorrections: () => createPppCorrections,
27
27
  estimateNarrowlaneFcb: () => estimateNarrowlaneFcb,
28
+ estimateNetworkFcbs: () => estimateNetworkFcbs,
28
29
  estimateWidelaneFcb: () => estimateWidelaneFcb,
29
30
  extractWidelaneArcs: () => extractWidelaneArcs,
30
31
  gimSlantIonoDelayL1: () => gimSlantIonoDelayL1,
@@ -2746,6 +2747,39 @@ function estimateNarrowlaneFcb(arcs, wl, opts = {}) {
2746
2747
  const res = decomposeFcb(entries, { fixWindow: 0.15, ...opts });
2747
2748
  return { ...res, usedArcs: entries.length, wlRejected };
2748
2749
  }
2750
+ function estimateNetworkFcbs(arcs, opts = {}) {
2751
+ const minArcEpochs = opts.minArcEpochs ?? 120;
2752
+ const minWlObs = opts.minWlObs ?? 40;
2753
+ const fixWindow = opts.fixWindow ?? 0.15;
2754
+ const satWlFcb = /* @__PURE__ */ new Map();
2755
+ const satNlFcb = /* @__PURE__ */ new Map();
2756
+ const perSystem = {};
2757
+ const systems = [...new Set(arcs.map((a) => a.prn[0]))].sort();
2758
+ for (const sys of systems) {
2759
+ const sysArcs = arcs.filter((a) => a.prn[0] === sys);
2760
+ const wlArcs = sysArcs.filter((a) => a.nEpochs >= minWlObs).map((a) => ({
2761
+ station: a.station,
2762
+ prn: a.prn,
2763
+ wlFloat: a.mwCyc,
2764
+ nObs: a.nEpochs
2765
+ }));
2766
+ if (wlArcs.length < 3) continue;
2767
+ const wl = estimateWidelaneFcb(wlArcs, { fixWindow });
2768
+ const nlInput = sysArcs.filter((a) => a.nEpochs >= minArcEpochs);
2769
+ const nl = estimateNarrowlaneFcb(nlInput, wl, { fixWindow });
2770
+ for (const [prn, v] of wl.satFcb) satWlFcb.set(prn, v);
2771
+ for (const [prn, v] of nl.satFcb) satNlFcb.set(prn, v);
2772
+ perSystem[sys] = {
2773
+ wlFixRate: wl.fixRate,
2774
+ wlResidRms: wl.residRms,
2775
+ nlUsedArcs: nl.usedArcs,
2776
+ nlFixRate: nl.fixRate,
2777
+ nlResidRms: nl.residRms,
2778
+ wlRejected: nl.wlRejected
2779
+ };
2780
+ }
2781
+ return { satWlFcb, satNlFcb, perSystem };
2782
+ }
2749
2783
 
2750
2784
  // src/positioning/index.ts
2751
2785
  var GM_GPS2 = 3986005e8;
@@ -2981,6 +3015,7 @@ function solveSpp(pseudoranges, ephemerides, timeMs, opts = {}) {
2981
3015
  buildPppAntenna,
2982
3016
  createPppCorrections,
2983
3017
  estimateNarrowlaneFcb,
3018
+ estimateNetworkFcbs,
2984
3019
  estimateWidelaneFcb,
2985
3020
  extractWidelaneArcs,
2986
3021
  gimSlantIonoDelayL1,
@@ -932,6 +932,40 @@ interface NlFcbResult extends WlFcbResult {
932
932
  * — the fix rate is the honest measure of how close the network is to cm.
933
933
  */
934
934
  declare function estimateNarrowlaneFcb(arcs: NlArc[], wl: WlFcbResult, opts?: WlFcbOptions): NlFcbResult;
935
+ interface NetworkFcbSummary {
936
+ wlFixRate: number;
937
+ wlResidRms: number;
938
+ nlUsedArcs: number;
939
+ nlFixRate: number;
940
+ nlResidRms: number;
941
+ wlRejected: number;
942
+ }
943
+ interface NetworkFcbResult {
944
+ /** Per-satellite wide-lane FCB (cycles), all constellations merged. */
945
+ satWlFcb: Map<string, number>;
946
+ /** Per-satellite narrow-lane FCB (cycles), all constellations merged. */
947
+ satNlFcb: Map<string, number>;
948
+ /** Per-constellation fix-rate / residual summary, keyed by system letter. */
949
+ perSystem: Record<string, NetworkFcbSummary>;
950
+ }
951
+ /**
952
+ * Full network FCB calibration for PPP-AR from a set of `solvePpp` arcs (each
953
+ * tagged with its station), **per constellation** — the receiver wide- and
954
+ * narrow-lane biases are system-specific, so lumping GPS/Galileo/BeiDou under
955
+ * one datum corrupts the fit. Runs the wide-lane then narrow-lane
956
+ * decomposition for each system and merges the per-satellite biases.
957
+ *
958
+ * The satellite FCBs (`satWlFcb`/`satNlFcb`) are the reusable product: a rover
959
+ * applies them and solves only its own receiver bias. Multi-GNSS input
960
+ * multiplies the fixable arcs (Galileo roughly doubles GPS-only) without
961
+ * changing per-arc behaviour — each satellite's arc length is independent of
962
+ * how many constellations are present.
963
+ */
964
+ declare function estimateNetworkFcbs(arcs: NlArc[], opts?: {
965
+ minArcEpochs?: number;
966
+ minWlObs?: number;
967
+ fixWindow?: number;
968
+ }): NetworkFcbResult;
935
969
 
936
970
  /**
937
971
  * Single-point positioning (SPP) from pseudoranges and broadcast
@@ -1022,4 +1056,4 @@ declare function ionoFree(p1: number, p2: number, f1: number, f2: number): numbe
1022
1056
  */
1023
1057
  declare function solveSpp(pseudoranges: Map<string, number>, ephemerides: Map<string, Ephemeris>, timeMs: number, opts?: SppOptions): SppSolution | null;
1024
1058
 
1025
- export { type AntennaOffset, type ArFixedSat, type ArOptions, type ArResult, type ArSat, type CorrectionResult, type DgnssOptions, type DgnssSolution, type EphemerisSource, IONO_L1_M_PER_TECU, type KlobucharCoeffs, type LambdaResult, type NlArc, type NlFcbResult, type PppAntennaModel, type PppArc, type PppCorrectionConfig, type PppCorrections, type PppEpoch, type PppEpochContext, type PppEpochResult, type PppOptions, type PppSatObs, type PppSolution, type RawObservation, type RtkEpochMeasurements, RtkFloatEngine, type RtkFloatOptions, type RtkFloatSolution, type RtkMeasurement, type SatGeom, type SppOptions, type SppSolution, type TropoMapping, type WlArc, type WlFcbOptions, type WlFcbResult, type WlObs, buildPppAntenna, createPppCorrections, estimateNarrowlaneFcb, estimateWidelaneFcb, extractWidelaneArcs, gimSlantIonoDelayL1, gimVerticalTec, gmst, ionoFree, klobucharDelay, lambdaReduction, lambdaSearch, moonEcef, niellMapping, nlWavelength, resolvePppAmbiguities, satClockCorrection, solidEarthTide, solveDgnss, solvePpp, solveSpp, sunEcef, toRtkEpoch, wlWavelength };
1059
+ export { type AntennaOffset, type ArFixedSat, type ArOptions, type ArResult, type ArSat, type CorrectionResult, type DgnssOptions, type DgnssSolution, type EphemerisSource, 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 PppOptions, type PppSatObs, type PppSolution, type RawObservation, type RtkEpochMeasurements, RtkFloatEngine, type RtkFloatOptions, type RtkFloatSolution, type RtkMeasurement, type SatGeom, type SppOptions, type SppSolution, type TropoMapping, type WlArc, type WlFcbOptions, type WlFcbResult, type WlObs, buildPppAntenna, createPppCorrections, estimateNarrowlaneFcb, estimateNetworkFcbs, estimateWidelaneFcb, extractWidelaneArcs, gimSlantIonoDelayL1, gimVerticalTec, gmst, ionoFree, klobucharDelay, lambdaReduction, lambdaSearch, moonEcef, niellMapping, nlWavelength, resolvePppAmbiguities, satClockCorrection, solidEarthTide, solveDgnss, solvePpp, solveSpp, sunEcef, toRtkEpoch, wlWavelength };
@@ -932,6 +932,40 @@ interface NlFcbResult extends WlFcbResult {
932
932
  * — the fix rate is the honest measure of how close the network is to cm.
933
933
  */
934
934
  declare function estimateNarrowlaneFcb(arcs: NlArc[], wl: WlFcbResult, opts?: WlFcbOptions): NlFcbResult;
935
+ interface NetworkFcbSummary {
936
+ wlFixRate: number;
937
+ wlResidRms: number;
938
+ nlUsedArcs: number;
939
+ nlFixRate: number;
940
+ nlResidRms: number;
941
+ wlRejected: number;
942
+ }
943
+ interface NetworkFcbResult {
944
+ /** Per-satellite wide-lane FCB (cycles), all constellations merged. */
945
+ satWlFcb: Map<string, number>;
946
+ /** Per-satellite narrow-lane FCB (cycles), all constellations merged. */
947
+ satNlFcb: Map<string, number>;
948
+ /** Per-constellation fix-rate / residual summary, keyed by system letter. */
949
+ perSystem: Record<string, NetworkFcbSummary>;
950
+ }
951
+ /**
952
+ * Full network FCB calibration for PPP-AR from a set of `solvePpp` arcs (each
953
+ * tagged with its station), **per constellation** — the receiver wide- and
954
+ * narrow-lane biases are system-specific, so lumping GPS/Galileo/BeiDou under
955
+ * one datum corrupts the fit. Runs the wide-lane then narrow-lane
956
+ * decomposition for each system and merges the per-satellite biases.
957
+ *
958
+ * The satellite FCBs (`satWlFcb`/`satNlFcb`) are the reusable product: a rover
959
+ * applies them and solves only its own receiver bias. Multi-GNSS input
960
+ * multiplies the fixable arcs (Galileo roughly doubles GPS-only) without
961
+ * changing per-arc behaviour — each satellite's arc length is independent of
962
+ * how many constellations are present.
963
+ */
964
+ declare function estimateNetworkFcbs(arcs: NlArc[], opts?: {
965
+ minArcEpochs?: number;
966
+ minWlObs?: number;
967
+ fixWindow?: number;
968
+ }): NetworkFcbResult;
935
969
 
936
970
  /**
937
971
  * Single-point positioning (SPP) from pseudoranges and broadcast
@@ -1022,4 +1056,4 @@ declare function ionoFree(p1: number, p2: number, f1: number, f2: number): numbe
1022
1056
  */
1023
1057
  declare function solveSpp(pseudoranges: Map<string, number>, ephemerides: Map<string, Ephemeris>, timeMs: number, opts?: SppOptions): SppSolution | null;
1024
1058
 
1025
- export { type AntennaOffset, type ArFixedSat, type ArOptions, type ArResult, type ArSat, type CorrectionResult, type DgnssOptions, type DgnssSolution, type EphemerisSource, IONO_L1_M_PER_TECU, type KlobucharCoeffs, type LambdaResult, type NlArc, type NlFcbResult, type PppAntennaModel, type PppArc, type PppCorrectionConfig, type PppCorrections, type PppEpoch, type PppEpochContext, type PppEpochResult, type PppOptions, type PppSatObs, type PppSolution, type RawObservation, type RtkEpochMeasurements, RtkFloatEngine, type RtkFloatOptions, type RtkFloatSolution, type RtkMeasurement, type SatGeom, type SppOptions, type SppSolution, type TropoMapping, type WlArc, type WlFcbOptions, type WlFcbResult, type WlObs, buildPppAntenna, createPppCorrections, estimateNarrowlaneFcb, estimateWidelaneFcb, extractWidelaneArcs, gimSlantIonoDelayL1, gimVerticalTec, gmst, ionoFree, klobucharDelay, lambdaReduction, lambdaSearch, moonEcef, niellMapping, nlWavelength, resolvePppAmbiguities, satClockCorrection, solidEarthTide, solveDgnss, solvePpp, solveSpp, sunEcef, toRtkEpoch, wlWavelength };
1059
+ export { type AntennaOffset, type ArFixedSat, type ArOptions, type ArResult, type ArSat, type CorrectionResult, type DgnssOptions, type DgnssSolution, type EphemerisSource, 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 PppOptions, type PppSatObs, type PppSolution, type RawObservation, type RtkEpochMeasurements, RtkFloatEngine, type RtkFloatOptions, type RtkFloatSolution, type RtkMeasurement, type SatGeom, type SppOptions, type SppSolution, type TropoMapping, type WlArc, type WlFcbOptions, type WlFcbResult, type WlObs, buildPppAntenna, createPppCorrections, estimateNarrowlaneFcb, estimateNetworkFcbs, estimateWidelaneFcb, extractWidelaneArcs, gimSlantIonoDelayL1, gimVerticalTec, gmst, ionoFree, klobucharDelay, lambdaReduction, lambdaSearch, moonEcef, niellMapping, nlWavelength, resolvePppAmbiguities, satClockCorrection, solidEarthTide, solveDgnss, solvePpp, solveSpp, sunEcef, toRtkEpoch, wlWavelength };
@@ -4,6 +4,7 @@ import {
4
4
  buildPppAntenna,
5
5
  createPppCorrections,
6
6
  estimateNarrowlaneFcb,
7
+ estimateNetworkFcbs,
7
8
  estimateWidelaneFcb,
8
9
  extractWidelaneArcs,
9
10
  gimSlantIonoDelayL1,
@@ -25,7 +26,7 @@ import {
25
26
  sunEcef,
26
27
  toRtkEpoch,
27
28
  wlWavelength
28
- } from "./chunk-H73PZB5C.js";
29
+ } from "./chunk-BLGBMRX7.js";
29
30
  import "./chunk-MHGNKSSH.js";
30
31
  import "./chunk-37QNKGTC.js";
31
32
  import "./chunk-6FAL6P4G.js";
@@ -39,6 +40,7 @@ export {
39
40
  buildPppAntenna,
40
41
  createPppCorrections,
41
42
  estimateNarrowlaneFcb,
43
+ estimateNetworkFcbs,
42
44
  estimateWidelaneFcb,
43
45
  extractWidelaneArcs,
44
46
  gimSlantIonoDelayL1,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gnss-js",
3
- "version": "1.34.0",
3
+ "version": "1.35.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,