diff --git a/docs/config.rst b/docs/config.rst index aedbd70..3ca6768 100644 --- a/docs/config.rst +++ b/docs/config.rst @@ -25,6 +25,7 @@ Example:: "pngQuantization": false, "png": 90 }, + "maxScaleFactor": 3, "maxSize": 2048, "pbfAlias": "pbf", "serveAllFonts": false, @@ -76,10 +77,19 @@ Quality of the compression of individual image formats. [0-100] The value for ``png`` is only used when ``pngQuantization`` is ``true``. +``maxScaleFactor`` +----------- + +Maximum scale factor to allow in raster tile and static maps requests (e.g. ``@3x`` suffix). +Also see ``maxSize`` below. +Default value is ``3``, maximum ``9``. + ``maxSize`` ----------- -Maximum image side length to be allowed to be rendered (including scale factor). Default is ``2048``. +Maximum image side length to be allowed to be rendered (including scale factor). +Be careful when changing this value since there are hardware limits that need to be considered. +Default is ``2048``. ``styles`` ========== diff --git a/src/serve_rendered.js b/src/serve_rendered.js index b12f7f4..23d4c5d 100644 --- a/src/serve_rendered.js +++ b/src/serve_rendered.js @@ -24,7 +24,6 @@ var Canvas = require('canvas'), var utils = require('./utils'); var FLOAT_PATTERN = '[+-]?(?:\\d+|\\d+\.?\\d+)'; -var SCALE_PATTERN = '@[234]x'; var getScale = function(scale) { return (scale || '@1x').slice(1, 2) | 0; @@ -39,6 +38,13 @@ mbgl.on('message', function(e) { module.exports = function(options, repo, params, id, dataResolver) { var app = express().disable('x-powered-by'); + var maxScaleFactor = Math.min(Math.floor(options.maxScaleFactor || 3), 9); + var scalePattern = ''; + for (var i = 2; i <= maxScaleFactor; i++) { + scalePattern += i.toFixed(); + } + scalePattern = '@[' + scalePattern + ']x'; + var lastModified = new Date().toUTCString(); var rootPath = options.paths.root; @@ -267,16 +273,24 @@ module.exports = function(options, repo, params, id, dataResolver) { async.parallel(queue, function(err, results) { // TODO: make pool sizes configurable - map.renderers[1] = createPool(1, 4, 16); - map.renderers[2] = createPool(2, 2, 8); - map.renderers[3] = createPool(3, 2, 4); - map.renderers[4] = createPool(4, 2, 4); + for (var s = 1; s <= maxScaleFactor; s++) { + var minPoolSize = 2; + + // standard and @2x tiles are much more usual -> create larger pools + if (s <= 2) { + minPoolSize *= 2; + if (s <= 1) { + minPoolSize *= 2; + } + } + map.renderers[s] = createPool(s, minPoolSize, 2 * minPoolSize); + } }); repo[id] = tileJSON; var tilePattern = '/rendered/:z(\\d+)/:x(\\d+)/:y(\\d+)' + - ':scale(' + SCALE_PATTERN + ')?\.:format([\\w]+)'; + ':scale(' + scalePattern + ')?\.:format([\\w]+)'; var respondImage = function(z, lon, lat, bearing, pitch, width, height, scale, format, res, next, @@ -477,7 +491,7 @@ module.exports = function(options, repo, params, id, dataResolver) { if (options.serveStaticMaps !== false) { var staticPattern = '/static/:raw(raw)?/%s/:width(\\d+)x:height(\\d+)' + - ':scale(' + SCALE_PATTERN + ')?\.:format([\\w]+)'; + ':scale(' + scalePattern + ')?\.:format([\\w]+)'; var centerPattern = util.format(':x(%s),:y(%s),:z(%s)(@:bearing(%s)(,:pitch(%s))?)?', diff --git a/test/tiles_rendered.js b/test/tiles_rendered.js index a44e936..20b9404 100644 --- a/test/tiles_rendered.js +++ b/test/tiles_rendered.js @@ -26,7 +26,6 @@ describe('Raster tiles', function() { testTile(prefix, 0, 0, 0, 'png', 200, 2); testTile(prefix, 0, 0, 0, 'png', 200, 3); testTile(prefix, 2, 1, 1, 'png', 200, 3); - testTile(prefix, 0, 0, 0, 'png', 200, 4); }); });