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 } ;
52use std:: collections:: { BTreeMap , HashMap } ;
63
74use qc_traits:: { Filter , Preprocessing } ;
@@ -25,15 +22,17 @@ struct BrdcSp3Report {
2522impl 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
160159impl 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)
0 commit comments