/** * @module ol/source/Stamen */ import {inherits} from '../index.js'; import {ATTRIBUTION as OSM_ATTRIBUTION} from '../source/OSM.js'; import XYZ from '../source/XYZ.js'; /** * @const * @type {Array.} */ const ATTRIBUTIONS = [ 'Map tiles by Stamen Design, ' + 'under CC BY' + ' 3.0.', OSM_ATTRIBUTION ]; /** * @type {Object.} */ const LayerConfig = { 'terrain': { extension: 'jpg', opaque: true }, 'terrain-background': { extension: 'jpg', opaque: true }, 'terrain-labels': { extension: 'png', opaque: false }, 'terrain-lines': { extension: 'png', opaque: false }, 'toner-background': { extension: 'png', opaque: true }, 'toner': { extension: 'png', opaque: true }, 'toner-hybrid': { extension: 'png', opaque: false }, 'toner-labels': { extension: 'png', opaque: false }, 'toner-lines': { extension: 'png', opaque: false }, 'toner-lite': { extension: 'png', opaque: true }, 'watercolor': { extension: 'jpg', opaque: true } }; /** * @type {Object.} */ const ProviderConfig = { 'terrain': { minZoom: 4, maxZoom: 18 }, 'toner': { minZoom: 0, maxZoom: 20 }, 'watercolor': { minZoom: 1, maxZoom: 16 } }; /** * @typedef {Object} Options * @property {number} [cacheSize=2048] Cache size. * @property {string} [layer] Layer. * @property {number} [minZoom] Minimum zoom. * @property {number} [maxZoom] Maximum zoom. * @property {boolean} [opaque] Whether the layer is opaque. * @property {boolean} [reprojectionErrorThreshold=0.5] Maximum allowed reprojection error (in pixels). * Higher values can increase reprojection performance, but decrease precision. * @property {module:ol/Tile~LoadFunction} [tileLoadFunction] * Optional function to load a tile given a URL. The default is * ```js * function(imageTile, src) { * imageTile.getImage().src = src; * }; * ``` * @property {string} [url] URL template. Must include `{x}`, `{y}` or `{-y}`, and `{z}` placeholders. * @property {boolean} [wrapX=true] Whether to wrap the world horizontally. */ /** * @classdesc * Layer source for the Stamen tile server. * * @constructor * @extends {module:ol/source/XYZ~XYZ} * @param {module:ol/source/Stamen~Options=} options Stamen options. * @api */ const Stamen = function(options) { const i = options.layer.indexOf('-'); const provider = i == -1 ? options.layer : options.layer.slice(0, i); const providerConfig = ProviderConfig[provider]; const layerConfig = LayerConfig[options.layer]; const url = options.url !== undefined ? options.url : 'https://stamen-tiles-{a-d}.a.ssl.fastly.net/' + options.layer + '/{z}/{x}/{y}.' + layerConfig.extension; XYZ.call(this, { attributions: ATTRIBUTIONS, cacheSize: options.cacheSize, crossOrigin: 'anonymous', maxZoom: options.maxZoom != undefined ? options.maxZoom : providerConfig.maxZoom, minZoom: options.minZoom != undefined ? options.minZoom : providerConfig.minZoom, opaque: layerConfig.opaque, reprojectionErrorThreshold: options.reprojectionErrorThreshold, tileLoadFunction: options.tileLoadFunction, url: url, wrapX: options.wrapX }); }; inherits(Stamen, XYZ); export default Stamen;