From 1aaabd2dffd2ba8c3d24a2f1635eefc8bed64250 Mon Sep 17 00:00:00 2001 From: Petr Sloup Date: Tue, 6 Dec 2016 20:11:18 +0100 Subject: [PATCH] Experimental integration of first plugin --- .gitignore | 1 + package.json | 3 +++ src/serve_data.js | 46 ++++++++++++++++++++++++++++++++++++++-------- src/serve_style.js | 5 +++-- src/server.js | 2 +- src/utils.js | 9 ++++++++- 6 files changed, 54 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index ccafdd7..2009454 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,6 @@ node_modules test_data data light +plugins config.json *.mbtiles diff --git a/package.json b/package.json index fa7bcf2..8b10ae5 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,9 @@ "sphericalmercator": "1.0.5", "tileserver-gl-styles": "0.3.0" }, + "optionalDependencies": { + "tileshrink-gl": "./plugins/tileshrink-gl" + }, "devDependencies": { "should": "^10.0.0", "mocha": "^2.5.0", diff --git a/src/serve_data.js b/src/serve_data.js index 5a2d236..0fc6b17 100644 --- a/src/serve_data.js +++ b/src/serve_data.js @@ -7,9 +7,14 @@ var clone = require('clone'), express = require('express'), mbtiles = require('mbtiles'); +var tileshrinkGl; +try { + tileshrinkGl = require('tileshrink-gl'); +} catch (e) {} + var utils = require('./utils'); -module.exports = function(options, repo, params, id) { +module.exports = function(options, repo, params, id, styles) { var app = express().disable('x-powered-by'); var mbtilesFile = path.resolve(options.paths.mbtiles, params.mbtiles); @@ -17,6 +22,8 @@ module.exports = function(options, repo, params, id) { 'tiles': params.domains || options.domains }; + var shrinkers = {}; + repo[id] = tileJSON; var mbtilesFileStats = fs.statSync(mbtilesFile); @@ -62,16 +69,39 @@ module.exports = function(options, repo, params, id) { return res.status(500).send(err.message); } } else { - if (tileJSON['format'] == 'pbf') { - headers['Content-Type'] = 'application/x-protobuf'; - headers['Content-Encoding'] = 'gzip'; - } - delete headers['ETag']; // do not trust the tile ETag -- regenerate - res.set(headers); - if (data == null) { return res.status(404).send('Not found'); } else { + if (tileJSON['format'] == 'pbf') { + headers['Content-Type'] = 'application/x-protobuf'; + headers['Content-Encoding'] = 'gzip'; + + var style = req.query.style; + if (style && tileshrinkGl) { + if (!shrinkers[style]) { + var styleJSON = styles[style]; + if (styleJSON) { + var sourceName = null; + for (var sourceName_ in styleJSON.sources) { + var source = styleJSON.sources[sourceName_]; + if (source && + source.type == 'vector' && + source.url.endsWith('/' + id + '.json')) { + sourceName = sourceName_; + } + } + shrinkers[style] = tileshrinkGl.createPBFShrinker(styleJSON, sourceName); + } + } + if (shrinkers[style]) { + data = shrinkers[style](data, z, tileJSON.maxzoom); + //console.log(shrinkers[style].getStats()); + } + } + } + delete headers['ETag']; // do not trust the tile ETag -- regenerate + res.set(headers); + return res.status(200).send(data); } } diff --git a/src/serve_style.js b/src/serve_style.js index 6b5c390..71d7529 100644 --- a/src/serve_style.js +++ b/src/serve_style.js @@ -53,10 +53,11 @@ module.exports = function(options, repo, params, id, reportTiles, reportFont) { app.get('/' + id + '.json', function(req, res, next) { var fixUrl = function(url, opt_nokey) { - var query = ''; + var queryParams = ['style=' + id]; if (!opt_nokey && req.query.key) { - query = '?key=' + req.query.key; + queryParams.unshift('key=' + req.query.key); } + var query = '?' + queryParams.join('&'); return url.replace( 'local://', req.protocol + '://' + req.headers.host + '/') + query; }; diff --git a/src/server.js b/src/server.js index 702f811..9c5af46 100644 --- a/src/server.js +++ b/src/server.js @@ -153,7 +153,7 @@ module.exports = function(opts, callback) { return; } - app.use('/data/', serve_data(options, serving.data, item, id)); + app.use('/data/', serve_data(options, serving.data, item, id, serving.styles)); }); app.get('/styles.json', function(req, res, next) { diff --git a/src/utils.js b/src/utils.js index abc084f..b1fb4a1 100644 --- a/src/utils.js +++ b/src/utils.js @@ -18,7 +18,14 @@ module.exports.getTileUrls = function(req, domains, path, format) { } var key = req.query.key; - var query = (key && key.length > 0) ? ('?key=' + key) : ''; + var queryParams = []; + if (req.query.key) { + queryParams.push('key=' + req.query.key); + } + if (req.query.style) { + queryParams.push('style=' + req.query.style); + } + var query = queryParams.length > 0 ? ('?' + queryParams.join('&')) : ''; var uris = []; domains.forEach(function(domain) {