diff options
Diffstat (limited to 'gps.c')
-rw-r--r-- | gps.c | 73 |
1 files changed, 59 insertions, 14 deletions
@@ -2,6 +2,7 @@ /* Creates the UI displaying the dives locations on a map. */ #include <glib/gi18n.h> +#include <gdk-pixbuf/gdk-pixbuf.h> #include "osm-gps-map.h" @@ -10,7 +11,10 @@ #include "display-gtk.h" #include "divelist.h" -static OsmGpsMapSource_t opt_map_provider = OSM_GPS_MAP_SOURCE_OPENSTREETMAP; +/* Several map providers are available, such as OSM_GPS_MAP_SOURCE_OPENSTREETMAP + and OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_SATELLITE. We should make more of + them available from e.g. a pull-down menu */ +static OsmGpsMapSource_t opt_map_provider = OSM_GPS_MAP_SOURCE_GOOGLE_STREET; static void on_close (GtkWidget *widget, gpointer user_data) @@ -27,15 +31,11 @@ static void add_gps_point(OsmGpsMap *map, float latitude, float longitude) } -void show_gps_locations() +OsmGpsMap *init_map() { - GtkWidget *window; - OsmGpsMap *map; OsmGpsMapLayer *osd; char *cachedir, *cachebasedir; - int idx; - struct dive *dp; cachebasedir = osm_gps_map_get_default_cache_directory(); cachedir = g_strdup(OSM_GPS_MAP_CACHE_AUTO); @@ -59,14 +59,12 @@ void show_gps_locations() osm_gps_map_layer_add(OSM_GPS_MAP(map), osd); g_object_unref(G_OBJECT(osd)); - for (idx = 0; idx < dive_table.nr; idx++) { - dp = dive_table.dives[idx]; - if (dp->latitude.udeg != 0 && dp->longitude.udeg != 0){ - add_gps_point(map, dp->latitude.udeg / 1000000.0, - dp->longitude.udeg / 1000000.0); - } - } - osm_gps_map_set_center_and_zoom(map, 0, 0, 0); + return map; +} + +void show_map(OsmGpsMap *map) +{ + GtkWidget *window; /* Enable keyboard navigation */ osm_gps_map_set_keyboard_shortcut(map, OSM_GPS_MAP_KEY_FULLSCREEN, GDK_F11); @@ -89,3 +87,50 @@ void show_gps_locations() gtk_widget_show_all (window); } + +void show_gps_location(struct dive *dp) +{ + OsmGpsMap *map; + GError *gerror = NULL; + GdkPixbuf *picture; + + double lat = dp->latitude.udeg / 1000000.0; + double lng = dp->longitude.udeg / 1000000.0; + + map = init_map(); + + if (lat != 0 || lng != 0) { + add_gps_point(map, lat, lng); + osm_gps_map_set_center_and_zoom(map, lat, lng, 8); + picture = gdk_pixbuf_new_from_file("./flag.png", &gerror); + if (picture) { + osm_gps_map_image_add_with_alignment(map, lat, lng, picture, 0, 1); + } else { + printf("error message: %s\n", gerror->message); + } + + } else { + osm_gps_map_set_center_and_zoom(map, 0, 0, 2); + } + show_map(map); +} + +void show_gps_locations() +{ + OsmGpsMap *map; + struct dive *dp; + int idx; + + map = init_map(); + + for (idx = 0; idx < dive_table.nr; idx++) { + dp = dive_table.dives[idx]; + if (dp->latitude.udeg != 0 || dp->longitude.udeg != 0){ + add_gps_point(map, dp->latitude.udeg / 1000000.0, + dp->longitude.udeg / 1000000.0); + } + } + osm_gps_map_set_center_and_zoom(map, 0, 0, 2); + + show_map(map); +} |