Skip to content

Commit 15811d0

Browse files
committed
rinex lib upgrade
Signed-off-by: Guillaume W. Bres <[email protected]>
1 parent 50814f4 commit 15811d0

File tree

6 files changed

+78
-167
lines changed

6 files changed

+78
-167
lines changed

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ categories = ["science", "science::geo"]
1111
edition = "2021"
1212

1313
[features]
14-
default = [] # no features by default
14+
default = ["sp3"] # no features by default
1515

1616
# Unlock support of high precision SP3 files.
1717
# When targetting highest precision analysis and solutions, like in PPP,
@@ -47,7 +47,7 @@ plotly = "0.12"
4747

4848
rinex = { git = "https://github.com/georust/rinex", branch = "main", features = ["qc", "processing", "obs", "clock", "nav", "ionex", "serde"] }
4949

50-
sp3 = { git = "https://github.com/georust/rinex", branch = "main", features = ["qc", "processing", "serde"], optional = true }
50+
sp3 = { git = "https://github.com/georust/rinex", branch = "main", features = ["qc", "processing", "anise", "serde"], optional = true }
5151

5252
[dev-dependencies]
5353
serde_json = "1"

src/context.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,7 @@ impl QcContext {
378378
pub fn timescale(&self) -> Option<TimeScale> {
379379
#[cfg(feature = "sp3")]
380380
if let Some(sp3) = self.sp3() {
381-
return Some(sp3.time_scale);
381+
return Some(sp3.header.timescale);
382382
}
383383

384384
if let Some(obs) = self.observation() {
@@ -600,7 +600,7 @@ impl QcContext {
600600
/// Returns true if High Precision Orbits also contains temporal information.
601601
pub fn sp3_has_clock(&self) -> bool {
602602
if let Some(sp3) = self.sp3() {
603-
sp3.sv_clock().count() > 0
603+
sp3.has_satellite_clock_offset()
604604
} else {
605605
false
606606
}

src/report/mod.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -226,11 +226,7 @@ impl QcReport {
226226
#[cfg(feature = "sp3")]
227227
orbit: {
228228
if (context.has_sp3() || context.has_brdc_navigation()) && !summary_only {
229-
Some(OrbitReport::new(
230-
context,
231-
ref_position,
232-
cfg.force_brdc_skyplot,
233-
))
229+
Some(OrbitReport::new(context, ref_position))
234230
} else {
235231
None
236232
}

src/report/orbit.rs

Lines changed: 55 additions & 142 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
1-
use rinex::{
2-
navigation::Ephemeris,
3-
prelude::{nav::Orbit, Constellation, Epoch, Rinex, SV},
4-
};
1+
use rinex::prelude::{nav::Orbit, Constellation, Epoch, Rinex, SV};
52
use std::collections::{BTreeMap, HashMap};
63

74
use qc_traits::{Filter, Preprocessing};
@@ -25,15 +22,17 @@ struct BrdcSp3Report {
2522
impl BrdcSp3Report {
2623
fn new(sp3: &SP3, brdc: &Rinex) -> Self {
2724
let mut errors = BTreeMap::<SV, Vec<(Epoch, f64, f64, f64)>>::new();
28-
for (t_sp3, sv_sp3, (sp3_x, sp3_y, sp3_z)) in sp3.sv_position() {
25+
for (t_sp3, sv_sp3, (sp3_x_km, sp3_y_km, sp3_z_km)) in sp3.satellites_position_km_iter() {
2926
if let Some(brdc_orb) = brdc.sv_orbit(sv_sp3, t_sp3) {
3027
let brdc_state = brdc_orb.to_cartesian_pos_vel();
31-
let (brdc_x, brdc_y, brdc_z) = (brdc_state[0], brdc_state[1], brdc_state[2]);
28+
let (nav_x_km, nav_y_km, nav_z_km) = (brdc_state[0], brdc_state[1], brdc_state[2]);
29+
3230
let (err_x_m, err_y_m, err_z_m) = (
33-
(brdc_x - sp3_x) * 1000.0,
34-
(brdc_y - sp3_y) * 1000.0,
35-
(brdc_z - sp3_z) * 1000.0,
31+
(nav_x_km - sp3_x_km) * 1000.0,
32+
(nav_y_km - sp3_y_km) * 1000.0,
33+
(nav_z_km - sp3_z_km) * 1000.0,
3634
);
35+
3736
if let Some(errors) = errors.get_mut(&sv_sp3) {
3837
errors.push((t_sp3, err_x_m, err_y_m, err_z_m));
3938
} else {
@@ -158,88 +157,54 @@ pub struct OrbitReport {
158157
}
159158

160159
impl OrbitReport {
161-
pub fn new(ctx: &QcContext, reference: Option<Orbit>, force_brdc_sky: bool) -> Self {
162-
let (x0_km, y0_km, z0_km) = match reference {
163-
Some(orbit) => {
164-
let pos_vel = orbit.to_cartesian_pos_vel();
165-
(pos_vel[0], pos_vel[1], pos_vel[2])
166-
}
167-
None => (0.0, 0.0, 0.0),
168-
};
169-
170-
// TODO: brdc needs a timeserie..
171-
#[cfg(feature = "sp3")]
172-
let brdc_skyplot = ctx.has_brdc_navigation() && ctx.has_sp3() && force_brdc_sky;
173-
174-
#[cfg(not(feature = "sp3"))]
175-
let brdc_skyplot = ctx.has_brdc_navigation();
176-
177-
let max_sv_visible = if brdc_skyplot { 2 } else { 4 };
178-
160+
pub fn new(ctx: &QcContext, reference: Option<Orbit>) -> Self {
179161
let mut t_sp3 = BTreeMap::<SV, Vec<Epoch>>::new();
180162
let mut elev_sp3 = BTreeMap::<SV, Vec<f64>>::new();
181163
let mut azim_sp3 = BTreeMap::<SV, Vec<f64>>::new();
182-
183-
let mut t_brdc = BTreeMap::<SV, Vec<Epoch>>::new();
184-
let mut elev_brdc = BTreeMap::<SV, Vec<f64>>::new();
185-
let mut azim_brdc = BTreeMap::<SV, Vec<f64>>::new();
164+
let mut sp3_lat_ddeg = BTreeMap::<SV, Vec<f64>>::new();
165+
let mut sp3_long_ddeg = BTreeMap::<SV, Vec<f64>>::new();
186166

187167
#[cfg(feature = "sp3")]
188168
if let Some(sp3) = ctx.sp3() {
189-
for (t, sv_sp3, pos_sp3) in sp3.sv_position() {
190-
let rx_orbit = Orbit::from_position(x0_km, y0_km, z0_km, t, ctx.earth_cef);
169+
if let Some(rx_orbit) = reference {
170+
for (t, sp3_sv, sp3_orbit) in sp3.satellites_orbit_iter(ctx.earth_cef) {
171+
let az_el_range = ctx
172+
.almanac
173+
.azimuth_elevation_range_sez(sp3_orbit, rx_orbit, None, None)
174+
.unwrap_or_else(|e| panic!("az_el_range: physical error: {}", e));
191175

192-
let (x_sp3_km, y_sp3_km, z_sp3_km) = (pos_sp3.0, pos_sp3.1, pos_sp3.2);
193-
if let Ok(el_az_range) = Ephemeris::elevation_azimuth_range(
194-
t,
195-
&ctx.almanac,
196-
ctx.earth_cef,
197-
(x_sp3_km, y_sp3_km, z_sp3_km),
198-
(x0_km, y0_km, z0_km),
199-
) {
200-
let (el_deg, az_deg) = (el_az_range.elevation_deg, el_az_range.azimuth_deg);
201-
if el_deg < 0.0 {
202-
continue;
203-
}
204-
if let Some(t_sp3) = t_sp3.get_mut(&sv_sp3) {
176+
let (lat_ddeg, long_ddeg, _) = sp3_orbit
177+
.latlongalt()
178+
.unwrap_or_else(|e| panic!("laglongalt: physical error: {}", e));
179+
180+
if let Some(t_sp3) = t_sp3.get_mut(&sp3_sv) {
205181
t_sp3.push(t);
206182
} else {
207-
t_sp3.insert(sv_sp3, vec![t]);
183+
t_sp3.insert(sp3_sv, vec![t]);
208184
}
209-
if let Some(e) = elev_sp3.get_mut(&sv_sp3) {
210-
e.push(el_deg);
185+
186+
if let Some(e) = elev_sp3.get_mut(&sp3_sv) {
187+
e.push(az_el_range.elevation_deg);
211188
} else {
212-
elev_sp3.insert(sv_sp3, vec![el_deg]);
189+
elev_sp3.insert(sp3_sv, vec![az_el_range.elevation_deg]);
213190
}
214-
if let Some(a) = azim_sp3.get_mut(&sv_sp3) {
215-
a.push(az_deg);
191+
192+
if let Some(a) = azim_sp3.get_mut(&sp3_sv) {
193+
a.push(az_el_range.azimuth_deg);
216194
} else {
217-
azim_sp3.insert(sv_sp3, vec![az_deg]);
195+
azim_sp3.insert(sp3_sv, vec![az_el_range.azimuth_deg]);
218196
}
219-
if brdc_skyplot {
220-
let brdc = ctx.brdc_navigation().unwrap();
221197

222-
if let Some(el_az_range) =
223-
brdc.nav_azimuth_elevation_range(sv_sp3, t, rx_orbit, &ctx.almanac)
224-
{
225-
let (el_deg, az_deg) =
226-
(el_az_range.elevation_deg, el_az_range.azimuth_deg);
227-
if let Some(t_brdc) = t_brdc.get_mut(&sv_sp3) {
228-
t_brdc.push(t);
229-
} else {
230-
t_brdc.insert(sv_sp3, vec![t]);
231-
}
232-
if let Some(e) = elev_brdc.get_mut(&sv_sp3) {
233-
e.push(el_deg);
234-
} else {
235-
elev_brdc.insert(sv_sp3, vec![el_deg]);
236-
}
237-
if let Some(a) = azim_brdc.get_mut(&sv_sp3) {
238-
a.push(az_deg);
239-
} else {
240-
azim_brdc.insert(sv_sp3, vec![az_deg]);
241-
}
242-
}
198+
if let Some(lat) = sp3_lat_ddeg.get_mut(&sp3_sv) {
199+
lat.push(lat_ddeg);
200+
} else {
201+
sp3_lat_ddeg.insert(sp3_sv, vec![lat_ddeg]);
202+
}
203+
204+
if let Some(lon) = sp3_long_ddeg.get_mut(&sp3_sv) {
205+
lon.push(long_ddeg);
206+
} else {
207+
sp3_long_ddeg.insert(sp3_sv, vec![long_ddeg]);
243208
}
244209
}
245210
}
@@ -249,7 +214,7 @@ impl OrbitReport {
249214
sky_plot: {
250215
let mut plot = Plot::sky_plot("skyplot", "Sky plot", true);
251216
for (sv_index, (sv, epochs)) in t_sp3.iter().enumerate() {
252-
let visible = sv_index < max_sv_visible;
217+
let visible = sv_index < 4;
253218
let elev_sp3 = elev_sp3.get(&sv).unwrap();
254219
let azim_sp3 = azim_sp3.get(&sv).unwrap();
255220
let trace = Plot::sky_trace(
@@ -260,18 +225,6 @@ impl OrbitReport {
260225
visible,
261226
);
262227
plot.add_trace(trace);
263-
if let Some(elev_brdc) = elev_brdc.get(&sv) {
264-
let t_brdc = t_brdc.get(&sv).unwrap();
265-
let azim_brdc = azim_brdc.get(&sv).unwrap();
266-
let trace = Plot::sky_trace(
267-
&format!("{}_brdc", sv),
268-
t_brdc,
269-
elev_brdc.to_vec(),
270-
azim_brdc.to_vec(),
271-
sv_index < max_sv_visible,
272-
);
273-
plot.add_trace(trace);
274-
}
275228
}
276229
plot
277230
},
@@ -286,21 +239,9 @@ impl OrbitReport {
286239
MarkerSymbol::Diamond,
287240
epochs,
288241
elev.to_vec(),
289-
sv_index < max_sv_visible,
242+
sv_index < 4,
290243
);
291244
elev_plot.add_trace(trace);
292-
if let Some(elev_brdc) = elev_brdc.get(&sv) {
293-
let t_brdc = t_brdc.get(&sv).unwrap();
294-
let trace = Plot::timedomain_chart(
295-
&format!("{}_brdc", sv),
296-
Mode::Markers,
297-
MarkerSymbol::Diamond,
298-
t_brdc,
299-
elev_brdc.to_vec(),
300-
sv_index < max_sv_visible,
301-
);
302-
elev_plot.add_trace(trace);
303-
}
304245
}
305246
elev_plot
306247
},
@@ -313,40 +254,22 @@ impl OrbitReport {
313254
1,
314255
true,
315256
);
257+
316258
#[cfg(feature = "sp3")]
317259
if let Some(sp3) = ctx.sp3() {
318-
for (sv_index, sv) in sp3.sv().enumerate() {
319-
let orbits = sp3
320-
.sv_position()
321-
.filter_map(|(t, svnn, pos_km)| {
322-
if svnn == sv {
323-
Some(Orbit::from_position(
324-
pos_km.0,
325-
pos_km.1,
326-
pos_km.2,
327-
t,
328-
ctx.earth_cef,
329-
))
330-
} else {
331-
None
332-
}
333-
})
334-
.collect::<Vec<_>>();
335-
336-
let lat_ddeg = orbits
260+
for (sv_index, sv) in sp3.satellites_iter().enumerate() {
261+
let lat_ddeg = sp3_lat_ddeg
337262
.iter()
338-
.filter_map(|orb| {
339-
if let Ok(lat) = orb.latitude_deg() {
340-
Some(lat)
341-
} else {
342-
None
343-
}
344-
})
263+
.filter_map(
264+
|(svnn, v)| if *svnn == sv { Some(v.clone()) } else { None },
265+
)
345266
.collect::<Vec<_>>();
346267

347-
let long_ddeg = orbits
268+
let long_ddeg = sp3_long_ddeg
348269
.iter()
349-
.map(|orb| orb.longitude_deg())
270+
.filter_map(
271+
|(svnn, v)| if *svnn == sv { Some(v.clone()) } else { None },
272+
)
350273
.collect::<Vec<_>>();
351274

352275
let map = Plot::mapbox(
@@ -359,28 +282,18 @@ impl OrbitReport {
359282
1.0,
360283
sv_index < 2,
361284
);
285+
362286
map_proj.add_trace(map);
363287
}
364288
}
365289
map_proj
366290
},
367-
//globe_proj: {
368-
// let mut map_proj = Plot::world_map(
369-
// "map_proj",
370-
// "Map Projection",
371-
// MapboxStyle::OpenStreetMap,
372-
// (32.0, -40.0),
373-
// 1,
374-
// true,
375-
// );
376-
// map_proj
377-
//},
378291
#[cfg(feature = "sp3")]
379292
brdc_sp3_err: {
380293
let mut reports = HashMap::<Constellation, BrdcSp3Report>::new();
381294
if let Some(sp3) = ctx.sp3() {
382295
if let Some(nav) = ctx.brdc_navigation() {
383-
for constellation in sp3.constellation() {
296+
for constellation in sp3.constellations_iter() {
384297
if let Some(constellation) = nav
385298
.constellations_iter()
386299
.filter(|c| *c == constellation)

src/report/shared/sampling.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,18 +55,20 @@ impl SamplingReport {
5555
}
5656
#[cfg(feature = "sp3")]
5757
pub fn from_sp3(sp3: &SP3) -> Self {
58-
let t_start = sp3.first_epoch().expect("badly formed sp3: empty?");
59-
let t_end = sp3.last_epoch().expect("badly formed sp3: empty?");
58+
let t_start = sp3.first_epoch();
59+
let t_end = sp3
60+
.last_epoch()
61+
.expect("undetermined last epoch: SP3 format error");
6062
Self {
61-
total: sp3.epoch().count(),
63+
total: sp3.epochs_iter().count(),
6264
gaps: Vec::new(), // TODO
6365
longest_gap: None, //TODO
6466
shortest_gap: None, //TODO
6567
last_epoch: t_end,
6668
first_epoch: t_start,
6769
duration: t_end - t_start,
68-
sampling_interval: Some(sp3.epoch_interval),
69-
dominant_sample_rate: Some(1.0 / sp3.epoch_interval.to_seconds()),
70+
sampling_interval: Some(sp3.header.epoch_interval),
71+
dominant_sample_rate: Some(1.0 / sp3.header.epoch_interval.to_seconds()),
7072
}
7173
}
7274
}

0 commit comments

Comments
 (0)