]> git.street.me.uk Git - andy/viking.git/commitdiff
Eliminate the needs of entering DEM files for every single track/waypoint layer.
authorQuy Tonthat <qtonthat@gmail.com>
Fri, 13 Jul 2007 13:47:34 +0000 (13:47 +0000)
committerQuy Tonthat <qtonthat@gmail.com>
Fri, 13 Jul 2007 13:47:34 +0000 (13:47 +0000)
TODO:
- When there are more than one DEM sources for a track point, select the one
  with best resolution.
- To improve prformance keep a sorted list (sorted by lat/lon).

Signed-off-by: Quy Tonthat <qtonthat@gmail.com>
src/dems.c
src/dems.h
src/viktrack.c
src/viktrack.h
src/viktrwlayer.c

index d3d889460cd504e5ef5204c5349b221c1855ea86..b278e5183b2a09ab72489829d0dbeddd5a8275c6 100644 (file)
@@ -158,3 +158,45 @@ gint16 a_dems_list_get_elev_by_coord ( GList *dems, const VikCoord *coord )
   }
   return VIK_DEM_INVALID_ELEVATION;
 }
   }
   return VIK_DEM_INVALID_ELEVATION;
 }
+
+typedef struct {
+  const VikCoord *coord;
+  gint elev;
+} CoordElev;
+
+static gboolean get_elev_by_coord(gpointer key, LoadedDEM *ldem, CoordElev *ce)
+{
+  VikDEM *dem = ldem->dem;
+
+  if ( dem->horiz_units == VIK_DEM_HORIZ_LL_ARCSECONDS ) {
+    struct LatLon ll_tmp;
+    vik_coord_to_latlon (ce->coord, &ll_tmp );
+    ll_tmp.lat *= 3600;
+    ll_tmp.lon *= 3600;
+    ce->elev = vik_dem_get_east_north(dem, ll_tmp.lon, ll_tmp.lat);
+    return (ce->elev != VIK_DEM_INVALID_ELEVATION);
+  } else if (dem->horiz_units == VIK_DEM_HORIZ_UTM_METERS) {
+    static struct UTM utm_tmp;
+    vik_coord_to_utm (ce->coord, &utm_tmp);
+    if ( utm_tmp.zone == dem->utm_zone &&
+             (ce->elev = vik_dem_get_east_north(dem, utm_tmp.easting, utm_tmp.northing)) != VIK_DEM_INVALID_ELEVATION )
+      return TRUE;
+  }
+  return FALSE;
+}
+
+/* TODO: keep a (sorted) linked list of DEMs and select the best resolution one */
+gint16 a_dems_get_elev_by_coord ( const VikCoord *coord )
+{
+  CoordElev ce;
+
+  if (!loaded_dems)
+    return VIK_DEM_INVALID_ELEVATION;
+
+  ce.coord = coord;
+  ce.elev = VIK_DEM_INVALID_ELEVATION;
+
+  if(!g_hash_table_find(loaded_dems, get_elev_by_coord, &ce))
+    return VIK_DEM_INVALID_ELEVATION;
+  return ce.elev;
+}
index 6c9da1c64a8ffae778b4b500f4443d8d8d257f2e..cf8b1a9f436274049148db9f2d261641742f4e09 100644 (file)
@@ -12,6 +12,7 @@ void a_dems_load_list ( GList **dems );
 void a_dems_list_free ( GList *dems );
 GList *a_dems_list_copy ( GList *dems );
 gint16 a_dems_list_get_elev_by_coord ( GList *dems, const VikCoord *coord );
 void a_dems_list_free ( GList *dems );
 GList *a_dems_list_copy ( GList *dems );
 gint16 a_dems_list_get_elev_by_coord ( GList *dems, const VikCoord *coord );
+gint16 a_dems_get_elev_by_coord ( const VikCoord *coord );
 
 #endif
 #include <glib.h>
 
 #endif
 #include <glib.h>
index 0b2ebc3208c49d4fbab02e6908fda954aefffdb1..cbbdc8bbc1ec1c14a90ba100b51be1b552379b59 100644 (file)
@@ -750,18 +750,16 @@ VikTrack *vik_track_unmarshall (guint8 *data, guint datalen)
   return new_tr;
 }
 
   return new_tr;
 }
 
-void vik_track_apply_dem_data ( VikTrack *tr, GList *dems )
+void vik_track_apply_dem_data ( VikTrack *tr )
 {
   GList *tp_iter;
   gint16 elev;
 {
   GList *tp_iter;
   gint16 elev;
-  if ( ! dems )
-    return;
   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 */
   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_list_get_elev_by_coord ( dems, &(VIK_TRACKPOINT(tp_iter->data)->coord) );
+    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;
     if ( elev != VIK_DEM_INVALID_ELEVATION )
       VIK_TRACKPOINT(tp_iter->data)->altitude = elev;
     tp_iter = tp_iter->next;
index 60b4f9b36f1fe7d23c3907ede667ba6bd4bb97d0..6d3d7c2da7fc283d6b1bb68d1c81b24dc577864b 100644 (file)
@@ -80,7 +80,7 @@ gboolean vik_track_get_minmax_alt ( const VikTrack *tr, gdouble *min_alt, gdoubl
 void vik_track_marshall ( VikTrack *tr, guint8 **data, guint *len);
 VikTrack *vik_track_unmarshall (guint8 *data, guint datalen);
 
 void vik_track_marshall ( VikTrack *tr, guint8 **data, guint *len);
 VikTrack *vik_track_unmarshall (guint8 *data, guint datalen);
 
-void vik_track_apply_dem_data ( VikTrack *tr, GList *dems );
+void vik_track_apply_dem_data ( VikTrack *tr);
 
 
 #endif
 
 
 #endif
index eb2219aa9c46823e24736ab348acc85ae1315c7d..ce6be5faf10415cc3300e47912d054b309e7627c 100644 (file)
@@ -143,9 +143,6 @@ struct _VikTrwLayer {
 
   gboolean has_verified_thumbnails;
 
 
   gboolean has_verified_thumbnails;
 
-  /* DEM files */
-  GList *dems;
-
   GtkMenu *wp_right_click_menu;
 
   /* menu */
   GtkMenu *wp_right_click_menu;
 
   /* menu */
@@ -286,8 +283,8 @@ static VikToolInterface trw_layer_tools[] = {
 
 /****** PARAMETERS ******/
 
 
 /****** PARAMETERS ******/
 
-static gchar *params_groups[] = { "Waypoints", "Tracks", "Waypoint Images", "DEM Data" };
-enum { GROUP_WAYPOINTS, GROUP_TRACKS, GROUP_IMAGES, GROUP_DEM };
+static gchar *params_groups[] = { "Waypoints", "Tracks", "Waypoint Images" };
+enum { GROUP_WAYPOINTS, GROUP_TRACKS, GROUP_IMAGES };
 
 static gchar *params_drawmodes[] = { "Draw by Track", "Draw by Velocity", "All Tracks Black", 0 };
 static gchar *params_wpsymbols[] = { "Filled Square", "Square", "Circle", "X", 0 };
 
 static gchar *params_drawmodes[] = { "Draw by Track", "Draw by Velocity", "All Tracks Black", 0 };
 static gchar *params_wpsymbols[] = { "Filled Square", "Square", "Circle", "X", 0 };
@@ -340,16 +337,13 @@ VikLayerParam trw_layer_params[] = {
   { "image_size", VIK_LAYER_PARAM_UINT, GROUP_IMAGES, "Image Size (pixels):", VIK_LAYER_WIDGET_HSCALE, params_scales + 3 },
   { "image_alpha", VIK_LAYER_PARAM_UINT, GROUP_IMAGES, "Image Alpha:", VIK_LAYER_WIDGET_HSCALE, params_scales + 4 },
   { "image_cache_size", VIK_LAYER_PARAM_UINT, GROUP_IMAGES, "Image Memory Cache Size:", VIK_LAYER_WIDGET_HSCALE, params_scales + 5 },
   { "image_size", VIK_LAYER_PARAM_UINT, GROUP_IMAGES, "Image Size (pixels):", VIK_LAYER_WIDGET_HSCALE, params_scales + 3 },
   { "image_alpha", VIK_LAYER_PARAM_UINT, GROUP_IMAGES, "Image Alpha:", VIK_LAYER_WIDGET_HSCALE, params_scales + 4 },
   { "image_cache_size", VIK_LAYER_PARAM_UINT, GROUP_IMAGES, "Image Memory Cache Size:", VIK_LAYER_WIDGET_HSCALE, params_scales + 5 },
-
-  { "dems", VIK_LAYER_PARAM_STRING_LIST, GROUP_DEM, "DEM Files:", VIK_LAYER_WIDGET_FILELIST },
 };
 
 };
 
-enum { PARAM_TV, PARAM_WV, PARAM_DM, PARAM_DL, PARAM_DP, PARAM_DE, PARAM_EF, PARAM_DS, PARAM_SL, PARAM_LT, PARAM_BLT, PARAM_TBGC, PARAM_VMIN, PARAM_VMAX, PARAM_DLA, PARAM_WPC, PARAM_WPTC, PARAM_WPBC, PARAM_WPBA, PARAM_WPSYM, PARAM_WPSIZE, PARAM_WPSYMS, PARAM_DI, PARAM_IS, PARAM_IA, PARAM_ICS, PARAM_DEMS, NUM_PARAMS };
+enum { PARAM_TV, PARAM_WV, PARAM_DM, PARAM_DL, PARAM_DP, PARAM_DE, PARAM_EF, PARAM_DS, PARAM_SL, PARAM_LT, PARAM_BLT, PARAM_TBGC, PARAM_VMIN, PARAM_VMAX, PARAM_DLA, PARAM_WPC, PARAM_WPTC, PARAM_WPBC, PARAM_WPBA, PARAM_WPSYM, PARAM_WPSIZE, PARAM_WPSYMS, PARAM_DI, PARAM_IS, PARAM_IA, PARAM_ICS, NUM_PARAMS };
 
 /*** TO ADD A PARAM:
  *** 1) Add to trw_layer_params and enumeration
  *** 2) Handle in get_param & set_param (presumably adding on to VikTrwLayer struct)
 
 /*** TO ADD A PARAM:
  *** 1) Add to trw_layer_params and enumeration
  *** 2) Handle in get_param & set_param (presumably adding on to VikTrwLayer struct)
- *** 3) Add code to copy_layer, free, and new (try searching for ->dems)
  ***/
 
 /****** END PARAMETERS ******/
  ***/
 
 /****** END PARAMETERS ******/
@@ -596,7 +590,6 @@ static gboolean trw_layer_set_param ( VikTrwLayer *vtl, guint16 id, VikLayerPara
     case PARAM_WPSYM: if ( data.u < WP_NUM_SYMBOLS ) vtl->wp_symbol = data.u; break;
     case PARAM_WPSIZE: if ( data.u > 0 && data.u <= 64 ) vtl->wp_size = data.u; break;
     case PARAM_WPSYMS: vtl->wp_draw_symbols = data.b; break;
     case PARAM_WPSYM: if ( data.u < WP_NUM_SYMBOLS ) vtl->wp_symbol = data.u; break;
     case PARAM_WPSIZE: if ( data.u > 0 && data.u <= 64 ) vtl->wp_size = data.u; break;
     case PARAM_WPSYMS: vtl->wp_draw_symbols = data.b; break;
-    case PARAM_DEMS: a_dems_load_list ( &(data.sl) ); a_dems_list_free ( vtl->dems ); vtl->dems = data.sl; break;
   }
   return TRUE;
 }
   }
   return TRUE;
 }
@@ -632,7 +625,6 @@ static VikLayerParamData trw_layer_get_param ( VikTrwLayer *vtl, guint16 id )
     case PARAM_WPSYM: rv.u = vtl->wp_symbol; break;
     case PARAM_WPSIZE: rv.u = vtl->wp_size; break;
     case PARAM_WPSYMS: rv.b = vtl->wp_draw_symbols; break;
     case PARAM_WPSYM: rv.u = vtl->wp_symbol; break;
     case PARAM_WPSIZE: rv.u = vtl->wp_size; break;
     case PARAM_WPSYMS: rv.b = vtl->wp_draw_symbols; break;
-    case PARAM_DEMS: rv.sl = vtl->dems; break;
   }
   return rv;
 }
   }
   return rv;
 }
@@ -744,8 +736,6 @@ static VikTrwLayer *trw_layer_copy ( VikTrwLayer *vtl, gpointer vp )
   g_hash_table_foreach ( vtl->waypoints, (GHFunc) waypoint_copy, rv->waypoints );
   g_hash_table_foreach ( vtl->tracks, (GHFunc) track_copy, rv->tracks );
 
   g_hash_table_foreach ( vtl->waypoints, (GHFunc) waypoint_copy, rv->waypoints );
   g_hash_table_foreach ( vtl->tracks, (GHFunc) track_copy, rv->tracks );
 
-  rv->dems = a_dems_list_copy ( vtl->dems );
-
   return rv;
 }
 
   return rv;
 }
 
@@ -773,8 +763,6 @@ VikTrwLayer *vik_trw_layer_new ( gint drawmode )
   rv->tracks_iters = g_hash_table_new_full ( g_str_hash, g_str_equal, NULL, g_free );
   rv->waypoints_iters = g_hash_table_new_full ( g_str_hash, g_str_equal, NULL, g_free );
 
   rv->tracks_iters = g_hash_table_new_full ( g_str_hash, g_str_equal, NULL, g_free );
   rv->waypoints_iters = g_hash_table_new_full ( g_str_hash, g_str_equal, NULL, g_free );
 
-  rv->dems = NULL;
-
   /* TODO: constants at top */
   rv->waypoints_visible = rv->tracks_visible = TRUE;
   rv->drawmode = drawmode;
   /* TODO: constants at top */
   rv->waypoints_visible = rv->tracks_visible = TRUE;
   rv->drawmode = drawmode;
@@ -823,8 +811,6 @@ void vik_trw_layer_free ( VikTrwLayer *trwlayer )
   g_hash_table_destroy(trwlayer->waypoints);
   g_hash_table_destroy(trwlayer->tracks);
 
   g_hash_table_destroy(trwlayer->waypoints);
   g_hash_table_destroy(trwlayer->tracks);
 
-  a_dems_list_free ( trwlayer->dems );
-
   /* ODC: replace with GArray */
   trw_layer_free_track_gcs ( trwlayer );
 
   /* ODC: replace with GArray */
   trw_layer_free_track_gcs ( trwlayer );
 
@@ -2008,7 +1994,7 @@ static void trw_layer_apply_dem_data ( gpointer pass_along[6] )
   /* Also warn if overwrite old elevation data */
   VikTrack *track = (VikTrack *) g_hash_table_lookup ( VIK_TRW_LAYER(pass_along[0])->tracks, pass_along[3] );
 
   /* Also warn if overwrite old elevation data */
   VikTrack *track = (VikTrack *) g_hash_table_lookup ( VIK_TRW_LAYER(pass_along[0])->tracks, pass_along[3] );
 
-  vik_track_apply_dem_data ( track, VIK_TRW_LAYER(pass_along[0])->dems );
+  vik_track_apply_dem_data ( track );
 }
 
 
 }