[osm-gps-map] 16/153: Imported Upstream version 0.4
Ross Gammon
ross-guest at moszumanska.debian.org
Tue May 13 19:58:56 UTC 2014
This is an automated email from the git hooks/post-receive script.
ross-guest pushed a commit to branch master
in repository osm-gps-map.
commit 996704e4a82e22fd3452ad524ea1eb17d4c3dfbb
Author: David Paleino <dapal at debian.org>
Date: Fri Jan 8 22:06:45 2010 +0100
Imported Upstream version 0.4
---
.gitignore | 2 +
ChangeLog | 18 --
Makefile.am | 24 ++-
NEWS | 27 +++
TODO.tasks | 6 -
configure.ac | 4 +-
openstreetmap-gps-map.anjuta | 44 -----
python/configure.ac | 2 +-
python/openstreetmap-gps-map.py | 174 +++++++++++++++++
python/osmgpsmap.defs | 83 +++++++-
python/osmgpsmapmodule.c | 24 +--
python/test.sh | 23 ---
src/main.c | 147 ++++----------
src/osm-gps-map-types.h | 5 +
src/osm-gps-map.c | 424 ++++++++++++++++++++++++++++++++++++----
src/osm-gps-map.h | 42 ++--
16 files changed, 768 insertions(+), 281 deletions(-)
diff --git a/.gitignore b/.gitignore
index fb87dc4..6527261 100644
--- a/.gitignore
+++ b/.gitignore
@@ -30,3 +30,5 @@ python/osmgpsmap.c
src/Makefile
src/openstreetmap-gps-map
stamp-h1
+ChangeLog
+COPYING
diff --git a/ChangeLog b/ChangeLog
deleted file mode 100644
index c9b8f0e..0000000
--- a/ChangeLog
+++ /dev/null
@@ -1,18 +0,0 @@
-2007-12-28 Johannes Schmid,,, <jhs at idefix>
-
- reviewed by: <delete if not using a buddy>
-
- * project.anjuta:
-
-2007-12-23 Johannes Schmid,,, <jhs at idefix>
-
- reviewed by: <delete if not using a buddy>
-
- * src/Makefile.am.tpl:
-
-2007-12-23 Johannes Schmid,,, <jhs at idefix>
-
- reviewed by: <delete if not using a buddy>
-
- * src/Makefile.am.tpl:
-
diff --git a/Makefile.am b/Makefile.am
index ebe57ee..f5b08f0 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -26,13 +26,35 @@ EXTRA_DIST = $(openstreetmap_gps_mapdoc_DATA) \
python/aclocal.m4 \
python/configure \
python/osmgpsmapmodule.c \
- python/test.sh \
+ python/openstreetmap-gps-map.py \
python/AUTHORS \
python/configure.ac \
python/osmgpsmap.override \
python/NEWS \
python/README
+# ChangeLog generation from nautils
+distclean-local:
+ if test "$(srcdir)" = "."; then :; else \
+ rm -f ChangeLog; \
+ fi
+
+ChangeLog:
+ @echo Creating $@
+ @if test -d "$(srcdir)/.git"; then \
+ (GIT_DIR=$(top_srcdir)/.git ./missing --run git log 0.3.. --stat -M -C --name-status --date=short --no-color) | fmt --split-only > $@.tmp \
+ && mv -f $@.tmp $@ \
+ || ($(RM) $@.tmp; \
+ echo Failed to generate ChangeLog, your ChangeLog may be outdated >&2; \
+ (test -f $@ || echo git-log is required to generate this file >> $@)); \
+ else \
+ test -f $@ || \
+ (echo A git checkout and git-log is required to generate ChangeLog >&2 && \
+ echo A git checkout and git-log is required to generate this file >> $@); \
+ fi
+
release:
scp @PACKAGE at -@VERSION at .tar.gz john at open.grcnz.com:/srv/default/downloads/osm-gps-map/
+.PHONY: ChangeLog
+
diff --git a/NEWS b/NEWS
index e69de29..aac5f58 100644
--- a/NEWS
+++ b/NEWS
@@ -0,0 +1,27 @@
+Changes in 0.4.0
+ * Map can now be constructed by passing a MAP_SOURCE ID instead of
+ the map repo uri
+ * Fix iter safety when purging the tile cache
+ * Fix for segfault when adding images to the map
+ * Remove map repo uris from public API. They should now be retrieved using
+ osm_gps_map_source_get_repo_uri(OsmGpsMapSource_t source)
+ * Add osm_gps_map_get_scale
+ * Implement a blank map source that just draws grey tiles
+ * Demo application now stores maps in XDG_CACHE_DIR
+ * Fix build and crashes on windows
+ * Add getters for name and zoom
+ * Add a more complete python example
+ * Add ability to purge the cache
+
+Changes in 0.3.0
+======================
+ * A new major contributor, Alberto Mardegan,
+ worked on many of the new features of this release. Thanks a lot Alberto!
+ * Draw map tracks with Cairo by default.
+ * Interpolate between zoom levels while waiting for a tile to download.
+ * Stop using GET_PRIVATE, and cache priv* for performance.
+ * Keep an extra border of images offscreen for smoother scrolling at
+ the edges of the map.
+ * Keep the last N tiles in memory to improve render performance
+ (previously they were loaded from disk)
+ * Add some new api; osm_gps_set_center, osm_gps_map_scroll.
diff --git a/TODO.tasks b/TODO.tasks
deleted file mode 100644
index d1fa282..0000000
--- a/TODO.tasks
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0"?>
-<gtodo>
- <category title="Personal" place="0"/>
- <category title="Business" place="1"/>
- <category title="Unfiled" place="2"/>
-</gtodo>
diff --git a/configure.ac b/configure.ac
index 0eb98c2..edb063c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,4 +1,4 @@
-AC_INIT(osm-gps-map, 0.2)
+AC_INIT(osm-gps-map, 0.4.0)
AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)
AC_CONFIG_SRCDIR(osmgpsmap.pc.in)
@@ -30,6 +30,8 @@ if test "x$enable_cairo" = "xyes"; then
OPENSTREETMAP_GPS_MAP_LIBS="$OPENSTREETMAP_GPS_MAP_LIBS $CAIRO_LIBS"
fi
+CFLAGS="$CFLAGS -Wall -Wswitch-enum"
+
AC_OUTPUT([
osmgpsmap.pc
Makefile
diff --git a/openstreetmap-gps-map.anjuta b/openstreetmap-gps-map.anjuta
deleted file mode 100644
index 51ddd65..0000000
--- a/openstreetmap-gps-map.anjuta
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0"?>
-<anjuta>
- <plugin name="GBF Project Manager"
- url="http://anjuta.org/plugins/"
- mandatory="yes">
- <require group="Anjuta Plugin"
- attribute="Interfaces"
- value="IAnjutaProjectManager"/>
- <require group="Project"
- attribute="Supported-Project-Types"
- value="automake"/>
- </plugin>
- <plugin name="Symbol Browser"
- url="http://anjuta.org/plugins/"
- mandatory="yes">
- <require group="Anjuta Plugin"
- attribute="Interfaces"
- value="IAnjutaSymbolManager"/>
- </plugin>
- <plugin name="Make Build System"
- url="http://anjuta.org/plugins/"
- mandatory="yes">
- <require group="Anjuta Plugin"
- attribute="Interfaces"
- value="IAnjutaBuildable"/>
- <require group="Build"
- attribute="Supported-Build-Types"
- value="make"/>
- </plugin>
- <plugin name="Task Manager"
- url="http://anjuta.org/plugins/"
- mandatory="no">
- <require group="Anjuta Plugin"
- attribute="Interfaces"
- value="IAnjutaTodo"/>
- </plugin>
- <plugin name="Debug Manager"
- url="http://anjuta.org/plugins/"
- mandatory="no">
- <require group="Anjuta Plugin"
- attribute="Interfaces"
- value="IAnjutaDebuggerManager"/>
- </plugin>
-</anjuta>
diff --git a/python/configure.ac b/python/configure.ac
index 385c2b5..0f74ba6 100644
--- a/python/configure.ac
+++ b/python/configure.ac
@@ -1,5 +1,5 @@
AC_PREREQ(2.53)
-AC_INIT(osmgpsmap-python, 0.1)
+AC_INIT(osmgpsmap-python, 0.4.0)
AC_CONFIG_SRCDIR(osmgpsmap.defs)
AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)
diff --git a/python/openstreetmap-gps-map.py b/python/openstreetmap-gps-map.py
new file mode 100755
index 0000000..6dfcdc6
--- /dev/null
+++ b/python/openstreetmap-gps-map.py
@@ -0,0 +1,174 @@
+#!/usr/bin/python
+
+"""
+ Copyright (C) Hadley Rich 2008 <hads at nice.net.nz>
+ based on main.c - with thanks to John Stowers
+
+ osm-gps.py is free software: you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ osm-gps.py is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+import sys
+import os.path
+import gtk.gdk
+import gobject
+
+#Try static lib first
+mydir = os.path.dirname(os.path.abspath(__file__))
+libdir = os.path.join(mydir, ".libs")
+sys.path.insert(0, libdir)
+
+import osmgpsmap
+
+class UI(gtk.Window):
+ def __init__(self):
+ gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
+
+ self.set_default_size(500, 500)
+ self.connect('destroy', lambda x: gtk.main_quit())
+ self.set_title('OpenStreetMap GPS Mapper')
+
+ self.vbox = gtk.VBox(False, 0)
+ self.add(self.vbox)
+
+ self.osm = osmgpsmap.GpsMap(
+ tile_cache=osmgpsmap.get_default_cache_directory(),
+ )
+ self.osm.connect('button_release_event', self.map_clicked)
+ self.latlon_entry = gtk.Entry()
+
+ zoom_in_button = gtk.Button(stock=gtk.STOCK_ZOOM_IN)
+ zoom_in_button.connect('clicked', self.zoom_in_clicked)
+ zoom_out_button = gtk.Button(stock=gtk.STOCK_ZOOM_OUT)
+ zoom_out_button.connect('clicked', self.zoom_out_clicked)
+ home_button = gtk.Button(stock=gtk.STOCK_HOME)
+ home_button.connect('clicked', self.home_clicked)
+ cache_button = gtk.Button('Cache')
+ cache_button.connect('clicked', self.cache_clicked)
+
+ self.vbox.pack_start(self.osm)
+ hbox = gtk.HBox(False, 0)
+ hbox.pack_start(zoom_in_button)
+ hbox.pack_start(zoom_out_button)
+ hbox.pack_start(home_button)
+ hbox.pack_start(cache_button)
+
+ #add ability to test custom map URIs
+ ex = gtk.Expander("<b>Map Repository URI</b>")
+ ex.props.use_markup = True
+ vb = gtk.VBox()
+ self.repouri_entry = gtk.Entry()
+ self.repouri_entry.set_text(self.osm.props.repo_uri)
+ self.image_format_entry = gtk.Entry()
+ self.image_format_entry.set_text(self.osm.props.image_format)
+ gobtn = gtk.Button("Load Map URI")
+ gobtn.connect("clicked", self.load_map_clicked)
+ exp = gtk.Label(
+"""
+Enter an repository URL to fetch map tiles from in the box below. Special metacharacters may be included in this url
+
+<i>Metacharacters:</i>
+\t#X\tMax X location
+\t#Y\tMax Y location
+\t#Z\tMap zoom (0 = min zoom, fully zoomed out)
+\t#S\tInverse zoom (max-zoom - #Z)
+\t#Q\tQuadtree encoded tile (qrts)
+\t#W\tQuadtree encoded tile (1234)
+\t#U\tEncoding not implemeted
+\t#R\tRandom integer, 0-4""")
+ exp.props.xalign = 0
+ exp.props.use_markup = True
+ exp.props.wrap = True
+
+ ex.add(vb)
+ vb.pack_start(exp, False)
+
+ hb = gtk.HBox()
+ hb.pack_start(gtk.Label("URI: "), False)
+ hb.pack_start(self.repouri_entry, True)
+ vb.pack_start(hb, False)
+
+ hb = gtk.HBox()
+ hb.pack_start(gtk.Label("Image Format: "), False)
+ hb.pack_start(self.image_format_entry, True)
+ vb.pack_start(hb, False)
+
+ vb.pack_start(gobtn, False)
+
+ self.vbox.pack_end(ex, False)
+ self.vbox.pack_end(self.latlon_entry, False)
+ self.vbox.pack_end(hbox, False)
+
+ gobject.timeout_add(500, self.print_tiles)
+
+ def load_map_clicked(self, button):
+ uri = self.repouri_entry.get_text()
+ format = self.image_format_entry.get_text()
+ if uri and format:
+ if self.osm:
+ #remove old map
+ self.vbox.remove(self.osm)
+
+ try:
+ self.osm = osmgpsmap.GpsMap(
+ tile_cache=osmgpsmap.get_default_cache_directory(),
+ repo_uri=uri,
+ image_format=format
+ )
+ self.osm.connect('button_release_event', self.map_clicked)
+ except Exception, e:
+ print "ERROR:", e
+ self.osm = osm.GpsMap()
+
+ self.vbox.pack_start(self.osm, True)
+ self.osm.connect('button_release_event', self.map_clicked)
+ self.osm.show()
+
+ def print_tiles(self):
+ if self.osm.props.tiles_queued != 0:
+ print self.osm.props.tiles_queued, 'tiles queued'
+ return True
+
+ def zoom_in_clicked(self, button):
+ self.osm.set_zoom(self.osm.props.zoom + 1)
+
+ def zoom_out_clicked(self, button):
+ self.osm.set_zoom(self.osm.props.zoom - 1)
+
+ def home_clicked(self, button):
+ self.osm.set_mapcenter(-44.39, 171.25, 12)
+
+ def cache_clicked(self, button):
+ bbox = self.osm.get_bbox()
+ self.osm.download_maps(
+ *bbox,
+ zoom_start=self.osm.props.zoom,
+ zoom_end=self.osm.props.max_zoom
+ )
+
+ def map_clicked(self, osm, event):
+ self.latlon_entry.set_text(
+ 'Map Centre: latitude %s longitude %s' % (
+ self.osm.props.latitude,
+ self.osm.props.longitude
+ )
+ )
+
+
+if __name__ == "__main__":
+ gtk.gdk.threads_init()
+
+ u = UI()
+ u.show_all()
+ gtk.main()
+
diff --git a/python/osmgpsmap.defs b/python/osmgpsmap.defs
index 3ac06d8..6999044 100644
--- a/python/osmgpsmap.defs
+++ b/python/osmgpsmap.defs
@@ -8,7 +8,26 @@
)
;; Enumerations and flags ...
-
+(define-enum MapSource
+ (in-module "Osm")
+ (c-name "OsmGpsMapSource_t")
+ (values
+ '("None" "OSM_GPS_MAP_SOURCE_NULL")
+ '("OpenStreetMap" "OSM_GPS_MAP_SOURCE_OPENSTREETMAP")
+ '("OpenStreetMap Renderer" "OSM_GPS_MAP_SOURCE_OPENSTREETMAP_RENDERER")
+ '("OpenAerialMap" "OSM_GPS_MAP_SOURCE_OPENAERIALMAP")
+ '("Maps For Free" "OSM_GPS_MAP_SOURCE_MAPS_FOR_FREE")
+ '("Google Maps" "OSM_GPS_MAP_SOURCE_GOOGLE_STREET")
+ '("Google Satellite" "OSM_GPS_MAP_SOURCE_GOOGLE_SATELLITE")
+ '("Google Maps Hybrid" "OSM_GPS_MAP_SOURCE_GOOGLE_HYBRID")
+ '("Virtual Earth" "OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_STREET")
+ '("Virtual Earth Satellite" "OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_SATELLITE")
+ '("Virtual Earth Hybrid" "OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_HYBRID")
+ '("Yahoo Maps" "OSM_GPS_MAP_SOURCE_YAHOO_STREET")
+ '("Yahoo Maps Satellite" "OSM_GPS_MAP_SOURCE_YAHOO_SATELLITE")
+ '("Yahoo Maps Hybrid" "OSM_GPS_MAP_SOURCE_YAHOO_HYBRID")
+ )
+)
;; From osm-gps-map.h
@@ -17,6 +36,11 @@
(return-type "GType")
)
+(define-function get_default_cache_directory
+ (c-name "osm_gps_map_get_default_cache_directory")
+ (return-type "char*")
+)
+
(define-method download_maps
(of-object "OsmGpsMap")
(c-name "osm_gps_map_download_maps")
@@ -95,6 +119,15 @@
)
)
+(define-method remove_image
+ (of-object "OsmGpsMap")
+ (c-name "osm_gps_map_remove_image")
+ (return-type "gboolean")
+ (parameters
+ '("GdkPixbuf*" "image")
+ )
+)
+
(define-method clear_images
(of-object "OsmGpsMap")
(c-name "osm_gps_map_clear_images")
@@ -155,6 +188,8 @@
'("min_zoom" (optional))
'("map_x" (optional))
'("map_Y" (optional))
+ '("map_source" (optional))
+ '("image_format" (optional))
)
)
@@ -192,3 +227,49 @@
)
)
+(define-method get_scale
+ (of-object "OsmGpsMap")
+ (c-name "osm_gps_map_get_scale")
+ (return-type "float")
+)
+
+(define-function source_get_repo_uri
+ (c-name "osm_gps_map_source_get_repo_uri")
+ (return-type "const-char*")
+ (parameters
+ '("OsmGpsMapSource_t" "source")
+ )
+)
+
+(define-function source_get_friendly_name
+ (c-name "osm_gps_map_source_get_friendly_name")
+ (return-type "const-char*")
+ (parameters
+ '("OsmGpsMapSource_t" "source")
+ )
+)
+
+(define-function source_get_max_zoom
+ (c-name "osm_gps_map_source_get_max_zoom")
+ (return-type "int")
+ (parameters
+ '("OsmGpsMapSource_t" "source")
+ )
+)
+
+(define-function source_get_min_zoom
+ (c-name "osm_gps_map_source_get_min_zoom")
+ (return-type "int")
+ (parameters
+ '("OsmGpsMapSource_t" "source")
+ )
+)
+
+(define-function source_get_image_format
+ (c-name "osm_gps_map_source_get_image_format")
+ (return-type "const-char*")
+ (parameters
+ '("OsmGpsMapSource_t" "source")
+ )
+)
+
diff --git a/python/osmgpsmapmodule.c b/python/osmgpsmapmodule.c
index c1163a3..e9b22c8 100644
--- a/python/osmgpsmapmodule.c
+++ b/python/osmgpsmapmodule.c
@@ -34,29 +34,7 @@ initosmgpsmap(void)
d = PyModule_GetDict(m);
pyosmgpsmap_register_classes(d);
-
- /* Add this if we ever add an enum or something to osmgpsmap. */
-#if 0
- pyosmgpsmap_add_constants(m, "OSM_GPS_MAP_");
-#endif
-
- /* Manually add all the Map repository strings */
- PyModule_AddObject(m, "MAP_SOURCE_OPENSTREETMAP",
- PyString_FromString(MAP_SOURCE_OPENSTREETMAP));
- PyModule_AddObject(m, "MAP_SOURCE_OPENSTREETMAP_RENDERER",
- PyString_FromString(MAP_SOURCE_OPENSTREETMAP_RENDERER));
- PyModule_AddObject(m, "MAP_SOURCE_OPENAERIALMAP",
- PyString_FromString(MAP_SOURCE_OPENAERIALMAP));
- PyModule_AddObject(m, "MAP_SOURCE_GOOGLE_HYBRID",
- PyString_FromString(MAP_SOURCE_GOOGLE_HYBRID));
- PyModule_AddObject(m, "MAP_SOURCE_GOOGLE_SATTELITE",
- PyString_FromString(MAP_SOURCE_GOOGLE_SATTELITE));
- PyModule_AddObject(m, "MAP_SOURCE_GOOGLE_SATTELITE_QUAD",
- PyString_FromString(MAP_SOURCE_GOOGLE_SATTELITE_QUAD));
- PyModule_AddObject(m, "MAP_SOURCE_MAPS_FOR_FREE",
- PyString_FromString(MAP_SOURCE_MAPS_FOR_FREE));
- PyModule_AddObject(m, "MAP_SOURCE_VIRTUAL_EARTH_SATTELITE",
- PyString_FromString(MAP_SOURCE_VIRTUAL_EARTH_SATTELITE));
+ pyosmgpsmap_add_constants(m, "OSM_GPS_MAP_");
if (PyErr_Occurred()) {
Py_FatalError("can't initialize module osmgpsmap");
diff --git a/python/test.sh b/python/test.sh
deleted file mode 100755
index d624efb..0000000
--- a/python/test.sh
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/sh
-PYTHONPATH=`pwd`/.libs \
- python -c \
-'import gtk.gdk
-import gobject
-import osmgpsmap
-
-gtk.gdk.threads_init()
-
-def print_tiles(map):
- print map.get_property("tiles-queued")
- return True
-
-a = gtk.Window()
-a.connect("destroy", lambda x: gtk.main_quit())
-m = osmgpsmap.GpsMap()
-
-a.add(m)
-a.show_all()
-
-gobject.timeout_add(500, print_tiles, m)
-
-gtk.main()'
diff --git a/src/main.c b/src/main.c
index aa90c16..0603822 100644
--- a/src/main.c
+++ b/src/main.c
@@ -24,24 +24,7 @@
#include <gtk/gtk.h>
#include "osm-gps-map.h"
-typedef struct {
- const char *name;
- const char *uri;
-} map_source_t;
-
-static const map_source_t MAP_SOURCES[] = {
- {"OpenStreetMap", MAP_SOURCE_OPENSTREETMAP },
- {"OpenStreetMap Renderer", MAP_SOURCE_OPENSTREETMAP_RENDERER },
- {"OpenAerialMap", MAP_SOURCE_OPENAERIALMAP },
- {"Google Maps", MAP_SOURCE_GOOGLE_MAPS },
- {"Google Maps Hybrid", MAP_SOURCE_GOOGLE_HYBRID },
- {"Google Sattelite", MAP_SOURCE_GOOGLE_SATTELITE },
- {"Google Sattelite Quad", MAP_SOURCE_GOOGLE_SATTELITE_QUAD },
- {"Maps For Free", MAP_SOURCE_MAPS_FOR_FREE },
- {"Virtual Earth Sattelite", MAP_SOURCE_VIRTUAL_EARTH_SATTELITE },
-};
-
-static int map_provider = 0;
+static OsmGpsMapSource_t map_provider = 0;
static gboolean maps_in_temp = FALSE;
static gboolean debug = FALSE;
static GOptionEntry entries[] =
@@ -52,7 +35,6 @@ static GOptionEntry entries[] =
{ NULL }
};
-
static GdkPixbuf *STAR_IMAGE;
typedef struct {
@@ -60,17 +42,8 @@ typedef struct {
GtkWidget *entry;
} timeout_cb_t;
-float
-deg2rad(float deg)
-{
- return (deg * M_PI / 180.0);
-}
-
-float
-rad2deg(float rad)
-{
- return (rad / M_PI * 180.0);
-}
+#define DEG2RAD(deg) (deg * M_PI / 180.0)
+#define RAD2DEG(rad) (rad / M_PI * 180.0)
gboolean
on_timeout_check_tiles_in_queue(gpointer user_data)
@@ -98,8 +71,8 @@ on_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_d
g_debug("Double clicked %f %f", event->x, event->y);
coord = osm_gps_map_get_co_ordinates(map, (int)event->x, (int)event->y);
osm_gps_map_draw_gps (map,
- rad2deg(coord.rlat),
- rad2deg(coord.rlon),
+ RAD2DEG(coord.rlat),
+ RAD2DEG(coord.rlon),
0);
}
@@ -107,8 +80,8 @@ on_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_d
{
coord = osm_gps_map_get_co_ordinates(map, (int)event->x, (int)event->y);
osm_gps_map_add_image (map,
- rad2deg(coord.rlat),
- rad2deg(coord.rlon),
+ RAD2DEG(coord.rlat),
+ RAD2DEG(coord.rlon),
STAR_IMAGE);
}
return FALSE;
@@ -188,11 +161,13 @@ usage (GOptionContext *context)
puts(g_option_context_get_help(context, TRUE, NULL));
printf("Valid map sources:\n");
- for(i=0; i<(sizeof(MAP_SOURCES)/sizeof(MAP_SOURCES[0])); i++)
- printf("\t%d:\t%s\n",i,MAP_SOURCES[i].name);
+ for(i=OSM_GPS_MAP_SOURCE_NULL; i <= OSM_GPS_MAP_SOURCE_YAHOO_HYBRID; i++)
+ {
+ const char *name = osm_gps_map_source_get_friendly_name(i);
+ printf("\t%d:\t%s\n",i,name);
+ }
}
-
int
main (int argc, char **argv)
{
@@ -205,8 +180,10 @@ main (int argc, char **argv)
GtkWidget *homeButton;
GtkWidget *cacheButton;
GtkWidget *map;
+ const char *repo_uri;
+ const char *friendly_name;
char *cachedir;
- char *homedir;
+ gboolean fullpath;
GError *error = NULL;
GOptionContext *context;
timeout_cb_t *data;
@@ -214,7 +191,7 @@ main (int argc, char **argv)
g_thread_init(NULL);
gtk_init (&argc, &argv);
- context = g_option_context_new ("- test tree model performance");
+ context = g_option_context_new ("- Map browser");
g_option_context_set_help_enabled(context, FALSE);
g_option_context_add_main_entries (context, entries, NULL);
@@ -223,17 +200,25 @@ main (int argc, char **argv)
return 1;
}
- if (map_provider < 0 || map_provider > (sizeof(MAP_SOURCES)/sizeof(MAP_SOURCES[0]))-1) {
+ /* Only use the repo_uri to check if the user has supplied a
+ valid map source ID */
+ repo_uri = osm_gps_map_source_get_repo_uri(map_provider);
+ if ( repo_uri == NULL ) {
usage(context);
return 2;
}
- if (maps_in_temp)
- homedir = g_strdup("/tmp");
- else {
- homedir = g_strdup(g_getenv("HOME"));
- if (!homedir)
- homedir = g_strdup(g_get_home_dir());
+ friendly_name = osm_gps_map_source_get_friendly_name(map_provider);
+
+ if (maps_in_temp) {
+ cachedir = NULL;
+ fullpath = FALSE;
+ } else {
+ char *mapcachedir;
+ mapcachedir = osm_gps_map_get_default_cache_directory();
+ cachedir = g_build_filename(mapcachedir,friendly_name,NULL);
+ g_free(mapcachedir);
+ fullpath = TRUE;
}
if (debug)
@@ -243,68 +228,18 @@ main (int argc, char **argv)
gtk_window_set_default_size(GTK_WINDOW(window), 400, 400);
STAR_IMAGE = gdk_pixbuf_new_from_file_at_size ("poi.png", 24,24,NULL);
- cachedir = g_strdup_printf("%s/Maps/%s", homedir, MAP_SOURCES[map_provider].name);
g_debug("Map Cache Dir: %s", cachedir);
- g_debug("Map Provider: %s (%d)", MAP_SOURCES[map_provider].name, map_provider);
-
- switch(map_provider) {
- //0: OpenStreetMap
- //1: OpenStreetMap Renderer
- //2: OpenAerialMap
- //3: Google Maps
- //4: Google Maps Hybrid
- //5: Google Sattelite
- //6: Google Sattelite Quad
- //7: Maps For Free
- //8: Virtual Earth Sattelite
- case 0:
- case 1:
- case 2:
- case 3:
- case 4:
- default:
- map = g_object_new (OSM_TYPE_GPS_MAP,
- "repo-uri",MAP_SOURCES[map_provider].uri,
- "tile-cache",cachedir,
- "tile-cache-is-full-path",TRUE,
- "proxy-uri",g_getenv("http_proxy"),
- NULL);
- break;
- case 7:
- //Max Zoom = 11
- map = g_object_new (OSM_TYPE_GPS_MAP,
- "repo-uri",MAP_SOURCES[map_provider].uri,
- "tile-cache",cachedir,
- "tile-cache-is-full-path",TRUE,
- "proxy-uri",g_getenv("http_proxy"),
- "max-zoom",11,
- NULL);
- break;
- case 5:
- case 6:
- //Max Zoom = 18
- map = g_object_new (OSM_TYPE_GPS_MAP,
- "repo-uri",MAP_SOURCES[map_provider].uri,
- "tile-cache",cachedir,
- "tile-cache-is-full-path",TRUE,
- "proxy-uri",g_getenv("http_proxy"),
- "max-zoom",18,
- NULL);
- break;
- case 8:
- //Max Zoom = 20
- map = g_object_new (OSM_TYPE_GPS_MAP,
- "repo-uri",MAP_SOURCES[map_provider].uri,
- "tile-cache",cachedir,
- "tile-cache-is-full-path",TRUE,
- "proxy-uri",g_getenv("http_proxy"),
- "max-zoom",20,
- NULL);
- break;
- }
- g_free(cachedir);
+ g_debug("Map Provider: %s (%d)", friendly_name, map_provider);
+
+ map = g_object_new (OSM_TYPE_GPS_MAP,
+ "map-source",map_provider,
+ "tile-cache",cachedir,
+ "tile-cache-is-full-path",fullpath,
+ "proxy-uri",g_getenv("http_proxy"),
+ NULL);
+ g_free(cachedir);
vbox = gtk_vbox_new (FALSE, 2);
gtk_container_add (GTK_CONTAINER (window), vbox);
@@ -356,6 +291,6 @@ main (int argc, char **argv)
g_log_set_handler ("OsmGpsMap", G_LOG_LEVEL_MASK, g_log_default_handler, NULL);
gtk_main ();
- g_free(homedir);
+ g_free(cachedir);
return 0;
}
diff --git a/src/osm-gps-map-types.h b/src/osm-gps-map-types.h
index bc3c415..47c90df 100644
--- a/src/osm-gps-map-types.h
+++ b/src/osm-gps-map-types.h
@@ -32,6 +32,11 @@
#define MAX_ZOOM 20
#define MIN_ZOOM 0
+#define OSM_REPO_URI "http://tile.openstreetmap.org/#Z/#X/#Y.png"
+#define OSM_MIN_ZOOM 1
+#define OSM_MAX_ZOOM 18
+#define OSM_IMAGE_FORMAT "png"
+
#define URI_MARKER_X "#X"
#define URI_MARKER_Y "#Y"
#define URI_MARKER_Z "#Z"
diff --git a/src/osm-gps-map.c b/src/osm-gps-map.c
index e25a33a..2a0a5f6 100644
--- a/src/osm-gps-map.c
+++ b/src/osm-gps-map.c
@@ -83,7 +83,9 @@ struct _OsmGpsMapPrivate
//contains flags indicating the various special characters
//the uri string contains, that will be replaced when calculating
//the uri to download.
+ OsmGpsMapSource_t map_source;
char *repo_uri;
+ char *image_format;
int uri_format;
//flag indicating if the map source is located on the google
gboolean the_google;
@@ -104,7 +106,7 @@ struct _OsmGpsMapPrivate
GdkGC *gc_map;
//The tile painted when one cannot be found
- //GdkPixbuf *missing_tile;
+ GdkPixbuf *null_tile;
//For tracking click and drag
int drag_counter;
@@ -157,7 +159,9 @@ enum
PROP_TILES_QUEUED,
PROP_GPS_TRACK_WIDTH,
PROP_GPS_POINT_R1,
- PROP_GPS_POINT_R2
+ PROP_GPS_POINT_R2,
+ PROP_MAP_SOURCE,
+ PROP_IMAGE_FORMAT
};
G_DEFINE_TYPE (OsmGpsMap, osm_gps_map, GTK_TYPE_DRAWING_AREA);
@@ -421,6 +425,59 @@ my_log_handler (const gchar * log_domain, GLogLevelFlags log_level, const gchar
g_log_default_handler (log_domain, log_level, message, user_data);
}
+static float
+osm_gps_map_get_scale_at_point(int zoom, float rlat, float rlon)
+{
+ /* This is a naieve implementation with values from
+ http://wiki.openstreetmap.org/index.php/FAQ#What_is_the_map_scale_for_a_particular_zoom_level_of_the_map.3F
+ http://almien.co.uk/OSM/Tools/Scale/
+
+ The true scale, becase of the mercator projection of all supported map
+ sources, depends on the lat and lon of the point */
+ switch (zoom) {
+ case 0:
+ return 156412.0;
+ case 1:
+ return 78206.0;
+ case 2:
+ return 39135.758482;
+ case 3:
+ return 19567.879241;
+ case 4:
+ return 9783.939621;
+ case 5:
+ return 4891.969810;
+ case 6:
+ return 2445.984905;
+ case 7:
+ return 1222.992453;
+ case 8:
+ return 611.496226;
+ case 9:
+ return 305.748113;
+ case 10:
+ return 152.874057;
+ case 11:
+ return 76.437028;
+ case 12:
+ return 38.218514;
+ case 13:
+ return 19.109257;
+ case 14:
+ return 9.554629;
+ case 15:
+ return 4.777314;
+ case 16:
+ return 2.388657;
+ case 17:
+ return 1.194329;
+ case 18:
+ return 0.597164;
+ }
+
+ return 0.0;
+}
+
/* clears the trip list and all resources */
static void
osm_gps_map_free_trip (OsmGpsMap *map)
@@ -637,7 +694,7 @@ osm_gps_map_blit_tile(OsmGpsMap *map, GdkPixbuf *pixbuf, int offset_x, int offse
static void
osm_gps_map_tile_download_complete (SoupSession *session, SoupMessage *msg, gpointer user_data)
{
- int fd;
+ FILE *file;
tile_download_t *dl = (tile_download_t *)user_data;
OsmGpsMap *map = OSM_GPS_MAP(dl->map);
OsmGpsMapPrivate *priv = map->priv;
@@ -646,12 +703,12 @@ osm_gps_map_tile_download_complete (SoupSession *session, SoupMessage *msg, gpoi
{
if (g_mkdir_with_parents(dl->folder,0700) == 0)
{
- fd = open(dl->filename, O_WRONLY | O_CREAT | O_TRUNC, 0644);
- if (fd != -1)
+ file = g_fopen(dl->filename, "wb");
+ if (file != NULL)
{
- write (fd, msg->response_body->data, msg->response_body->length);
+ fwrite (msg->response_body->data, 1, msg->response_body->length, file);
g_debug("Wrote %lld bytes to %s", msg->response_body->length, dl->filename);
- close (fd);
+ fclose (file);
if (dl->redraw)
{
@@ -728,8 +785,16 @@ osm_gps_map_download_tile (OsmGpsMap *map, int zoom, int x, int y, gboolean redr
g_free(dl->uri);
g_free(dl);
} else {
- dl->folder = g_strdup_printf("%s/%d/%d/",priv->cache_dir, zoom, x);
- dl->filename = g_strdup_printf("%s/%d/%d/%d.png",priv->cache_dir, zoom, x, y);
+ dl->folder = g_strdup_printf("%s%c%d%c%d%c",
+ priv->cache_dir, G_DIR_SEPARATOR,
+ zoom, G_DIR_SEPARATOR,
+ x, G_DIR_SEPARATOR);
+ dl->filename = g_strdup_printf("%s%c%d%c%d%c%d.%s",
+ priv->cache_dir, G_DIR_SEPARATOR,
+ zoom, G_DIR_SEPARATOR,
+ x, G_DIR_SEPARATOR,
+ y,
+ priv->image_format);
dl->map = map;
dl->redraw = redraw;
@@ -771,9 +836,12 @@ osm_gps_map_load_cached_tile (OsmGpsMap *map, int zoom, int x, int y)
GdkPixbuf *pixbuf;
OsmCachedTile *tile;
- filename = g_strdup_printf("%s/%u/%u/%u.png",
- priv->cache_dir,
- zoom, x, y);
+ filename = g_strdup_printf("%s%c%d%c%d%c%d.%s",
+ priv->cache_dir, G_DIR_SEPARATOR,
+ zoom, G_DIR_SEPARATOR,
+ x, G_DIR_SEPARATOR,
+ y,
+ priv->image_format);
tile = g_hash_table_lookup (priv->tile_cache, filename);
if (tile)
@@ -865,9 +933,17 @@ osm_gps_map_load_tile (OsmGpsMap *map, int zoom, int x, int y, int offset_x, int
g_debug("Load tile %d,%d (%d,%d) z:%d", x, y, offset_x, offset_y, zoom);
- filename = g_strdup_printf("%s/%u/%u/%u.png",
- priv->cache_dir,
- zoom, x, y);
+ if (priv->map_source == OSM_GPS_MAP_SOURCE_NULL) {
+ osm_gps_map_blit_tile(map, priv->null_tile, offset_x,offset_y);
+ return;
+ }
+
+ filename = g_strdup_printf("%s%c%d%c%d%c%d.%s",
+ priv->cache_dir, G_DIR_SEPARATOR,
+ zoom, G_DIR_SEPARATOR,
+ x, G_DIR_SEPARATOR,
+ y,
+ priv->image_format);
pixbuf = gdk_pixbuf_new_from_file (filename, NULL);
if(pixbuf)
@@ -1051,9 +1127,9 @@ osm_gps_map_print_tracks (OsmGpsMap *map)
if (priv->show_trip_history)
osm_gps_map_print_track (map, priv->trip_history);
+
if (priv->tracks)
{
- g_debug("TRACK");
GSList* tmp = priv->tracks;
while (tmp != NULL)
{
@@ -1063,24 +1139,23 @@ osm_gps_map_print_tracks (OsmGpsMap *map)
}
}
+static gboolean
+osm_gps_map_purge_cache_check(gpointer key, gpointer value, gpointer user)
+{
+ return (((OsmCachedTile*)value)->redraw_cycle != ((OsmGpsMapPrivate*)user)->redraw_cycle);
+}
+
static void
osm_gps_map_purge_cache (OsmGpsMap *map)
{
- OsmGpsMapPrivate *priv = map->priv;
- GHashTableIter iter;
- OsmCachedTile *tile;
+ OsmGpsMapPrivate *priv = map->priv;
- if (g_hash_table_size (priv->tile_cache) < priv->max_tile_cache_size)
- return;
+ if (g_hash_table_size (priv->tile_cache) < priv->max_tile_cache_size)
+ return;
- /* run through the cache, and remove the tiles which have not been used
- * during the last redraw operation */
- g_hash_table_iter_init (&iter, priv->tile_cache);
- while (g_hash_table_iter_next (&iter, NULL, (gpointer)&tile))
- {
- if (tile->redraw_cycle != priv->redraw_cycle)
- g_hash_table_iter_remove (&iter);
- }
+ /* run through the cache, and remove the tiles which have not been used
+ * during the last redraw operation */
+ g_hash_table_foreach_remove(priv->tile_cache, osm_gps_map_purge_cache_check, priv);
}
static gboolean
@@ -1156,6 +1231,8 @@ osm_gps_map_init (OsmGpsMap *object)
priv->uri_format = 0;
priv->the_google = FALSE;
+ priv->map_source = -1;
+
//Change naumber of concurrent connections option?
priv->soup_session = soup_session_async_new_with_options(
SOUP_SESSION_USER_AGENT,
@@ -1188,18 +1265,45 @@ osm_gps_map_constructor (GType gtype, guint n_properties, GObjectConstructParam
{
GObject *object;
OsmGpsMapPrivate *priv;
+ OsmGpsMap *map;
+ const char *uri, *name;
//Always chain up to the parent constructor
object = G_OBJECT_CLASS(osm_gps_map_parent_class)->constructor(gtype, n_properties, properties);
+ map = OSM_GPS_MAP(object);
priv = OSM_GPS_MAP_PRIVATE(object);
+ //user can specify a map source ID, or a repo URI as the map source
+ uri = osm_gps_map_source_get_repo_uri(OSM_GPS_MAP_SOURCE_NULL);
+ if ( (priv->map_source == 0) || (strcmp(priv->repo_uri, uri) == 0) ) {
+ g_debug("Using null source");
+ priv->map_source = OSM_GPS_MAP_SOURCE_NULL;
+
+ priv->null_tile = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, 256, 256);
+ gdk_pixbuf_fill(priv->null_tile, 0xcccccc00);
+ }
+ else if (priv->map_source >= 0) {
+ //check if the source given is valid
+ uri = osm_gps_map_source_get_repo_uri(priv->map_source);
+ if (uri) {
+ g_debug("Setting map source from ID");
+ g_free(priv->repo_uri);
+
+ priv->repo_uri = g_strdup(uri);
+ priv->image_format = g_strdup(
+ osm_gps_map_source_get_image_format(priv->map_source));
+ priv->max_zoom = osm_gps_map_source_get_max_zoom(priv->map_source);
+ priv->min_zoom = osm_gps_map_source_get_min_zoom(priv->map_source);
+ }
+ }
+
if (!priv->cache_dir_is_full_path) {
char *md5 = g_compute_checksum_for_string (G_CHECKSUM_MD5, priv->repo_uri, -1);
if (priv->cache_dir) {
char *old = priv->cache_dir;
//the new cachedir is the given cache dir + the md5 of the repo_uri
- priv->cache_dir = g_strdup_printf("%s/%s", old, md5);
+ priv->cache_dir = g_strdup_printf("%s%c%s", old, G_DIR_SEPARATOR, md5);
g_debug("Adjusting cache dir %s -> %s", old, priv->cache_dir);
g_free(old);
} else {
@@ -1210,6 +1314,8 @@ osm_gps_map_constructor (GType gtype, guint n_properties, GObjectConstructParam
g_free(md5);
}
+ inspect_map_uri(map);
+
return object;
}
@@ -1236,6 +1342,9 @@ osm_gps_map_dispose (GObject *object)
if(priv->pixmap)
g_object_unref (priv->pixmap);
+ if (priv->null_tile)
+ g_object_unref (priv->null_tile);
+
if(priv->gc_map)
g_object_unref(priv->gc_map);
@@ -1253,6 +1362,7 @@ osm_gps_map_finalize (GObject *object)
g_free(priv->cache_dir);
g_free(priv->repo_uri);
+ g_free(priv->image_format);
osm_gps_map_free_trip(map);
osm_gps_map_free_tracks(map);
@@ -1283,7 +1393,6 @@ osm_gps_map_set_property (GObject *object, guint prop_id, const GValue *value, G
break;
case PROP_REPO_URI:
priv->repo_uri = g_value_dup_string (value);
- inspect_map_uri(map);
break;
case PROP_PROXY_URI:
if ( g_value_get_string(value) ) {
@@ -1302,7 +1411,14 @@ osm_gps_map_set_property (GObject *object, guint prop_id, const GValue *value, G
break;
case PROP_TILE_CACHE_DIR:
- priv->cache_dir = g_value_dup_string (value);
+ if ( g_value_get_string(value) )
+ priv->cache_dir = g_value_dup_string (value);
+ else {
+ priv->cache_dir = g_build_filename(
+ g_get_tmp_dir(),
+ "osmgpsmap",
+ NULL);
+ }
break;
case PROP_TILE_CACHE_DIR_IS_FULL_PATH:
priv->cache_dir_is_full_path = g_value_get_boolean (value);
@@ -1333,6 +1449,12 @@ osm_gps_map_set_property (GObject *object, guint prop_id, const GValue *value, G
case PROP_GPS_POINT_R2:
priv->ui_gps_point_outer_radius = g_value_get_int (value);
break;
+ case PROP_MAP_SOURCE:
+ priv->map_source = g_value_get_int (value);
+ break;
+ case PROP_IMAGE_FORMAT:
+ priv->image_format = g_value_dup_string (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -1410,6 +1532,12 @@ osm_gps_map_get_property (GObject *object, guint prop_id, GValue *value, GParamS
case PROP_GPS_POINT_R2:
g_value_set_int(value, priv->ui_gps_point_outer_radius);
break;
+ case PROP_MAP_SOURCE:
+ g_value_set_int(value, priv->map_source);
+ break;
+ case PROP_IMAGE_FORMAT:
+ g_value_set_string(value, priv->image_format);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -1417,7 +1545,7 @@ osm_gps_map_get_property (GObject *object, guint prop_id, GValue *value, GParamS
}
static gboolean
-_osm_gps_map_scroll (GtkWidget *widget, GdkEventScroll *event)
+osm_gps_map_scroll_event (GtkWidget *widget, GdkEventScroll *event)
{
OsmGpsMap *map = OSM_GPS_MAP(widget);
OsmGpsMapPrivate *priv = map->priv;
@@ -1623,7 +1751,7 @@ osm_gps_map_class_init (OsmGpsMapClass *klass)
widget_class->button_press_event = osm_gps_map_button_press;
widget_class->button_release_event = osm_gps_map_button_release;
widget_class->motion_notify_event = osm_gps_map_motion_notify;
- widget_class->scroll_event = _osm_gps_map_scroll;
+ widget_class->scroll_event = osm_gps_map_scroll_event;
g_object_class_install_property (object_class,
PROP_AUTO_CENTER,
@@ -1661,11 +1789,11 @@ osm_gps_map_class_init (OsmGpsMapClass *klass)
PROP_REPO_URI,
g_param_spec_string ("repo-uri",
"repo uri",
- "osm repo uri",
- "http://tile.openstreetmap.org/#Z/#X/#Y.png",
+ "map source tile repository uri",
+ OSM_REPO_URI,
G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
- g_object_class_install_property (object_class,
+ g_object_class_install_property (object_class,
PROP_PROXY_URI,
g_param_spec_string ("proxy-uri",
"proxy uri",
@@ -1678,7 +1806,7 @@ osm_gps_map_class_init (OsmGpsMapClass *klass)
g_param_spec_string ("tile-cache",
"tile cache",
"osm local tile cache dir",
- "/tmp/Maps",
+ NULL,
G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class,
@@ -1706,7 +1834,7 @@ osm_gps_map_class_init (OsmGpsMapClass *klass)
"maximum zoom level",
MIN_ZOOM, /* minimum property value */
MAX_ZOOM, /* maximum property value */
- 17,
+ OSM_MAX_ZOOM,
G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class,
@@ -1716,7 +1844,7 @@ osm_gps_map_class_init (OsmGpsMapClass *klass)
"minimum zoom level",
MIN_ZOOM, /* minimum property value */
MAX_ZOOM, /* maximum property value */
- 1,
+ OSM_MIN_ZOOM,
G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class,
@@ -1799,6 +1927,172 @@ osm_gps_map_class_init (OsmGpsMapClass *klass)
20,
G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT));
+ g_object_class_install_property (object_class,
+ PROP_MAP_SOURCE,
+ g_param_spec_int ("map-source",
+ "map source",
+ "map source ID",
+ -1, /* minimum property value */
+ G_MAXINT, /* maximum property value */
+ -1,
+ G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
+
+ g_object_class_install_property (object_class,
+ PROP_IMAGE_FORMAT,
+ g_param_spec_string ("image-format",
+ "image format",
+ "map source tile repository image format (jpg, png)",
+ OSM_IMAGE_FORMAT,
+ G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
+}
+
+const char*
+osm_gps_map_source_get_friendly_name(OsmGpsMapSource_t source)
+{
+ switch(source)
+ {
+ case OSM_GPS_MAP_SOURCE_NULL:
+ return "None";
+ case OSM_GPS_MAP_SOURCE_OPENSTREETMAP:
+ return "OpenStreetMap";
+ case OSM_GPS_MAP_SOURCE_OPENSTREETMAP_RENDERER:
+ return "OpenStreetMap Renderer";
+ case OSM_GPS_MAP_SOURCE_OPENAERIALMAP:
+ return "OpenAerialMap";
+ case OSM_GPS_MAP_SOURCE_MAPS_FOR_FREE:
+ return "Maps-For-Free";
+ case OSM_GPS_MAP_SOURCE_GOOGLE_STREET:
+ return "Google Maps";
+ case OSM_GPS_MAP_SOURCE_GOOGLE_SATELLITE:
+ return "Google Satellite";
+ case OSM_GPS_MAP_SOURCE_GOOGLE_HYBRID:
+ return "Google Hybrid";
+ case OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_STREET:
+ return "Virtual Earth";
+ case OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_SATELLITE:
+ return "Virtual Earth Satellite";
+ case OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_HYBRID:
+ return "Virtual Earth Hybrid";
+ case OSM_GPS_MAP_SOURCE_YAHOO_STREET:
+ return "Yahoo Maps";
+ case OSM_GPS_MAP_SOURCE_YAHOO_SATELLITE:
+ return "Yahoo Satellite";
+ case OSM_GPS_MAP_SOURCE_YAHOO_HYBRID:
+ return "Yahoo Hybrid";
+ default:
+ return NULL;
+ }
+ return NULL;
+}
+
+//http://www.internettablettalk.com/forums/showthread.php?t=5209
+//https://garage.maemo.org/plugins/scmsvn/viewcvs.php/trunk/src/maps.c?root=maemo-mapper&view=markup
+//http://www.ponies.me.uk/maps/GoogleTileUtils.java
+//http://www.mgmaps.com/cache/MapTileCacher.perl
+const char*
+osm_gps_map_source_get_repo_uri(OsmGpsMapSource_t source)
+{
+ switch(source)
+ {
+ case OSM_GPS_MAP_SOURCE_NULL:
+ return "none://";
+ case OSM_GPS_MAP_SOURCE_OPENSTREETMAP:
+ return OSM_REPO_URI;
+ case OSM_GPS_MAP_SOURCE_OPENAERIALMAP:
+ /* OpenAerialMap is down, offline till furthur notice
+ http://openaerialmap.org/pipermail/talk_openaerialmap.org/2008-December/000055.html */
+ case OSM_GPS_MAP_SOURCE_OPENSTREETMAP_RENDERER:
+ return "http://tah.openstreetmap.org/Tiles/tile/#Z/#X/#Y.png";
+ case OSM_GPS_MAP_SOURCE_MAPS_FOR_FREE:
+ return "http://maps-for-free.com/layer/relief/z#Z/row#Y/#Z_#X-#Y.jpg";
+ case OSM_GPS_MAP_SOURCE_GOOGLE_STREET:
+ return "http://mt#R.google.com/vt/v=w2.97&x=#X&y=#Y&z=#Z";
+ case OSM_GPS_MAP_SOURCE_GOOGLE_HYBRID:
+ /* No longer working "http://mt#R.google.com/mt?n=404&v=w2t.99&x=#X&y=#Y&zoom=#S" */
+ case OSM_GPS_MAP_SOURCE_GOOGLE_SATELLITE:
+ return "http://khm#R.google.com/kh/v=51&x=#X&y=#Y&z=#Z";
+ case OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_STREET:
+ return "http://a#R.ortho.tiles.virtualearth.net/tiles/r#W.jpeg?g=50";
+ case OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_SATELLITE:
+ return "http://a#R.ortho.tiles.virtualearth.net/tiles/a#W.jpeg?g=50";
+ case OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_HYBRID:
+ return "http://a#R.ortho.tiles.virtualearth.net/tiles/h#W.jpeg?g=50";
+ case OSM_GPS_MAP_SOURCE_YAHOO_STREET:
+ case OSM_GPS_MAP_SOURCE_YAHOO_SATELLITE:
+ case OSM_GPS_MAP_SOURCE_YAHOO_HYBRID:
+ /* TODO: Implement signed Y, aka U
+ * http://us.maps3.yimg.com/aerial.maps.yimg.com/ximg?v=1.7&t=a&s=256&x=%d&y=%-d&z=%d
+ * x = tilex,
+ * y = (1 << (MAX_ZOOM - zoom)) - tiley - 1,
+ * z = zoom - (MAX_ZOOM - 17));
+ */
+ return NULL;
+ default:
+ return NULL;
+ }
+ return NULL;
+}
+
+const char *
+osm_gps_map_source_get_image_format(OsmGpsMapSource_t source)
+{
+ switch(source) {
+ case OSM_GPS_MAP_SOURCE_NULL:
+ case OSM_GPS_MAP_SOURCE_OPENSTREETMAP:
+ case OSM_GPS_MAP_SOURCE_OPENSTREETMAP_RENDERER:
+ return "png";
+ case OSM_GPS_MAP_SOURCE_OPENAERIALMAP:
+ case OSM_GPS_MAP_SOURCE_GOOGLE_STREET:
+ case OSM_GPS_MAP_SOURCE_GOOGLE_HYBRID:
+ case OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_STREET:
+ case OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_SATELLITE:
+ case OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_HYBRID:
+ case OSM_GPS_MAP_SOURCE_YAHOO_STREET:
+ case OSM_GPS_MAP_SOURCE_YAHOO_SATELLITE:
+ case OSM_GPS_MAP_SOURCE_YAHOO_HYBRID:
+ case OSM_GPS_MAP_SOURCE_MAPS_FOR_FREE:
+ case OSM_GPS_MAP_SOURCE_GOOGLE_SATELLITE:
+ return "jpg";
+ default:
+ return "bin";
+ }
+ return "bin";
+}
+
+
+int
+osm_gps_map_source_get_min_zoom(OsmGpsMapSource_t source)
+{
+ return 1;
+}
+
+int
+osm_gps_map_source_get_max_zoom(OsmGpsMapSource_t source)
+{
+ switch(source) {
+ case OSM_GPS_MAP_SOURCE_NULL:
+ return 18;
+ case OSM_GPS_MAP_SOURCE_OPENSTREETMAP:
+ return OSM_MAX_ZOOM;
+ case OSM_GPS_MAP_SOURCE_OPENSTREETMAP_RENDERER:
+ case OSM_GPS_MAP_SOURCE_OPENAERIALMAP:
+ case OSM_GPS_MAP_SOURCE_GOOGLE_STREET:
+ case OSM_GPS_MAP_SOURCE_GOOGLE_HYBRID:
+ case OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_STREET:
+ case OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_SATELLITE:
+ case OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_HYBRID:
+ case OSM_GPS_MAP_SOURCE_YAHOO_STREET:
+ case OSM_GPS_MAP_SOURCE_YAHOO_SATELLITE:
+ case OSM_GPS_MAP_SOURCE_YAHOO_HYBRID:
+ return 17;
+ case OSM_GPS_MAP_SOURCE_MAPS_FOR_FREE:
+ return 11;
+ case OSM_GPS_MAP_SOURCE_GOOGLE_SATELLITE:
+ return 18;
+ default:
+ return 17;
+ }
+ return 17;
}
void
@@ -1831,7 +2125,12 @@ osm_gps_map_download_maps (OsmGpsMap *map, coord_t *pt1, coord_t *pt2, int zoom_
for(j=y1; j<=y2; j++)
{
// x = i, y = j
- filename = g_strdup_printf("%s/%u/%u/%u.png", priv->cache_dir, zoom, i, j);
+ filename = g_strdup_printf("%s%c%d%c%d%c%d.%s",
+ priv->cache_dir, G_DIR_SEPARATOR,
+ zoom, G_DIR_SEPARATOR,
+ i, G_DIR_SEPARATOR,
+ j,
+ priv->image_format);
if (!g_file_test(filename, G_FILE_TEST_EXISTS))
{
osm_gps_map_download_tile(map, zoom, i, j, FALSE);
@@ -1965,7 +2264,7 @@ osm_gps_map_add_image (OsmGpsMap *map, float latitude, float longitude, GdkPixbu
//cache w/h for speed, and add image to list
im = g_new0(image_t,1);
im->w = gdk_pixbuf_get_width(image);
- im->h = gdk_pixbuf_get_width(image);
+ im->h = gdk_pixbuf_get_height(image);
im->pt.rlat = deg2rad(latitude);
im->pt.rlon = deg2rad(longitude);
@@ -1978,6 +2277,28 @@ osm_gps_map_add_image (OsmGpsMap *map, float latitude, float longitude, GdkPixbu
}
}
+gboolean
+osm_gps_map_remove_image (OsmGpsMap *map, GdkPixbuf *image)
+{
+ OsmGpsMapPrivate *priv = map->priv;
+ if (priv->images) {
+ GSList *list;
+ for(list = priv->images; list != NULL; list = list->next)
+ {
+ image_t *im = list->data;
+ if (im->image == image)
+ {
+ priv->images = g_slist_remove_link(priv->images, list);
+ g_object_unref(im->image);
+ g_free(im);
+ osm_gps_map_map_redraw_idle(map);
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
void
osm_gps_map_clear_images (OsmGpsMap *map)
{
@@ -2169,3 +2490,22 @@ osm_gps_map_scroll (OsmGpsMap *map, gint dx, gint dy)
osm_gps_map_map_redraw_idle (map);
}
+float
+osm_gps_map_get_scale(OsmGpsMap *map)
+{
+ OsmGpsMapPrivate *priv;
+
+ g_return_if_fail (OSM_IS_GPS_MAP (map));
+ priv = map->priv;
+
+ return osm_gps_map_get_scale_at_point(priv->map_zoom, priv->center_rlat, priv->center_rlon);
+}
+
+char * osm_gps_map_get_default_cache_directory(void)
+{
+ return g_build_filename(
+ g_get_user_cache_dir(),
+ "osmgpsmap",
+ NULL);
+}
+
diff --git a/src/osm-gps-map.h b/src/osm-gps-map.h
index 1069976..01a4618 100644
--- a/src/osm-gps-map.h
+++ b/src/osm-gps-map.h
@@ -59,23 +59,33 @@ typedef struct {
float rlon;
} coord_t;
-//http://www.internettablettalk.com/forums/showthread.php?t=5209
-//https://garage.maemo.org/plugins/scmsvn/viewcvs.php/trunk/src/maps.c
-//http://www.ponies.me.uk/maps/GoogleTileUtils.java
-//http://www.mgmaps.com/cache/MapTileCacher.perl
-#define MAP_SOURCE_OPENSTREETMAP "http://tile.openstreetmap.org/#Z/#X/#Y.png"
-#define MAP_SOURCE_OPENSTREETMAP_RENDERER "http://tah.openstreetmap.org/Tiles/tile/#Z/#X/#Y.png"
-#define MAP_SOURCE_OPENAERIALMAP "http://tile.openaerialmap.org/tiles/1.0.0/openaerialmap-900913/#Z/#X/#Y.jpg"
-#define MAP_SOURCE_GOOGLE_MAPS "http://mt#R.google.com/mt?x=#X&y=#Y&zoom=#S"
-//No longer working
-//#define MAP_SOURCE_GOOGLE_HYBRID "http://mt#R.google.com/mt?n=404&v=w2t.99&x=#X&y=#Y&zoom=#S"
-#define MAP_SOURCE_GOOGLE_HYBRID "http://mt#R.google.com/mt?x=#X&y=#Y&zoom=#S"
-#define MAP_SOURCE_GOOGLE_SATTELITE "http://khm#R.google.com/kh?n=404&v=32&x=#X&y=#Y&z=#Z"
-#define MAP_SOURCE_GOOGLE_SATTELITE_QUAD "http://khm#R.google.com/kh?n=404&v=3&t=#Q"
-#define MAP_SOURCE_MAPS_FOR_FREE "http://maps-for-free.com/layer/relief/z#Z/row#Y/#Z_#X-#Y.jpg"
-#define MAP_SOURCE_VIRTUAL_EARTH_SATTELITE "http://a#R.ortho.tiles.virtualearth.net/tiles/a#W.jpeg?g=50"
+typedef enum {
+ OSM_GPS_MAP_SOURCE_NULL,
+ OSM_GPS_MAP_SOURCE_OPENSTREETMAP,
+ OSM_GPS_MAP_SOURCE_OPENSTREETMAP_RENDERER,
+ OSM_GPS_MAP_SOURCE_OPENAERIALMAP,
+ OSM_GPS_MAP_SOURCE_MAPS_FOR_FREE,
+ OSM_GPS_MAP_SOURCE_GOOGLE_STREET,
+ OSM_GPS_MAP_SOURCE_GOOGLE_SATELLITE,
+ OSM_GPS_MAP_SOURCE_GOOGLE_HYBRID,
+ OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_STREET,
+ OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_SATELLITE,
+ OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_HYBRID,
+ OSM_GPS_MAP_SOURCE_YAHOO_STREET,
+ OSM_GPS_MAP_SOURCE_YAHOO_SATELLITE,
+ OSM_GPS_MAP_SOURCE_YAHOO_HYBRID
+} OsmGpsMapSource_t;
GType osm_gps_map_get_type (void) G_GNUC_CONST;
+
+const char* osm_gps_map_source_get_friendly_name(OsmGpsMapSource_t source);
+const char* osm_gps_map_source_get_repo_uri(OsmGpsMapSource_t source);
+const char *osm_gps_map_source_get_image_format(OsmGpsMapSource_t source);
+int osm_gps_map_source_get_min_zoom(OsmGpsMapSource_t source);
+int osm_gps_map_source_get_max_zoom(OsmGpsMapSource_t source);
+
+char * osm_gps_map_get_default_cache_directory(void);
+
void osm_gps_map_download_maps (OsmGpsMap *map, coord_t *pt1, coord_t *pt2, int zoom_start, int zoom_end);
void osm_gps_map_get_bbox (OsmGpsMap *map, coord_t *pt1, coord_t *pt2);
void osm_gps_map_set_mapcenter (OsmGpsMap *map, float latitude, float longitude, int zoom);
@@ -84,6 +94,7 @@ int osm_gps_map_set_zoom (OsmGpsMap *map, int zoom);
void osm_gps_map_add_track (OsmGpsMap *map, GSList *track);
void osm_gps_map_clear_tracks (OsmGpsMap *map);
void osm_gps_map_add_image (OsmGpsMap *map, float latitude, float longitude, GdkPixbuf *image);
+gboolean osm_gps_map_remove_image (OsmGpsMap *map, GdkPixbuf *image);
void osm_gps_map_clear_images (OsmGpsMap *map);
void osm_gps_map_osd_speed (OsmGpsMap *map, float speed);
void osm_gps_map_draw_gps (OsmGpsMap *map, float latitude, float longitude, float heading);
@@ -97,6 +108,7 @@ void osm_gps_map_geographic_to_screen (OsmGpsMap *map,
gfloat latitude, gfloat longitude,
gint *pixel_x, gint *pixel_y);
void osm_gps_map_scroll (OsmGpsMap *map, gint dx, gint dy);
+float osm_gps_map_get_scale(OsmGpsMap *map);
G_END_DECLS
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/osm-gps-map.git
More information about the Pkg-grass-devel
mailing list