/** * Process selected files and try to generate waypoints storing them in the given vtl */ static gboolean datasource_geotag_process ( VikTrwLayer *vtl, ProcessOptions *po, BabelStatusFunc status_cb, acq_dialog_widgets_t *adw, gpointer not_used ) { datasource_geotag_user_data_t *user_data = (datasource_geotag_user_data_t *)adw->user_data; // Process selected files // In prinicple this loading should be quite fast and so don't need to have any progress monitoring GSList *cur_file = user_data->filelist; while ( cur_file ) { gchar *filename = cur_file->data; gchar *name; VikWaypoint *wp = a_geotag_create_waypoint_from_file ( filename, vik_viewport_get_coord_mode ( adw->vvp ), &name ); if ( wp ) { // Create name if geotag method didn't return one if ( !name ) name = g_strdup ( a_file_basename ( filename ) ); vik_trw_layer_filein_add_waypoint ( vtl, name, wp ); g_free ( name ); } else { gchar* msg = g_strdup_printf ( _("Unable to create waypoint from %s"), filename ); vik_window_statusbar_update ( adw->vw, msg, VIK_STATUSBAR_INFO ); g_free (msg); } g_free ( filename ); cur_file = g_slist_next ( cur_file ); } /* Free memory */ g_slist_free ( user_data->filelist ); // No failure return TRUE; }
/** * Load a single JPG into a Trackwaypoint Layer as a waypoint * * @top: The Aggregate layer that a new TRW layer may be created in * @filename: The JPG filename * @vvp: The viewport * * Returns: Whether the loading was a success or not * * If the JPG has geotag information then the waypoint will be created with the appropriate position. * Otherwise the waypoint will be positioned at the current screen center. * If a TRW layer is already selected the waypoint will be created in that layer. */ gboolean a_jpg_load_file ( VikAggregateLayer *top, const gchar *filename, VikViewport *vvp ) { gboolean auto_zoom = TRUE; VikWindow *vw = (VikWindow *)(VIK_GTK_WINDOW_FROM_LAYER(VIK_LAYER(top))); VikLayersPanel *vlp = vik_window_layers_panel ( vw ); // Auto load into TrackWaypoint layer if one is selected VikLayer *vtl = vik_layers_panel_get_selected ( vlp ); gboolean create_layer = FALSE; if ( vtl == NULL || vtl->type != VIK_LAYER_TRW ) { // Create layer if necessary vtl = vik_layer_create ( VIK_LAYER_TRW, vvp, FALSE ); vik_layer_rename ( vtl, a_file_basename ( filename ) ); create_layer = TRUE; } gchar *name = NULL; VikWaypoint *wp = NULL; #ifdef VIK_CONFIG_GEOTAG wp = a_geotag_create_waypoint_from_file ( filename, vik_viewport_get_coord_mode (vvp), &name ); #endif if ( wp ) { // Create name if geotag method didn't return one if ( !name ) name = g_strdup ( a_file_basename ( filename ) ); vik_trw_layer_filein_add_waypoint ( VIK_TRW_LAYER(vtl), name, wp ); g_free ( name ); } else { wp = vik_waypoint_new (); wp->visible = TRUE; vik_trw_layer_filein_add_waypoint ( VIK_TRW_LAYER(vtl), (gchar*) a_file_basename(filename), wp ); vik_waypoint_set_image ( wp, filename ); // Simply set position to the current center wp->coord = *( vik_viewport_get_center ( vvp ) ); auto_zoom = FALSE; } // Complete the setup vik_layer_post_read ( vtl, vvp, TRUE ); if ( create_layer ) vik_aggregate_layer_add_layer ( top, vtl, FALSE ); if ( auto_zoom ) vik_trw_layer_auto_set_view ( VIK_TRW_LAYER(vtl), vvp ); // ATM This routine can't fail return TRUE; }
/** * Correlate the image to any track within the TrackWaypoint layer */ static void trw_layer_geotag_process ( geotag_options_t *options ) { if ( !options->vtl || !IS_VIK_LAYER(options->vtl) ) return; if ( !options->image ) return; gboolean has_gps_exif = FALSE; gchar* datetime = a_geotag_get_exif_date_from_file ( options->image, &has_gps_exif ); if ( datetime ) { // If image already has gps info - don't attempt to change it. if ( !options->ov.overwrite_gps_exif && has_gps_exif ) { if ( options->ov.create_waypoints ) { // Create waypoint with file information gchar *name = NULL; VikWaypoint *wp = a_geotag_create_waypoint_from_file ( options->image, vik_trw_layer_get_coord_mode (options->vtl), &name ); if ( !name ) name = g_strdup ( a_file_basename ( options->image ) ); vik_trw_layer_filein_add_waypoint ( options->vtl, name, wp ); g_free ( name ); // Mark for redraw options->redraw = TRUE; } g_free ( datetime ); return; } options->PhotoTime = ConvertToUnixTime ( datetime, EXIF_DATE_FORMAT, options->ov.TimeZoneHours, options->ov.TimeZoneMins); g_free ( datetime ); // Apply any offset options->PhotoTime = options->PhotoTime + options->ov.time_offset; options->found_match = FALSE; if ( options->track ) { // Single specified track // NB Doesn't care about track name trw_layer_geotag_track ( NULL, options->track, options ); } else { // Try all tracks GHashTable *tracks = vik_trw_layer_get_tracks ( options->vtl ); if ( g_hash_table_size (tracks) > 0 ) { g_hash_table_foreach ( tracks, (GHFunc) trw_layer_geotag_track, options ); } } // Match found ? if ( options->found_match ) { if ( options->ov.create_waypoints ) { // Create waypoint with found position gchar *name = NULL; VikWaypoint *wp = a_geotag_create_waypoint_positioned ( options->image, options->coord, options->altitude, &name ); if ( !name ) name = g_strdup ( a_file_basename ( options->image ) ); vik_trw_layer_filein_add_waypoint ( options->vtl, name, wp ); g_free ( name ); // Mark for redraw options->redraw = TRUE; } // Write EXIF if specified if ( options->ov.write_exif ) { a_geotag_write_exif_gps ( options->image, options->coord, options->altitude, options->ov.no_change_mtime ); } } } }