]> git.street.me.uk Git - andy/viking.git/blobdiff - src/viktrack.c
Fix a segfault caused by (mistakenly) adding a new layer to gps layer.
[andy/viking.git] / src / viktrack.c
index b5f1b7680372e41e611481d57fbca4378012ef58..ba517cc0a9f563b403a33318bfeb0307674c005a 100644 (file)
@@ -29,6 +29,7 @@
 #include "vikcoord.h"
 #include "viktrack.h"
 #include "globals.h"
 #include "vikcoord.h"
 #include "viktrack.h"
 #include "globals.h"
+#include "dems.h"
 
 VikTrack *vik_track_new()
 {
 
 VikTrack *vik_track_new()
 {
@@ -325,6 +326,9 @@ gdouble *vik_track_make_elevation_map ( const VikTrack *tr, guint16 num_chunks )
 
   GList *iter = tr->trackpoints;
 
 
   GList *iter = tr->trackpoints;
 
+  if (!iter->next) /* one-point track */
+         return NULL;
+
   { /* test if there's anything worth calculating */
     gboolean okay = FALSE;
     while ( iter )
   { /* test if there's anything worth calculating */
     gboolean okay = FALSE;
     while ( iter )
@@ -338,7 +342,7 @@ gdouble *vik_track_make_elevation_map ( const VikTrack *tr, guint16 num_chunks )
       return NULL;
   }
 
       return NULL;
   }
 
-
+  iter = tr->trackpoints;
 
   g_assert ( num_chunks < 16000 );
 
 
   g_assert ( num_chunks < 16000 );
 
@@ -545,17 +549,18 @@ gdouble *vik_track_make_speed_map ( const VikTrack *tr, guint16 num_chunks )
   int i, pt_count, numpts, spline;
   GList *iter;
   spline_coeff_t *p;
   int i, pt_count, numpts, spline;
   GList *iter;
   spline_coeff_t *p;
-  GList *mytr;
 
   if ( ! tr->trackpoints )
     return NULL;
 
   g_assert ( num_chunks < 16000 );
 
 
   if ( ! tr->trackpoints )
     return NULL;
 
   g_assert ( num_chunks < 16000 );
 
+#ifdef XXXXXXXXXXXXXXXXXX
   iter = tr->trackpoints;
   while (iter) {
     
   }
   iter = tr->trackpoints;
   while (iter) {
     
   }
+#endif /*XXXXXXXXXXXXXXXXXX*/
 
   t1 = VIK_TRACKPOINT(tr->trackpoints->data)->timestamp;
   t2 = VIK_TRACKPOINT(g_list_last(tr->trackpoints)->data)->timestamp;
 
   t1 = VIK_TRACKPOINT(tr->trackpoints->data)->timestamp;
   t2 = VIK_TRACKPOINT(g_list_last(tr->trackpoints)->data)->timestamp;
@@ -565,7 +570,7 @@ gdouble *vik_track_make_speed_map ( const VikTrack *tr, guint16 num_chunks )
     return NULL;
 
   if (duration < 0) {
     return NULL;
 
   if (duration < 0) {
-    fprintf(stderr, "negative duration: unsorted trackpoint timestamps?\n");
+    g_warning("negative duration: unsorted trackpoint timestamps?\n");
     return NULL;
   }
   pt_count = vik_track_get_tp_count(tr);
     return NULL;
   }
   pt_count = vik_track_get_tp_count(tr);
@@ -591,13 +596,6 @@ gdouble *vik_track_make_speed_map ( const VikTrack *tr, guint16 num_chunks )
 
   compute_spline(numpts, t, s, p);
 
 
   compute_spline(numpts, t, s, p);
 
-  /*
-  printf("Got spline\n");
-  for (i=0; i<numpts-1; i++) {
-    printf("a = %15f  b = %15f  c = %15f  d = %15f\n", p[i].a, p[i].b, p[i].c, p[i].d);
-  }
-  */
-
   /* the spline gives us distances at chunk_dur intervals. from these,
    * we obtain average speed in each interval.
    */
   /* the spline gives us distances at chunk_dur intervals. from these,
    * we obtain average speed in each interval.
    */
@@ -631,15 +629,15 @@ gdouble *vik_track_make_speed_map ( const VikTrack *tr, guint16 num_chunks )
 }
 
 /* by Alex Foobarian */
 }
 
 /* by Alex Foobarian */
-VikCoord *vik_track_get_closest_tp_by_percentage_dist ( VikTrack *tr, gdouble reldist )
+VikTrackpoint *vik_track_get_closest_tp_by_percentage_dist ( VikTrack *tr, gdouble reldist )
 {
   gdouble dist = vik_track_get_length_including_gaps(tr) * reldist;
   gdouble current_dist = 0.0;
   gdouble current_inc = 0.0;
 {
   gdouble dist = vik_track_get_length_including_gaps(tr) * reldist;
   gdouble current_dist = 0.0;
   gdouble current_inc = 0.0;
-  VikCoord *rv;
   if ( tr->trackpoints )
   {
     GList *iter = tr->trackpoints->next;
   if ( tr->trackpoints )
   {
     GList *iter = tr->trackpoints->next;
+    GList *last_iter = NULL;
     while (iter)
     {
       current_inc = vik_coord_diff ( &(VIK_TRACKPOINT(iter->data)->coord),
     while (iter)
     {
       current_inc = vik_coord_diff ( &(VIK_TRACKPOINT(iter->data)->coord),
@@ -647,19 +645,17 @@ VikCoord *vik_track_get_closest_tp_by_percentage_dist ( VikTrack *tr, gdouble re
       current_dist += current_inc;
       if ( current_dist >= dist )
         break;
       current_dist += current_inc;
       if ( current_dist >= dist )
         break;
+      last_iter = iter;
       iter = iter->next;
     }
       iter = iter->next;
     }
+    if (!iter) /* passing the end the track */
+      return (last_iter ? last_iter->data : NULL);
     /* we've gone past the dist already, was prev trackpoint closer? */
     /* should do a vik_coord_average_weighted() thingy. */
     if ( iter->prev && abs(current_dist-current_inc-dist) < abs(current_dist-dist) )
       iter = iter->prev;
 
     /* we've gone past the dist already, was prev trackpoint closer? */
     /* should do a vik_coord_average_weighted() thingy. */
     if ( iter->prev && abs(current_dist-current_inc-dist) < abs(current_dist-dist) )
       iter = iter->prev;
 
-
-
-    rv = g_malloc(sizeof(VikCoord));
-    *rv = VIK_TRACKPOINT(iter->data)->coord;
-
-    return rv;
+    return VIK_TRACKPOINT(iter->data);
 
   }
   return NULL;
 
   }
   return NULL;
@@ -747,3 +743,32 @@ VikTrack *vik_track_unmarshall (guint8 *data, guint datalen)
   return new_tr;
 }
 
   return new_tr;
 }
 
+void vik_track_apply_dem_data ( VikTrack *tr )
+{
+  GList *tp_iter;
+  gint16 elev;
+  tp_iter = tr->trackpoints;
+  while ( tp_iter ) {
+    /* TODO: of the 4 possible choices we have for choosing an elevation
+     * (trackpoint in between samples), choose the one with the least elevation change
+     * as the last */
+    elev = a_dems_get_elev_by_coord ( &(VIK_TRACKPOINT(tp_iter->data)->coord) );
+    if ( elev != VIK_DEM_INVALID_ELEVATION )
+      VIK_TRACKPOINT(tp_iter->data)->altitude = elev;
+    tp_iter = tp_iter->next;
+  }
+}
+
+/* appends t2 to t1, leaving t2 with no trackpoints */
+void vik_track_steal_and_append_trackpoints ( VikTrack *t1, VikTrack *t2 )
+{
+  if ( t1->trackpoints ) {
+    GList *tpiter = t1->trackpoints;
+    while ( tpiter->next )
+      tpiter = tpiter->next;
+    tpiter->next = t2->trackpoints;
+    t2->trackpoints->prev = tpiter;
+  } else
+    t1->trackpoints = t2->trackpoints;
+  t2->trackpoints = NULL;
+}