X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/ce1c0489dcc4a2aeeab587b05ac872395107e4fd..0fa0c0b718943c7e50719fe516de88c3fd3ab6a8:/src/viktrack.c?ds=sidebyside diff --git a/src/viktrack.c b/src/viktrack.c index ae3110c5..8598090a 100644 --- a/src/viktrack.c +++ b/src/viktrack.c @@ -499,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; @@ -701,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) ); @@ -775,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) ); @@ -945,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) );