From 074c87382642f4f7f8e10e3505bfa0871dc4f994 Mon Sep 17 00:00:00 2001 From: Petr Sloup Date: Fri, 11 Mar 2016 12:10:22 +0100 Subject: [PATCH] Support optional bearing and pitch in center-based static requests --- src/serve_raster.js | 21 ++++++++++++++------- test/static.js | 9 +++++++++ 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/serve_raster.js b/src/serve_raster.js index 2056e79..a32fcb4 100644 --- a/src/serve_raster.js +++ b/src/serve_raster.js @@ -182,7 +182,8 @@ module.exports = function(options, repo, params, id) { var tilePattern = '/raster/' + id + '/:z(\\d+)/:x(\\d+)/:y(\\d+)' + ':scale(' + SCALE_PATTERN + ')?\.:format([\\w]+)'; - var respondImage = function(z, lon, lat, width, height, scale, format, res, next) { + var respondImage = function(z, lon, lat, bearing, pitch, + width, height, scale, format, res, next) { if (Math.abs(lon) > 180 || Math.abs(lat) > 85.06) { return res.status(400).send('Invalid center'); } @@ -203,6 +204,8 @@ module.exports = function(options, repo, params, id) { var params = { zoom: mbglZ, center: [lon, lat], + bearing: bearing, + pitch: pitch, width: width, height: height }; @@ -260,26 +263,30 @@ module.exports = function(options, repo, params, id) { ((x + 0.5) / (1 << z)) * (256 << z), ((y + 0.5) / (1 << z)) * (256 << z) ], z); - return respondImage(z, tileCenter[0], tileCenter[1], tileSize, tileSize, - scale, format, res, next); + return respondImage(z, tileCenter[0], tileCenter[1], 0, 0, + tileSize, tileSize, scale, format, res, next); }); var staticPattern = '/static/' + id + '/%s:scale(' + SCALE_PATTERN + ')?\.:format([\\w]+)'; var centerPattern = - util.format(':lon(%s),:lat(%s),:z(\\d+)/:width(\\d+)x:height(\\d+)', - FLOAT_PATTERN, FLOAT_PATTERN); + util.format(':lon(%s),:lat(%s),:z(\\d+):bearing(,%s)?:pitch(,%s)?/' + + ':width(\\d+)x:height(\\d+)', + FLOAT_PATTERN, FLOAT_PATTERN, FLOAT_PATTERN, FLOAT_PATTERN); app.get(util.format(staticPattern, centerPattern), function(req, res, next) { var z = req.params.z | 0, x = +req.params.lon, y = +req.params.lat, + bearing = +(req.params.bearing || ',0').substring(1), + pitch = +(req.params.pitch || ',0').substring(1), w = req.params.width | 0, h = req.params.height | 0, scale = getScale(req.params.scale), format = req.params.format; - return respondImage(z, x, y, w, h, scale, format, res, next); + return respondImage(z, x, y, bearing, pitch, + w, h, scale, format, res, next); }); var boundsPattern = @@ -298,7 +305,7 @@ module.exports = function(options, repo, params, id) { h = (maxCorner[1] - minCorner[1]) | 0, scale = getScale(req.params.scale), format = req.params.format; - return respondImage(z, x, y, w, h, scale, format, res, next); + return respondImage(z, x, y, 0, 0, w, h, scale, format, res, next); }); app.get('/raster/' + id + '.json', function(req, res, next) { diff --git a/test/static.js b/test/static.js index f04121e..c3909bd 100644 --- a/test/static.js +++ b/test/static.js @@ -26,6 +26,12 @@ describe('Static endpoints', function() { testStatic('test', '80,40,20/600x300', 'png', 200, 3); testStatic('test', '8.5,40.5,20/300x150', 'png', 200, 3); testStatic('test', '-8.5,-40.5,20/300x150', 'png', 200, 3); + + testStatic('test', '8,40,2,0,0/300x150', 'png', 200); + testStatic('test', '8,40,2,180,45/300x150', 'png', 200, 2); + testStatic('test', '8,40,2,10/300x150', 'png', 200, 3); + testStatic('test', '8,40,2,10.3,20.4/300x300', 'png', 200); + testStatic('test', '0,0,2,390,120/300x300', 'png', 200); }); }); @@ -39,6 +45,9 @@ describe('Static endpoints', function() { testStatic('test', '0,0,-1/256x256', 'png', 404); testStatic('test', '0,0,1.5/256x256', 'png', 404); testStatic('test', '0,0,0/256.5x256.5', 'png', 404); + + testStatic('test', '0,0,0,/256x256', 'png', 404); + testStatic('test', '0,0,0,0,/256x256', 'png', 404); }); });