X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/d6caf4c05910bfe38551236af8b3547ed8c0fc31..0fa0c0b718943c7e50719fe516de88c3fd3ab6a8:/src/viktrack.c?ds=inline diff --git a/src/viktrack.c b/src/viktrack.c index 0071a8a4..8598090a 100644 --- a/src/viktrack.c +++ b/src/viktrack.c @@ -342,6 +342,30 @@ VikTrack **vik_track_split_into_segments(VikTrack *t, guint *ret_len) return rv; } +/* + * Simply remove any subsequent segment markers in a track to form one continuous track + * Return the number of segments merged + */ +guint vik_track_merge_segments(VikTrack *tr) +{ + guint num = 0; + GList *iter = tr->trackpoints; + if ( !iter ) + return num; + + // Always skip the first point as this should be the first segment + iter = iter->next; + + while ( (iter = iter->next) ) + { + if ( VIK_TRACKPOINT(iter->data)->newsegment ) { + VIK_TRACKPOINT(iter->data)->newsegment = FALSE; + num++; + } + } + return num; +} + void vik_track_reverse ( VikTrack *tr ) { GList *iter; @@ -475,7 +499,12 @@ gdouble *vik_track_make_elevation_map ( const VikTrack *tr, guint16 num_chunks ) gboolean okay = FALSE; while ( iter ) { - if ( VIK_TRACKPOINT(iter->data)->altitude != VIK_DEFAULT_ALTITUDE ) { + // Sometimes a GPS device (or indeed any random file) can have stupid numbers for elevations + // Since when is 9.9999e+24 a valid elevation!! + // This can happen when a track (with no elevations) is uploaded to a GPS device and then redownloaded (e.g. using a Garmin Legend EtrexHCx) + // Some protection against trying to work with crazily massive numbers (otherwise get SIGFPE, Arithmetic exception) + if ( VIK_TRACKPOINT(iter->data)->altitude != VIK_DEFAULT_ALTITUDE && + VIK_TRACKPOINT(iter->data)->altitude < 1E9 ) { okay = TRUE; break; } iter = iter->next; @@ -677,7 +706,7 @@ gdouble *vik_track_make_speed_map ( const VikTrack *tr, guint16 num_chunks ) iter = tr->trackpoints->next; numpts = 0; s[0] = 0; - t[0] = VIK_TRACKPOINT(iter->prev->data)->timestamp; + t[0] = VIK_TRACKPOINT(tr->trackpoints->data)->timestamp; numpts++; while (iter) { s[numpts] = s[numpts-1] + vik_coord_diff ( &(VIK_TRACKPOINT(iter->prev->data)->coord), &(VIK_TRACKPOINT(iter->data)->coord) ); @@ -751,7 +780,7 @@ gdouble *vik_track_make_distance_map ( const VikTrack *tr, guint16 num_chunks ) iter = tr->trackpoints->next; numpts = 0; s[0] = 0; - t[0] = VIK_TRACKPOINT(iter->prev->data)->timestamp; + t[0] = VIK_TRACKPOINT(tr->trackpoints->data)->timestamp; numpts++; while (iter) { s[numpts] = s[numpts-1] + vik_coord_diff ( &(VIK_TRACKPOINT(iter->prev->data)->coord), &(VIK_TRACKPOINT(iter->data)->coord) ); @@ -921,7 +950,7 @@ gdouble *vik_track_make_speed_dist_map ( const VikTrack *tr, guint16 num_chunks iter = tr->trackpoints->next; numpts = 0; s[0] = 0; - t[0] = VIK_TRACKPOINT(iter->prev->data)->timestamp; + t[0] = VIK_TRACKPOINT(tr->trackpoints->data)->timestamp; numpts++; while (iter) { s[numpts] = s[numpts-1] + vik_coord_diff ( &(VIK_TRACKPOINT(iter->prev->data)->coord), &(VIK_TRACKPOINT(iter->data)->coord) );