7
#include "geo_photos.h"
11
#include "interface.h"
14
#include "tile_management.h"
18
#include <glib/gprintf.h>
22
#include <libexif/exif-data.h>
26
#define PHOTO_DB "geophoto.db"
28
GList *geocode_photo_list;
29
GtkWidget *dialog_image_data = NULL;
30
GtkWidget *dialog_photo_correlate = NULL;
31
GtkWidget *dialog_geocode_result = NULL;
33
char *geocode_photodir = NULL;
34
char *geocode_trackname = NULL;
35
int geocode_correction = 0;
36
int geocode_timezone = 0;
37
gboolean add_to_database = TRUE;
41
void geocode_set_photodir (char *dirname, GtkWidget *widget);
42
void geocode_set_trackname(char *trackname, GtkWidget *widget);
44
char *get_basename(char *file);
45
GList *get_entries_from_dir(char *dirname);
46
gboolean file_type_test(const char *file, char *type);
48
void update_gps_time_label();
49
gpointer geocode_thread(gpointer user_data);
57
sql_cb__photo(void *unused, int colc, char **colv, char **col_names)
59
photo_t *photo = g_new0(photo_t,1);
61
printf("*** %s(): \n",__PRETTY_FUNCTION__);
63
photo->filename = g_strdup(colv[0]);
64
photo->name = g_strdup(colv[1]);
65
photo->lat = atof(colv[2]);
66
photo->lon = atof(colv[3]);
67
photo->desc = g_strdup(colv[4]);
69
photo_list = g_slist_prepend(photo_list, photo);
85
int pixel_x, pixel_y, x, y;
90
static GdkPixbuf *photo_icon = NULL;
93
printf("*** %s(): \n",__PRETTY_FUNCTION__);
98
gc = gdk_gc_new(pixmap);
102
gdk_gc_set_rgb_fg_color(gc, &color);
107
photo_icon = gdk_pixbuf_new_from_file_at_size (
108
PACKAGE_PIXMAPS_DIR "/tangogps-photo.png", 24,24,
112
if(global_show_photos)
116
for(list = photo_list; list != NULL; list = list->next)
118
photo_t *p = list->data;
119
GdkPixbuf *thumb = NULL, *pixbuf_ptr;
121
lat = deg2rad(p->lat);
122
lon = deg2rad(p->lon);
126
pixel_x = lon2pixel(global_zoom, lon);
127
pixel_y = lat2pixel(global_zoom, lat);
129
x = pixel_x - global_x;
130
y = pixel_y - global_y;
137
if(global_zoom >= 17)
139
thumb = gdk_pixbuf_new_from_file_at_scale (p->filename, 48, 48, FALSE, &error);
141
printf("could not open %s \n", p->filename);
143
printf("loading thumb %s okay \n", p->filename);
146
if(!photo_icon && !thumb)
161
if(global_zoom >= 17 && thumb)
168
pixbuf_ptr = photo_icon;
176
x-icon_size/2,y-icon_size/2,
178
GDK_RGB_DITHER_NONE, 0, 0);
182
gtk_widget_queue_draw_area (
187
printf("PHOTO: %s lat %f - lon %f\n",p->name,p->lat, p->lon);
197
bbox_t bbox = get_bbox_deg();
199
db = g_strconcat(tangogps_dir,"/", PHOTO_DB, NULL);
204
g_slist_free(photo_list);
209
sql = g_strdup_printf(
210
"SELECT * FROM photo "
211
"WHERE lat<%f AND lat>%f AND lon>%f AND lon<%f "
214
bbox.lon1, bbox.lon2 );
217
sql_execute(db, sql, sql_cb__photo);
224
geo_photos_open_dialog_photo_correlate()
226
GtkWidget *label1, *label2;
229
printf("%s\n",__PRETTY_FUNCTION__);
230
if(!dialog_photo_correlate)
232
dialog_photo_correlate = create_dialog_geocode();
235
tmp = gconf_client_get_int(global_gconfclient, GCONF"/geocode_timezone", NULL);
236
geocode_timezone = (tmp) ? tmp - 13 : 0 ;
237
geocode_correction = gconf_client_get_int(global_gconfclient, GCONF"/geocode_correction", NULL);
240
label1 = lookup_widget(dialog_photo_correlate, "label172");
241
label2 = lookup_widget(dialog_photo_correlate, "label174");
243
label_txt = g_strdup_printf(" %d seconds", geocode_correction);
244
gtk_label_set_label(GTK_LABEL(label2), label_txt);
246
label_txt = g_strdup_printf(" %d:00h", geocode_timezone);
247
gtk_label_set_label(GTK_LABEL(label1), label_txt);
251
gtk_widget_show(dialog_photo_correlate);
256
geo_photos_open_dialog_image_data()
258
GtkWidget *combobox, *entry;
260
if(!dialog_image_data)
262
dialog_image_data = create_dialog_image_data();
263
gtk_widget_show(dialog_image_data);
265
combobox = lookup_widget(dialog_image_data, "combobox7");
266
gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), geocode_timezone + 12);
267
entry = lookup_widget(dialog_image_data, "entry28");
268
gtk_entry_set_text(GTK_ENTRY(entry), g_strdup_printf("%d", geocode_correction));
270
geo_photo_dialog_image_data_next(dialog_image_data, NULL, GEOPHOTO_FIRST);
273
gtk_widget_show(dialog_image_data);
274
gtk_widget_hide(dialog_photo_correlate);
280
geo_photos_geocode_track_select_dialog (GtkButton *button,
284
GtkFileFilter *filter;
289
widget = gtk_file_chooser_dialog_new (
290
"Select a GPS track log",
292
GTK_FILE_CHOOSER_ACTION_OPEN,
293
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
294
GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
298
gtk_file_chooser_set_action (GTK_FILE_CHOOSER(widget), GTK_FILE_CHOOSER_ACTION_OPEN );
299
gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER(widget), FALSE);
300
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(widget),global_track_dir);
303
filter = gtk_file_filter_new ();
304
gtk_file_filter_add_pattern (filter, "*.gpx");
305
gtk_file_filter_add_pattern (filter, "*.GPX");
306
gtk_file_filter_set_name (filter, "GPX trace log files (*.gpx)");
307
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(widget), filter);
310
filter = gtk_file_filter_new ();
311
gtk_file_filter_add_pattern (filter, "*.log");
312
gtk_file_filter_set_name (filter, "tangoGPS log files (*.log)");
313
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(widget), filter);
315
gtk_file_chooser_set_filter (GTK_FILE_CHOOSER(widget), filter);
319
if (gtk_dialog_run (GTK_DIALOG (widget)) == GTK_RESPONSE_ACCEPT)
323
filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget));
324
printf ("%s \n",filename);
327
geocode_set_trackname(filename, GTK_WIDGET(button));
329
if(file_type_test(filename, "log"))
330
tracks_on_file_button_release_event(NULL, NULL, filename);
332
printf("There is no GPX importer yet :-( \n");
337
printf("%s(): file dialog cancelled \n", __PRETTY_FUNCTION__);
339
gtk_widget_destroy (widget);
345
geo_photos_geocode_dir_select_dialog (GtkButton *button,
352
widget = gtk_file_chooser_dialog_new (
353
"Choose the directory containing your photos",
355
GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
356
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
357
GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
361
gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER(widget), FALSE);
366
if (gtk_dialog_run (GTK_DIALOG (widget)) == GTK_RESPONSE_ACCEPT)
370
filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget));
371
printf ("%s \n",filename);
374
geocode_set_photodir(filename, GTK_WIDGET(button));
379
printf("%s(): file dialog cancelled \n", __PRETTY_FUNCTION__);
381
gtk_widget_destroy (widget);
387
geocode_set_trackname(char *trackname, GtkWidget *widget)
389
GtkWidget *label, *image, *button;
391
geocode_trackname = g_strdup(trackname);
393
image = gtk_image_new_from_stock("gtk-open", GTK_ICON_SIZE_BUTTON);
394
gtk_button_set_image(GTK_BUTTON(widget), image);
395
label = lookup_widget(widget, "label154");
396
gtk_label_set_label(GTK_LABEL(label), "<span color=\"#090\"><b>ok</b></span>");
397
gtk_button_set_label(GTK_BUTTON(widget), get_basename(geocode_trackname));
399
button = lookup_widget(widget, "okbutton8");
401
gtk_widget_set_sensitive(button, TRUE);
406
geocode_set_photodir(char *photodir, GtkWidget *widget)
408
GtkWidget *label, *image, *button;
410
geocode_photodir = g_strdup(photodir);
412
if(geocode_photo_list)
414
g_list_free(geocode_photo_list);
415
geocode_photo_list = NULL;
416
gtk_widget_destroy(dialog_image_data);
417
dialog_image_data = NULL;
420
geocode_photo_list = get_entries_from_dir(geocode_photodir);
422
image = gtk_image_new_from_stock("gtk-open", GTK_ICON_SIZE_BUTTON);
423
gtk_button_set_image(GTK_BUTTON(widget), image);
424
label = lookup_widget(widget, "label155");
425
gtk_label_set_label(GTK_LABEL(label), "<span color=\"#090\"><b>ok</b></span>");
426
gtk_button_set_label(GTK_BUTTON(widget), get_basename(geocode_photodir));
428
button = lookup_widget(widget, "button44");
429
gtk_widget_set_sensitive(button, TRUE);
432
button = lookup_widget(widget, "okbutton8");
433
if(geocode_trackname)
434
gtk_widget_set_sensitive(button, TRUE);
442
geo_photos_dialog_image_data_next()
448
get_basename(char *file)
454
array = g_strsplit(file, "/", -1);
455
while (array[i]) i++;
457
basename = g_strdup(array[i-1]);
464
get_entries_from_dir(char *dirname)
472
dir = g_dir_open(dirname, 0, &error);
476
file = g_dir_read_name(dir);
480
char *fullfile = g_strconcat(dirname,"/",file,NULL);
482
isfile = g_file_test(fullfile, G_FILE_TEST_IS_REGULAR);
484
(file_type_test(fullfile,"jpg") || file_type_test(fullfile,"JPG") ||
485
file_type_test(fullfile,"jpeg") || file_type_test(fullfile,"JPEG"))
488
printf("pic: %s/%s \n", dirname, file);
489
list = g_list_insert_sorted(list, g_strconcat(dirname, "/", file, NULL), (GCompareFunc)g_strcmp0);
491
file = g_dir_read_name(dir);
501
file_type_test(const char *file, char *type)
506
arr = g_strsplit(file, ".", -1);
509
if (g_strcmp0(arr[i-1], type))
519
geo_photo_dialog_image_data_next(GtkWidget *widget, gpointer user_data, geo_photo_move_e move)
521
GtkWidget *image, *viewport, *label, *forward_button, *back_button, *first_button, *last_button, *zoom_button;
522
static GdkPixbuf *pixbuf = NULL;
524
int height, img_width;
525
gboolean fullsize = FALSE;
529
image = lookup_widget(widget, "image5");
530
viewport = lookup_widget(widget, "viewport8");
531
label = lookup_widget(widget, "label163");
532
forward_button = lookup_widget(widget, "button46");
533
back_button = lookup_widget(widget, "button45");
534
first_button = lookup_widget(widget, "button47");
535
last_button = lookup_widget(widget, "button48");
536
zoom_button = lookup_widget(widget, "button50");
539
printf("%s: viewport h,w: %d %d \n", __PRETTY_FUNCTION__, viewport->allocation.height, viewport->allocation.width);
540
height = viewport->allocation.height;
545
if(geocode_photo_list->next)
547
geocode_photo_list = geocode_photo_list->next;
548
gtk_widget_set_sensitive (back_button, TRUE);
549
gtk_widget_set_sensitive (first_button, TRUE);
551
if(!geocode_photo_list->next)
553
gtk_widget_set_sensitive (forward_button, FALSE);
554
gtk_widget_set_sensitive (last_button, FALSE);
556
gtk_widget_set_sensitive(zoom_button, TRUE);
559
if(geocode_photo_list->prev)
561
geocode_photo_list = geocode_photo_list->prev;
562
gtk_widget_set_sensitive (forward_button, TRUE);
563
gtk_widget_set_sensitive (last_button, TRUE);
565
if(!geocode_photo_list->prev)
567
gtk_widget_set_sensitive (back_button, FALSE);
568
gtk_widget_set_sensitive (first_button, FALSE);
570
gtk_widget_set_sensitive(zoom_button, TRUE);
573
geocode_photo_list = g_list_first(geocode_photo_list);
574
gtk_widget_set_sensitive (forward_button, TRUE);
575
gtk_widget_set_sensitive (last_button, TRUE);
576
gtk_widget_set_sensitive (back_button, FALSE);
577
gtk_widget_set_sensitive (first_button, FALSE);
578
gtk_widget_set_sensitive(zoom_button, TRUE);
581
geocode_photo_list = g_list_last(geocode_photo_list);
582
gtk_widget_set_sensitive (back_button, TRUE);
583
gtk_widget_set_sensitive (first_button, TRUE);
584
gtk_widget_set_sensitive (forward_button, FALSE);
585
gtk_widget_set_sensitive (last_button, FALSE);
586
gtk_widget_set_sensitive(zoom_button, TRUE);
588
case GEOPHOTO_FULLSIZE:
593
g_object_unref (pixbuf);
597
pixbuf = gdk_pixbuf_new_from_file_at_scale((const gchar *) geocode_photo_list->data, -1, height, TRUE, &err);
599
printf("%s loading pixbuf failed - actually this should not happen\n", __PRETTY_FUNCTION__);
601
gtk_image_set_from_pixbuf(GTK_IMAGE(image), pixbuf);
605
gtk_image_set_from_file(GTK_IMAGE(image), (const gchar *) geocode_photo_list->data);
606
img_width = gdk_pixbuf_get_width(gtk_image_get_pixbuf(GTK_IMAGE(image)));
609
ed = exif_data_new_from_file((const gchar *) geocode_photo_list->data);
611
printf("File not readable or no EXIF data in file %s\n", (const gchar *) geocode_photo_list->data);
615
datetime = show_tag(ed, EXIF_IFD_0, EXIF_TAG_DATE_TIME);
616
strptime(datetime, "%Y:%m:%d %H:%M:%S", &tm_photo);
618
gtk_label_set_label(GTK_LABEL(label), datetime);
619
update_gps_time_label();
621
gtk_widget_show (image);
626
geo_photo_close_dialog_image_data()
628
GtkWidget *entry, *label1, *label2, *combobox;
632
entry = lookup_widget(dialog_image_data, "entry28");
633
combobox = lookup_widget(dialog_image_data, "combobox7");
635
geocode_timezone = gtk_combo_box_get_active(GTK_COMBO_BOX(combobox))-12;
637
label1 = lookup_widget(dialog_photo_correlate, "label172");
638
label2 = lookup_widget(dialog_photo_correlate, "label174");
640
txt = gtk_entry_get_text(GTK_ENTRY(entry));
641
geocode_correction = atoi(txt);
643
label_txt = g_strdup_printf(" %d seconds", geocode_correction);
644
gtk_label_set_label(GTK_LABEL(label2), label_txt);
646
label_txt = g_strdup_printf(" %d:00h", geocode_timezone);
647
gtk_label_set_label(GTK_LABEL(label1), label_txt);
649
gconf_client_set_int(global_gconfclient, GCONF"/geocode_correction", geocode_correction, NULL);
650
gconf_client_set_int(global_gconfclient, GCONF"/geocode_timezone", geocode_timezone+13, NULL);
652
gtk_widget_hide(dialog_image_data);
653
gtk_widget_show(dialog_photo_correlate);
657
geo_photo_cancel_dialog_image_data()
659
gtk_widget_hide(dialog_image_data);
660
gtk_widget_show(dialog_photo_correlate);
665
geo_photo_cancel_dialog_photo_correlate()
667
gtk_widget_hide(dialog_photo_correlate);
671
geo_photo_set_timezone(GtkComboBox *combobox)
673
geocode_timezone = gtk_combo_box_get_active(combobox)-12;
674
update_gps_time_label();
678
geo_photo_set_add_to_database(GtkToggleButton *togglebutton)
680
add_to_database = gtk_toggle_button_get_active(togglebutton);
681
printf("add_to_database: %d\n", add_to_database);
685
geo_photo_close_dialog_photo_correlate()
691
dialog_geocode_result = create_dialog_geocode_result();
693
gtk_widget_show(dialog_geocode_result);
694
gtk_widget_hide(dialog_photo_correlate);
696
command_line = g_strdup_printf("/tmp/tangogps_geocode.pl '%s' '%s' '%d' '%d' '%d'",
702
printf("commandline out thread: %s\n", command_line);
704
g_thread_create(geocode_thread, command_line, FALSE, NULL);
712
geo_photo_correction_entry_cb(GtkEditable *editable)
714
update_gps_time_label();
718
update_gps_time_label()
720
GtkWidget *label, *entry, *combobox;
728
label = lookup_widget(dialog_image_data, "label171");
729
entry = lookup_widget(dialog_image_data, "entry28");
730
combobox = lookup_widget(dialog_image_data, "combobox7");
732
correction = atoi(gtk_entry_get_text(GTK_ENTRY(entry)));
733
timezone = gtk_combo_box_get_active(GTK_COMBO_BOX(combobox))-12;
735
time = mktime(&tm_photo) + correction - timezone*3600;
737
tm_gps = localtime(&time);
738
printf("timezone: %d\n", timezone);
740
strftime(buf, sizeof(buf), "<span color=\"#009\">%a %Y-%m-%d %H:%M:%S</span>", tm_gps);
742
gtk_label_set_label(GTK_LABEL(label), buf);
752
geocode_thread(gpointer user_data)
754
GtkWidget *label, *item;
755
gchar *standard_output;
756
gchar *standard_error;
759
char *command_line = (char *) user_data;
762
printf("commandline in thread: %s\n", command_line);
764
res = g_spawn_command_line_sync (
773
fprintf (stderr, "Error running tangogps_geocode.pl: %s\n", err->message);
777
printf ("%s(): STDERR \n%s \nRET: %d \n", __PRETTY_FUNCTION__, standard_error, exit_status);
781
label = lookup_widget(dialog_geocode_result, "label177");
782
gtk_label_set_text(GTK_LABEL(label), g_strdup(standard_output));
786
item = lookup_widget(menu1, "item9");
787
gtk_menu_item_activate (GTK_MENU_ITEM(item));
792
g_free(command_line);
805
printf("* %s\n", __PRETTY_FUNCTION__);
817
"# (C)2008 Marcus Bauer, License: GPLv2, marus.bauer@gmail.com\n"
820
"# helper for tangoGPS to geocode photos\n"
823
"# needs: gpscorrelate, sqlite3, jhead\n"
826
"# - .log or .gpx file\n"
833
"# - convert to gpx\n"
835
"# - in2db tangogps\n"
837
"# gpscorrelate -g foo.gpx -z timezone --max-dist 120 --photooffset 5 p1.jpg ...\n"
839
"$geocode_track = $ARGV[0];\n"
840
"$geocode_dir = $ARGV[1];\n"
841
"$timezone = $ARGV[2];\n"
842
"$correction = $ARGV[3];\n"
843
"$do_insert2db = $ARGV[4];\n"
845
"$db = \"~/.tangogps/geophoto.db\";\n"
847
"#=================== MAIN ====================\n"
851
" geocode_track = $ARGV[0];\n"
852
" geocode_dir = $ARGV[1];\n"
853
" timezone = $ARGV[2];\n"
854
" correction = $ARGV[3];\n"
855
" do_insert2db = $ARGV[4];\n"
858
"&test_for_helper_programs();\n"
859
"&get_photos_from_dir();\n"
865
"#================== END MAIN ==================\n"
867
"sub test_for_helper_programs()\n"
869
" # jhead, sqlite3, gpscorrelate\n"
871
" $missing_prog = 0;\n"
873
" if(system(\"jhead -h >/dev/null\") == -1){ $install .= \" jhead,\"; $missing_prog = 1;};\n"
874
" if(system(\"sqlite3\") == -1) { $install .= \" sqlite3, \"; $missing_prog = 1;};\n"
875
" if(system(\"gpscorrelate -h >/dev/null\") == -1) { $install .= \" gpscorrelate\"; $missing_prog = 1;};\n"
877
" $error_msg = \"Hello, I couldn\'t find the following helper programs: \\n\\n\" .\n"
878
" \" $install \\n\\n\" .\n"
879
" \"-> You can find them in your Linux distribution.\\n\\n\" .\n"
880
" \"Please install them first and try again.\\n\";\n"
882
" if($missing_prog) {print STDOUT $error_msg;\n"
886
"sub get_photos_from_dir()\n"
888
" opendir(DIR, $geocode_dir) || die(\"Cannot open directory\");\n"
889
" @photos= readdir(DIR);\n"
895
" # test if *.log \n"
896
" if($geocode_track =~ /\\.log$/)\n"
898
" &do_convert2gpx();\n"
906
" # construct command line\n"
909
" chdir($geocode_dir);\n"
911
" foreach(@photos)\n"
913
" if( -f \"$_\" && \n"
914
" ( ( $_ =~ /\\.jpg$/i ) ||\n"
915
" ( $_ =~ /\\.jpeg$/i)\n"
919
" $photo_list .= \" \'$_\'\";\n"
921
" else { print STDERR \"not a file: $_ \\n\"; }\n"
924
" # gpscorrelate ... \n"
925
" $command_line = \"gpscorrelate \"\n"
926
" .\"-g \'$geocode_track\' \"\n"
927
" .\"-z $timezone \"\n"
928
" .\"--max-dist 120 \"\n"
929
" .\"--photooffset $correction\"\n"
932
" print STDERR \"$command_line\\n\";\n"
934
" $output = `$command_line`;\n"
936
" print STDOUT \"$output \\n\";\n"
943
" if($do_insert2db)\n"
945
" &do_insert2db();\n"
949
" print STDERR \"Not adding to tangoGPS database\\n\";\n"
955
"#=========== END MAIN FUCTIONS, START HELPER FUNCTIONS ===========\n"
958
"sub do_convert2gpx\n"
961
"#--- open track logfile ---\n"
963
"open (INFILE, $geocode_track) or die $!;\n"
964
"open (OUTFILE, \">/tmp/$$.gpx\") or die $!;\n"
968
"#--- start GPX ---\n"
971
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
972
"<gpx version=\"1.0\"\n"
973
" creator=\"convert2gpx.pl http://www.tangogps.org\"\n"
974
" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n"
975
" xmlns=\"http://www.topografix.com/GPX/1/0\"\n"
976
" xsi:schemaLocation=\"http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd\">\n"
987
"@arr = split(\',\',$_);\n"
991
"<trkpt lat=\"@arr[0]\" lon=\"@arr[1]\">\n"
992
" <ele>@arr[2]</ele>\n"
993
" <speed>@arr[3]</speed>\n"
994
" <course>@arr[4]</course>\n"
996
" <hdop>@arr[5]</hdop>\n"
997
" <time>@arr[6]</time>\n"
1014
"# write .gpx to /tmp/$$\n"
1015
"print OUTFILE $gpx;\n"
1017
"# set geocode_track to filename\n"
1018
"$geocode_track = \"/tmp/$$.gpx\";\n"
1020
"print STDERR \"track: $geocode_track\\n\"\n"
1024
"#------------------------------------------------------------\n"
1026
"#---------------------------------------------\n"
1027
"# get exif info from photo and put into db\n"
1028
"#---------------------------------------------\n"
1033
"local($photo) = @_;\n"
1035
"# ------------------\n"
1036
"# extract exif info\n"
1037
"# ------------------\n"
1038
"$lat_string = `jhead $photo | grep \"GPS Latitude\" `;\n"
1039
"$lon_string = `jhead $photo | grep \"GPS Longitude\" `;\n"
1042
"($lat_half, $lat_deg, $lat_min, $lat_sec) =\n"
1043
" $lat_string =~ /^GPS Latitude : (N|S) +(\\d+)d (\\d+)m +(\\d+\\.\\d+)s$/;\n"
1045
"($lon_half, $lon_deg, $lon_min, $lon_sec) =\n"
1046
" $lon_string =~ /^GPS Longitude: (E|W) +(\\d+)d (\\d+)m +(\\d+\\.\\d+)s$/;\n"
1048
"$lat = $lat_deg + $lat_min/60 + $lat_sec/3600;\n"
1049
"$lat = ($lat_half eq \"N\") ? $lat : -$lat;\n"
1051
"$lon = $lon_deg + $lon_min/60 + $lon_sec/3600;\n"
1052
"$lon = ($lon_half eq \"E\") ? $lon : -$lon;\n"
1055
"#----------------------------\n"
1056
"# extract filename from path \n"
1057
"#----------------------------\n"
1058
"$filename = \"\\\"\" . $photo . \"\\\"\";\n"
1059
"$file = `basename $filename` ;\n"
1061
"$file = \"\\\"\" . $file . \"\\\"\";\n"
1062
"$desc = \"\\\"unset\\\"\";\n"
1066
"print STDERR \"$file $lat - $lon\\n\";\n"
1069
"#-----------------------\n"
1070
"# insert into sqlite db\n"
1071
"#-----------------------\n"
1073
"if ($lat !=0 && $lon !=0)\n"
1075
" $res = `sqlite3 $db \'INSERT INTO photo VALUES (\"$geocode_dir/$photo\",$file,$lat,$lon,$desc)\'`;\n"
1077
" print STDERR $res;\n"
1083
"sub do_insert2db \n"
1086
"#-------------------------------------------\n"
1087
"# create database if it does not yet exist\n"
1088
"#-------------------------------------------\n"
1092
" filename TEXT primary key, \n"
1099
"$res = `sqlite3 $db \'$sql\'`;\n"
1101
"print STDERR $res;\n"
1104
"#-----------------------\n"
1105
"# insert photos into db\n"
1106
"#----------------------\n"
1107
"foreach(@photos)\n"
1110
" # check if jpeg file\n"
1112
" if( -f \"$_\" && \n"
1113
" ( ( $_ =~ /\\.jpg$/i ) ||\n"
1114
" ( $_ =~ /\\.jpeg$/i)\n"
1118
" &exif2db(\"$_\");\n"
1128
fp = fopen("/tmp/tangogps_geocode.pl", "w+");
1130
printf("could not open tmp\n");
1132
fprintf(fp, "%s", command);
1135
system ("chmod 700 /tmp/tangogps_geocode.pl");