diff options
author | Pierre-Yves Chibon <pingou@pingoured.fr> | 2013-01-13 17:44:44 +0100 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2013-01-13 10:08:07 -0800 |
commit | 8ff350387d2e98bb7485e41f6358ccc13e97bab2 (patch) | |
tree | d46609379cfd98f500545679aedcffe29800f16a /gps.c | |
parent | 6a10700ca59e546c7a05688bdf5bffa388286bff (diff) | |
download | subsurface-8ff350387d2e98bb7485e41f6358ccc13e97bab2.tar.gz |
Work on a dive localisation tool using GPS coordinates
For each dive recorded, place their GPS coordinates onto a map using the
OSM-GPS-MAP library.
This map is accessible via the "log" menu or the shortcut ctrl+M (M as map).
We check for the GPS coordinates "0, 0" which are the default when we do not
have real GPS coordinates set.
[Dirk Hohndel: fixed int/float math confusion, fixed some whitespace and
coding style issues, cleaned up some comments, added a
missing cast to prevent a compiler warning]
Signed-off-by: Pierre-Yves Chibon <pingou@pingoured.fr>
Signed-Off-By: Henrik Brautaset Aronsen <subsurface@henrik.synth.no>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'gps.c')
-rw-r--r-- | gps.c | 91 |
1 files changed, 91 insertions, 0 deletions
@@ -0,0 +1,91 @@ +/* gps.c */ +/* Creates the UI displaying the dives locations on a map. + */ +#include <glib/gi18n.h> + +#include "osm-gps-map.h" + +#include "dive.h" +#include "display.h" +#include "display-gtk.h" +#include "divelist.h" + +static OsmGpsMapSource_t opt_map_provider = OSM_GPS_MAP_SOURCE_OPENSTREETMAP; + + +static void on_close (GtkWidget *widget, gpointer user_data) +{ + gtk_widget_destroy(widget); +} + +static void add_gps_point(OsmGpsMap *map, float latitude, float longitude) +{ + OsmGpsMapTrack * track = osm_gps_map_track_new (); + OsmGpsMapPoint * point = osm_gps_map_point_new_degrees (latitude, longitude); + osm_gps_map_track_add_point(track, point); + osm_gps_map_track_add (map, track); +} + + +void show_gps_locations() +{ + 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); + + map = g_object_new (OSM_TYPE_GPS_MAP, + "map-source",opt_map_provider, + "tile-cache",cachedir, + "tile-cache-base", cachebasedir, + "proxy-uri",g_getenv("http_proxy"), + NULL); + osd = g_object_new (OSM_TYPE_GPS_MAP_OSD, + "show-scale",TRUE, + "show-coordinates",TRUE, + "show-crosshair",TRUE, + "show-dpad",TRUE, + "show-zoom",TRUE, + "show-gps-in-dpad",TRUE, + "show-gps-in-zoom",FALSE, + "dpad-radius", 30, + NULL); + + 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); + + /* Enable keyboard navigation */ + osm_gps_map_set_keyboard_shortcut(map, OSM_GPS_MAP_KEY_FULLSCREEN, GDK_KEY_F11); + osm_gps_map_set_keyboard_shortcut(map, OSM_GPS_MAP_KEY_UP, GDK_KEY_Up); + osm_gps_map_set_keyboard_shortcut(map, OSM_GPS_MAP_KEY_DOWN, GDK_KEY_Down); + osm_gps_map_set_keyboard_shortcut(map, OSM_GPS_MAP_KEY_LEFT, GDK_KEY_Left); + osm_gps_map_set_keyboard_shortcut(map, OSM_GPS_MAP_KEY_RIGHT, GDK_KEY_Right); + + window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + + gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); + gtk_window_set_default_size(GTK_WINDOW(window), 640, 480); + gtk_window_set_title(GTK_WINDOW(window), _("Dives locations")); + gtk_container_set_border_width(GTK_CONTAINER(window), 5); + GTK_WINDOW(window)->allow_shrink = TRUE; + + gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET(map)); + + g_signal_connect (window, "destroy", G_CALLBACK (on_close), (gpointer) map); + + gtk_widget_show_all (window); +} |