summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Danielsson <jonas@threetimestwo.org>2016-07-30 11:01:48 +0200
committerJonas Danielsson <jonas@threetimestwo.org>2016-07-30 15:06:59 +0200
commita5d2f9071aec577cdccde2ca5bc40720b83b513b (patch)
treedadcc9ce4825bdcb4ea335c0fdece8687bbdbe15
parent52eaab8c3cc5b880ccd850378a81bac772136a91 (diff)
downloadgnome-maps-a5d2f9071aec577cdccde2ca5bc40720b83b513b.tar.gz
Add MapSource module with Mapbox URIs
Add mapSource.js which contains functions for creating cached Champlain MapSources using Mapbox URI.
-rw-r--r--src/mapSource.js95
1 files changed, 95 insertions, 0 deletions
diff --git a/src/mapSource.js b/src/mapSource.js
new file mode 100644
index 00000000..7ab24fa8
--- /dev/null
+++ b/src/mapSource.js
@@ -0,0 +1,95 @@
+/* -*- Mode: JS2; indent-tabs-mode: nil; js2-basic-offset: 4 -*- */
+/* vim: set et ts=4 sw=4: */
+/*
+ * GNOME Maps 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 2 of the License, or (at your
+ * option) any later version.
+ *
+ * GNOME Maps 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 GNOME Maps; if not, see <http://www.gnu.org/licenses/>.
+ *
+ * Author: Jonas Danielsson <jonas@threetimestwo.org>
+ */
+
+const Champlain = imports.gi.Champlain;
+const Lang = imports.lang;
+
+const Utils = imports.utils;
+
+/*
+ * These URIs are used by the libchamplain network tile source.
+ * The #X#, #Y#, #Z# coords will get replaced with actual tile numbers.
+ */
+const _AERIAL_URI = "https://gis.gnome.org/tiles/satellite/v1/#Z#/#X#/#Y#";
+const _STREET_URI = "https://gis.gnome.org/tiles/street/v1/#Z#/#X#/#Y#";
+
+/* unique names are needed for file caching */
+const _AERIAL_NAME = "mapbox-satellite-v1";
+const _STREET_NAME = "mapbox-street-v1";
+
+const _TILE_SIZE = 256;
+const _MIN_ZOOM = 0;
+const _MAX_ZOOM = 19;
+
+const _FILE_CACHE_SIZE_LIMIT = (10 * 1024 * 1024); /* 10Mb */
+const _MEMORY_CACHE_SIZE_LIMIT = 100; /* number of tiles */
+
+function _createTileSource(uri, name) {
+ return new Champlain.NetworkTileSource(
+ { id: name,
+ name: name,
+ license: null,
+ license_uri: null,
+ min_zoom_level: _MIN_ZOOM,
+ max_zoom_level: _MAX_ZOOM,
+ tile_size: _TILE_SIZE,
+ projection: Champlain.MapProjection.MERCATOR,
+ renderer: new Champlain.ImageRenderer(),
+ uri_format: uri
+ });
+}
+
+function _createCachedSource(uri, name) {
+ let tileSource = _createTileSource(uri, name);
+
+ let fileCache = new Champlain.FileCache({
+ size_limit: _FILE_CACHE_SIZE_LIMIT,
+ renderer: new Champlain.ImageRenderer()
+ });
+
+ let memoryCache = new Champlain.MemoryCache({
+ size_limit: _MEMORY_CACHE_SIZE_LIMIT,
+ renderer: new Champlain.ImageRenderer()
+ });
+
+ let errorSource = new Champlain.NullTileSource({
+ renderer: new Champlain.ImageRenderer()
+ });
+
+ /*
+ * When the a source in the chain fails to load a given tile
+ * the next one in the chain tries instead. Until we get to the error
+ * source.
+ */
+ let sourceChain = new Champlain.MapSourceChain();
+ sourceChain.push(errorSource);
+ sourceChain.push(tileSource);
+ sourceChain.push(fileCache);
+ sourceChain.push(memoryCache);
+
+ return sourceChain;
+}
+
+function createAerialSource() {
+ return _createCachedSource(_AERIAL_URI, _AERIAL_NAME);
+};
+
+function createStreetSource() {
+ return _createCachedSource(_STREET_URI, _STREET_NAME);
+};