&(VIK_TRACKPOINT(iter->next->data)->coord) ) )
{
num++;
- g_free ( iter->next->data );
+ // Maintain track segments
+ if ( VIK_TRACKPOINT(iter->next->data)->newsegment && (iter->next)->next )
+ VIK_TRACKPOINT(((iter->next)->next)->data)->newsegment = TRUE;
+
+ vik_trackpoint_free ( iter->next->data );
tr->trackpoints = g_list_delete_link ( tr->trackpoints, iter->next );
}
else
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;
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;
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) );
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) );
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) );