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;
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;
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);
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;