}
}
+/**
+ * vik_track_interpolate_times:
+ *
+ * Interpolate the timestamps between first and last trackpoint,
+ * so that the track is driven at equal speed, regardless of the
+ * distance between individual trackpoints.
+ *
+ * NB This will overwrite any existing trackpoint timestamps
+ */
+void vik_track_interpolate_times ( VikTrack *tr )
+{
+ gdouble tr_dist, cur_dist;
+ time_t tsdiff, tsfirst;
+
+ GList *iter;
+ iter = tr->trackpoints;
+
+ VikTrackpoint *tp = VIK_TRACKPOINT(iter->data);
+ if ( tp->has_timestamp ) {
+ tsfirst = tp->timestamp;
+
+ // Find the end of the track and the last timestamp
+ while ( iter->next ) {
+ iter = iter->next;
+ }
+ tp = VIK_TRACKPOINT(iter->data);
+ if ( tp->has_timestamp ) {
+ tsdiff = tp->timestamp - tsfirst;
+
+ tr_dist = vik_track_get_length_including_gaps ( tr );
+ cur_dist = 0.0;
+
+ if ( tr_dist > 0 ) {
+ iter = tr->trackpoints;
+ // Apply the calculated timestamp to all trackpoints except the first and last ones
+ while ( iter->next && iter->next->next ) {
+ iter = iter->next;
+ tp = VIK_TRACKPOINT(iter->data);
+ cur_dist += vik_coord_diff ( &(tp->coord), &(VIK_TRACKPOINT(iter->prev->data)->coord) );
+
+ tp->timestamp = (cur_dist / tr_dist) * tsdiff + tsfirst;
+ tp->has_timestamp = TRUE;
+ }
+ }
+ }
+ }
+}
/**
* vik_track_apply_dem_data:
void vik_track_calculate_bounds ( VikTrack *trk );
void vik_track_anonymize_times ( VikTrack *tr );
+void vik_track_interpolate_times ( VikTrack *tr );
gulong vik_track_apply_dem_data ( VikTrack *tr, gboolean skip_existing );
void vik_track_apply_dem_data_last_trackpoint ( VikTrack *tr );
gulong vik_track_smooth_missing_elevation_data ( VikTrack *tr, gboolean flat );
vik_track_anonymize_times ( track );
}
+static void trw_layer_interpolate_times ( menu_array_sublayer values )
+{
+ VikTrwLayer *vtl = (VikTrwLayer *)values[MA_VTL];
+ VikTrack *track;
+ if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_ROUTE )
+ track = (VikTrack *) g_hash_table_lookup ( vtl->routes, values[MA_SUBLAYER_ID] );
+ else
+ track = (VikTrack *) g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] );
+
+ if ( track )
+ vik_track_interpolate_times ( track );
+}
+
static void trw_layer_extend_track_end ( menu_array_sublayer values )
{
VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]);
gtk_menu_shell_append ( GTK_MENU_SHELL(transform_submenu), item );
gtk_widget_show ( item );
- // Routes don't have timestamps - so this is only available for tracks
+ // Routes don't have timestamps - so these are only available for tracks
if ( subtype == VIK_TRW_LAYER_SUBLAYER_TRACK ) {
item = gtk_image_menu_item_new_with_mnemonic ( _("_Anonymize Times") );
g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_anonymize_times), pass_along );
gtk_menu_shell_append ( GTK_MENU_SHELL(transform_submenu), item );
gtk_widget_set_tooltip_text (item, _("Shift timestamps to a relative offset from 1901-01-01"));
gtk_widget_show ( item );
+
+ item = gtk_image_menu_item_new_with_mnemonic ( _("_Interpolate Times") );
+ g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_interpolate_times), pass_along );
+ gtk_menu_shell_append ( GTK_MENU_SHELL(transform_submenu), item );
+ gtk_widget_set_tooltip_text (item, _("Reset trackpoint timestamps between the first and last points such that track is traveled at equal speed"));
+ gtk_widget_show ( item );
}
if ( subtype == VIK_TRW_LAYER_SUBLAYER_TRACK )