]> git.street.me.uk Git - andy/viking.git/commitdiff
Fix track not displayed from realtime GPS tracking.
authorRob Norris <rw_norris@hotmail.com>
Wed, 12 Jun 2013 19:23:00 +0000 (20:23 +0100)
committerRob Norris <rw_norris@hotmail.com>
Wed, 12 Jun 2013 19:23:00 +0000 (20:23 +0100)
Need to calculate the bounds of track,
 as follow on from optimization commits SHA1:80169badb016873d8a2e674e32820ecbe32d6788

Add method to only consider the last trackpoint added,
 otherwise for creating very long tracks it will get progressively slower.

src/vikgpslayer.c
src/viktrack.c
src/viktrack.h
src/viktrwlayer.c

index 540ff10152205335b658074d3483824b0d3febd4..95391739ae0431a720567a5738f2672a23574a18 100644 (file)
@@ -1586,7 +1586,7 @@ static void create_realtime_trackpoint(VikGpsLayer *vgl, gboolean forced)
         vik_coord_load_from_latlon(&tp->coord,
              vik_trw_layer_get_coord_mode(vgl->trw_children[TRW_REALTIME]), &ll);
 
-        vgl->realtime_track->trackpoints = g_list_append(vgl->realtime_track->trackpoints, tp);
+        vik_track_add_trackpoint ( vgl->realtime_track, tp, TRUE ); // Ensure bounds is recalculated
         vgl->realtime_fix.dirty = FALSE;
         vgl->realtime_fix.satellites_used = 0;
         vgl->last_fix = vgl->realtime_fix;
index fefb8e6b4faf73991ca0d7f59a57fcc2ecb85e2f..5422e7843aa619a85335c2734e7ce2780577e97e 100644 (file)
@@ -180,6 +180,48 @@ VikTrackpoint *vik_trackpoint_copy(VikTrackpoint *tp)
   return rv;
 }
 
+/**
+ * track_recalculate_bounds_last_tp:
+ * @trk:   The track to consider the recalculation on
+ *
+ * A faster bounds check, since it only considers the last track point
+ */
+static void track_recalculate_bounds_last_tp ( VikTrack *trk )
+{
+  GList *tpl = g_list_last ( trk->trackpoints );
+
+  if ( tpl ) {
+    struct LatLon ll;
+    // See if this trackpoint increases the track bounds and update if so
+    vik_coord_to_latlon ( &(VIK_TRACKPOINT(tpl->data)->coord), &ll );
+    if ( ll.lat > trk->bbox.north )
+      trk->bbox.north = ll.lat;
+    if ( ll.lon < trk->bbox.west )
+      trk->bbox.west = ll.lon;
+    if ( ll.lat < trk->bbox.south )
+      trk->bbox.south = ll.lat;
+    if ( ll.lon > trk->bbox.east )
+      trk->bbox.east = ll.lon;
+  }
+}
+
+/**
+ * vik_track_add_trackpoint:
+ * @tr:          The track to which the trackpoint will be added
+ * @tp:          The trackpoint to add
+ * @recalculate: Whether to perform any associated properties recalculations
+ *               Generally one should avoid recalculation via this method if adding lots of points
+ *               (But ensure calculate_bounds() is called after adding all points!!)
+ *
+ * The trackpoint is added to the end of the existing trackpoint list
+ */
+void vik_track_add_trackpoint ( VikTrack *tr, VikTrackpoint *tp, gboolean recalculate )
+{
+  tr->trackpoints = g_list_append ( tr->trackpoints, tp );
+  if ( recalculate )
+    track_recalculate_bounds_last_tp ( tr );
+}
+
 gdouble vik_track_get_length(const VikTrack *tr)
 {
   gdouble len = 0.0;
index 79e7116de347bde2aa68d1010c00c03c83320272..da97d0409e55071535e36d95c1004b1375e7509b 100644 (file)
@@ -88,6 +88,7 @@ void vik_track_set_comment_no_copy(VikTrack *tr, gchar *comment);
 VikTrackpoint *vik_trackpoint_new();
 void vik_trackpoint_free(VikTrackpoint *tp);
 VikTrackpoint *vik_trackpoint_copy(VikTrackpoint *tp);
+void vik_track_add_trackpoint(VikTrack *tr, VikTrackpoint *tp, gboolean recalculate);
 gdouble vik_track_get_length(const VikTrack *tr);
 gdouble vik_track_get_length_including_gaps(const VikTrack *tr);
 gulong vik_track_get_tp_count(const VikTrack *tr);
index 15e093c7161aa6c399dee1169fac9636a17eb99a..284528535da3c8e0f2f48b2b7c37ed4d330ea9ad 100644 (file)
@@ -8263,10 +8263,9 @@ static gboolean tool_new_track_or_route_click ( VikTrwLayer *vtl, GdkEventButton
   tp->timestamp = 0;
 
   if ( vtl->current_track ) {
-    vtl->current_track->trackpoints = g_list_append ( vtl->current_track->trackpoints, tp );
+    vik_track_add_trackpoint ( vtl->current_track, tp, TRUE ); // Ensure bounds is updated
     /* Auto attempt to get elevation from DEM data (if it's available) */
     vik_track_apply_dem_data_last_trackpoint ( vtl->current_track );
-    vik_track_calculate_bounds ( vtl->current_track );
   }
 
   vtl->ct_x1 = vtl->ct_x2;