From: Rob Norris Date: Wed, 12 Jun 2013 19:23:00 +0000 (+0100) Subject: Fix track not displayed from realtime GPS tracking. X-Git-Url: https://git.street.me.uk/andy/viking.git/commitdiff_plain/9bc95d58401a902a54851f5c6d83430906440877?hp=3f46fe76d1ab4d45fe3f6e714ad8aacdd37ddaa4 Fix track not displayed from realtime GPS tracking. Need to calculate the bounds of track, as follow on from optimization commits SHA1:80169badb016873d8a2e674e32820ecbe32d6788 Add method to only consider the last trackpoint added, otherwise for creating very long tracks it will get progressively slower. --- diff --git a/src/vikgpslayer.c b/src/vikgpslayer.c index 540ff101..95391739 100644 --- a/src/vikgpslayer.c +++ b/src/vikgpslayer.c @@ -1586,7 +1586,7 @@ static void create_realtime_trackpoint(VikGpsLayer *vgl, gboolean forced) vik_coord_load_from_latlon(&tp->coord, vik_trw_layer_get_coord_mode(vgl->trw_children[TRW_REALTIME]), &ll); - vgl->realtime_track->trackpoints = g_list_append(vgl->realtime_track->trackpoints, tp); + vik_track_add_trackpoint ( vgl->realtime_track, tp, TRUE ); // Ensure bounds is recalculated vgl->realtime_fix.dirty = FALSE; vgl->realtime_fix.satellites_used = 0; vgl->last_fix = vgl->realtime_fix; diff --git a/src/viktrack.c b/src/viktrack.c index fefb8e6b..5422e784 100644 --- a/src/viktrack.c +++ b/src/viktrack.c @@ -180,6 +180,48 @@ VikTrackpoint *vik_trackpoint_copy(VikTrackpoint *tp) return rv; } +/** + * track_recalculate_bounds_last_tp: + * @trk: The track to consider the recalculation on + * + * A faster bounds check, since it only considers the last track point + */ +static void track_recalculate_bounds_last_tp ( VikTrack *trk ) +{ + GList *tpl = g_list_last ( trk->trackpoints ); + + if ( tpl ) { + struct LatLon ll; + // See if this trackpoint increases the track bounds and update if so + vik_coord_to_latlon ( &(VIK_TRACKPOINT(tpl->data)->coord), &ll ); + if ( ll.lat > trk->bbox.north ) + trk->bbox.north = ll.lat; + if ( ll.lon < trk->bbox.west ) + trk->bbox.west = ll.lon; + if ( ll.lat < trk->bbox.south ) + trk->bbox.south = ll.lat; + if ( ll.lon > trk->bbox.east ) + trk->bbox.east = ll.lon; + } +} + +/** + * vik_track_add_trackpoint: + * @tr: The track to which the trackpoint will be added + * @tp: The trackpoint to add + * @recalculate: Whether to perform any associated properties recalculations + * Generally one should avoid recalculation via this method if adding lots of points + * (But ensure calculate_bounds() is called after adding all points!!) + * + * The trackpoint is added to the end of the existing trackpoint list + */ +void vik_track_add_trackpoint ( VikTrack *tr, VikTrackpoint *tp, gboolean recalculate ) +{ + tr->trackpoints = g_list_append ( tr->trackpoints, tp ); + if ( recalculate ) + track_recalculate_bounds_last_tp ( tr ); +} + gdouble vik_track_get_length(const VikTrack *tr) { gdouble len = 0.0; diff --git a/src/viktrack.h b/src/viktrack.h index 79e7116d..da97d040 100644 --- a/src/viktrack.h +++ b/src/viktrack.h @@ -88,6 +88,7 @@ void vik_track_set_comment_no_copy(VikTrack *tr, gchar *comment); VikTrackpoint *vik_trackpoint_new(); void vik_trackpoint_free(VikTrackpoint *tp); VikTrackpoint *vik_trackpoint_copy(VikTrackpoint *tp); +void vik_track_add_trackpoint(VikTrack *tr, VikTrackpoint *tp, gboolean recalculate); gdouble vik_track_get_length(const VikTrack *tr); gdouble vik_track_get_length_including_gaps(const VikTrack *tr); gulong vik_track_get_tp_count(const VikTrack *tr); diff --git a/src/viktrwlayer.c b/src/viktrwlayer.c index 15e093c7..28452853 100644 --- a/src/viktrwlayer.c +++ b/src/viktrwlayer.c @@ -8263,10 +8263,9 @@ static gboolean tool_new_track_or_route_click ( VikTrwLayer *vtl, GdkEventButton tp->timestamp = 0; if ( vtl->current_track ) { - vtl->current_track->trackpoints = g_list_append ( vtl->current_track->trackpoints, tp ); + vik_track_add_trackpoint ( vtl->current_track, tp, TRUE ); // Ensure bounds is updated /* Auto attempt to get elevation from DEM data (if it's available) */ vik_track_apply_dem_data_last_trackpoint ( vtl->current_track ); - vik_track_calculate_bounds ( vtl->current_track ); } vtl->ct_x1 = vtl->ct_x2;