diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2016-08-02 14:47:08 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2016-08-02 14:47:08 +0200 |
commit | d5312427df0030cdc02387ee06f1c6fb835c4de3 (patch) | |
tree | 7caf645368c376345ca6ddac3d6fd2ebe6da686a | |
parent | c2ce4dd7f38478681f9b9aef2f8119dadb5f45f5 (diff) | |
download | Chimère-d5312427df0030cdc02387ee06f1c6fb835c4de3.tar.bz2 Chimère-d5312427df0030cdc02387ee06f1c6fb835c4de3.zip |
Add tile.stamen.js to repository (https issue: only available from http)
-rw-r--r-- | chimere/static/leaflet/tile.stamen.js | 293 |
1 files changed, 293 insertions, 0 deletions
diff --git a/chimere/static/leaflet/tile.stamen.js b/chimere/static/leaflet/tile.stamen.js new file mode 100644 index 0000000..98c8209 --- /dev/null +++ b/chimere/static/leaflet/tile.stamen.js @@ -0,0 +1,293 @@ +(function(exports) { + +/* + * tile.stamen.js v1.3.0 + */ + +var SUBDOMAINS = "a. b. c. d.".split(" "), + MAKE_PROVIDER = function(layer, type, minZoom, maxZoom) { + return { + "url": ["http://{S}tile.stamen.com/", layer, "/{Z}/{X}/{Y}.", type].join(""), + "type": type, + "subdomains": SUBDOMAINS.slice(), + "minZoom": minZoom, + "maxZoom": maxZoom, + "attribution": [ + 'Map tiles by <a href="http://stamen.com/">Stamen Design</a>, ', + 'under <a href="http://creativecommons.org/licenses/by/3.0">CC BY 3.0</a>. ', + 'Data by <a href="http://openstreetmap.org/">OpenStreetMap</a>, ', + 'under <a href="http://creativecommons.org/licenses/by-sa/3.0">CC BY SA</a>.' + ].join("") + }; + }, + PROVIDERS = { + "toner": MAKE_PROVIDER("toner", "png", 0, 20), + "terrain": MAKE_PROVIDER("terrain", "png", 0, 18), + "terrain-classic": MAKE_PROVIDER("terrain-classic", "png", 0, 18), + "watercolor": MAKE_PROVIDER("watercolor", "jpg", 1, 18), + "trees-cabs-crime": { + "url": "http://{S}.tiles.mapbox.com/v3/stamen.trees-cabs-crime/{Z}/{X}/{Y}.png", + "type": "png", + "subdomains": "a b c d".split(" "), + "minZoom": 11, + "maxZoom": 18, + "extent": [ + {"lat": 37.853, "lon": -122.577}, + {"lat": 37.684, "lon": -122.313} + ], + "attribution": [ + 'Design by Shawn Allen at <a href="http://stamen.com/">Stamen</a>.', + 'Data courtesy of <a href="http://fuf.net/">FuF</a>,', + '<a href="http://www.yellowcabsf.com/">Yellow Cab</a>', + '& <a href="http://sf-police.org/">SFPD</a>.' + ].join(" ") + } + }; + +PROVIDERS["terrain-classic"].url = "http://{S}tile.stamen.com/terrain/{Z}/{X}/{Y}.png"; + +// set up toner and terrain flavors +setupFlavors("toner", ["hybrid", "labels", "lines", "background", "lite"]); +setupFlavors("terrain", ["background", "labels", "lines"]); + +// toner 2010 +deprecate("toner", ["2010"]); + +// toner 2011 flavors +deprecate("toner", ["2011", "2011-lines", "2011-labels", "2011-lite"]); + +var odbl = [ + "toner", + "toner-hybrid", + "toner-labels", + "toner-lines", + "toner-background", + "toner-lite", + "terrain", + "terrain-background", + "terrain-lines", + "terrain-labels", + "terrain-classic" +]; + +for (var i = 0; i < odbl.length; i++) { + var key = odbl[i]; + + PROVIDERS[key].retina = true; + PROVIDERS[key].attribution = [ + 'Map tiles by <a href="http://stamen.com/">Stamen Design</a>, ', + 'under <a href="http://creativecommons.org/licenses/by/3.0">CC BY 3.0</a>. ', + 'Data by <a href="http://openstreetmap.org">OpenStreetMap</a>, ', + 'under <a href="http://www.openstreetmap.org/copyright">ODbL</a>.' + ].join(""); +} + +/* + * Export stamen.tile to the provided namespace. + */ +exports.stamen = exports.stamen || {}; +exports.stamen.tile = exports.stamen.tile || {}; +exports.stamen.tile.providers = PROVIDERS; +exports.stamen.tile.getProvider = getProvider; + +function deprecate(base, flavors) { + var provider = getProvider(base); + + for (var i = 0; i < flavors.length; i++) { + var flavor = [base, flavors[i]].join("-"); + PROVIDERS[flavor] = MAKE_PROVIDER(flavor, provider.type, provider.minZoom, provider.maxZoom); + PROVIDERS[flavor].deprecated = true; + } +}; + +/* + * A shortcut for specifying "flavors" of a style, which are assumed to have the + * same type and zoom range. + */ +function setupFlavors(base, flavors, type) { + var provider = getProvider(base); + for (var i = 0; i < flavors.length; i++) { + var flavor = [base, flavors[i]].join("-"); + PROVIDERS[flavor] = MAKE_PROVIDER(flavor, type || provider.type, provider.minZoom, provider.maxZoom); + } +} + +/* + * Get the named provider, or throw an exception if it doesn't exist. + */ +function getProvider(name) { + if (name in PROVIDERS) { + var provider = PROVIDERS[name]; + + if (provider.deprecated && console && console.warn) { + console.warn(name + " is a deprecated style; it will be redirected to its replacement. For performance improvements, please change your reference."); + } + + return provider; + } else { + throw 'No such provider (' + name + ')'; + } +} + +/* + * StamenTileLayer for modestmaps-js + * <https://github.com/modestmaps/modestmaps-js/> + * + * Works with both 1.x and 2.x by checking for the existence of MM.Template. + */ +if (typeof MM === "object") { + var ModestTemplate = (typeof MM.Template === "function") + ? MM.Template + : MM.TemplatedMapProvider; + MM.StamenTileLayer = function(name) { + var provider = getProvider(name); + this._provider = provider; + MM.Layer.call(this, new ModestTemplate(provider.url, provider.subdomains)); + this.provider.setZoomRange(provider.minZoom, provider.maxZoom); + this.attribution = provider.attribution; + }; + + MM.StamenTileLayer.prototype = { + setCoordLimits: function(map) { + var provider = this._provider; + if (provider.extent) { + map.coordLimits = [ + map.locationCoordinate(provider.extent[0]).zoomTo(provider.minZoom), + map.locationCoordinate(provider.extent[1]).zoomTo(provider.maxZoom) + ]; + return true; + } else { + return false; + } + } + }; + + MM.extend(MM.StamenTileLayer, MM.Layer); +} + +/* + * StamenTileLayer for Leaflet + * <http://leaflet.cloudmade.com/> + * + * Tested with version 0.3 and 0.4, but should work on all 0.x releases. + */ +if (typeof L === "object") { + L.StamenTileLayer = L.TileLayer.extend({ + initialize: function(name, options) { + var provider = getProvider(name), + url = provider.url.replace(/({[A-Z]})/g, function(s) { + return s.toLowerCase(); + }), + opts = L.Util.extend({}, options, { + "minZoom": provider.minZoom, + "maxZoom": provider.maxZoom, + "subdomains": provider.subdomains, + "scheme": "xyz", + "attribution": provider.attribution, + sa_id: name + }); + L.TileLayer.prototype.initialize.call(this, url, opts); + } + }); + + /* + * Factory function for consistency with Leaflet conventions + */ + L.stamenTileLayer = function (options, source) { + return new L.StamenTileLayer(options, source); + }; +} + +/* + * StamenTileLayer for OpenLayers + * <http://openlayers.org/> + * + * Tested with v2.1x. + */ +if (typeof OpenLayers === "object") { + // make a tile URL template OpenLayers-compatible + function openlayerize(url) { + return url.replace(/({.})/g, function(v) { + return "$" + v.toLowerCase(); + }); + } + + // based on http://www.bostongis.com/PrinterFriendly.aspx?content_name=using_custom_osm_tiles + OpenLayers.Layer.Stamen = OpenLayers.Class(OpenLayers.Layer.OSM, { + initialize: function(name, options) { + var provider = getProvider(name), + url = provider.url, + subdomains = provider.subdomains, + hosts = []; + if (url.indexOf("{S}") > -1) { + for (var i = 0; i < subdomains.length; i++) { + hosts.push(openlayerize(url.replace("{S}", subdomains[i]))); + } + } else { + hosts.push(openlayerize(url)); + } + options = OpenLayers.Util.extend({ + "numZoomLevels": provider.maxZoom, + "buffer": 0, + "transitionEffect": "resize", + // see: <http://dev.openlayers.org/apidocs/files/OpenLayers/Layer/OSM-js.html#OpenLayers.Layer.OSM.tileOptions> + // and: <http://dev.openlayers.org/apidocs/files/OpenLayers/Tile/Image-js.html#OpenLayers.Tile.Image.crossOriginKeyword> + "tileOptions": { + "crossOriginKeyword": null + }, + "attribution": provider.attribution + }, options); + return OpenLayers.Layer.OSM.prototype.initialize.call(this, name, hosts, options); + } + }); +} + +/* + * StamenMapType for Google Maps API V3 + * <https://developers.google.com/maps/documentation/javascript/> + */ +if (typeof google === "object" && typeof google.maps === "object") { + + // Extending Google class based on a post by Bogart Salzberg of Portland Webworks, + // http://www.portlandwebworks.com/blog/extending-googlemapsmap-object + google.maps.ImageMapType = (function(_constructor){ + var f = function() { + if (!arguments.length) { + return; + } + _constructor.apply(this, arguments); + } + f.prototype = _constructor.prototype; + return f; + })(google.maps.ImageMapType); + + + google.maps.StamenMapType = function(name) { + var provider = getProvider(name), + subdomains = provider.subdomains; + return google.maps.ImageMapType.call(this, { + "getTileUrl": function(coord, zoom) { + var numTiles = 1 << zoom, + wx = coord.x % numTiles, + x = (wx < 0) ? wx + numTiles : wx, + y = coord.y, + index = (zoom + x + y) % subdomains.length; + return provider.url + .replace("{S}", subdomains[index]) + .replace("{Z}", zoom) + .replace("{X}", x) + .replace("{Y}", y); + }, + "tileSize": new google.maps.Size(256, 256), + "name": name, + "minZoom": provider.minZoom, + "maxZoom": provider.maxZoom + }); + }; + + // FIXME: is there a better way to extend classes in Google land? + // Possibly fixed, see above ^^^ | SC + google.maps.StamenMapType.prototype = new google.maps.ImageMapType; +} + +})(typeof exports === "undefined" ? this : exports); |