Advertisement
Guest User

Untitled

a guest
Dec 16th, 2019
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var zlib = require('zlib');
  2.  
  3. var express = require('express');
  4. var mapnik = require('mapnik');
  5. var Promise = require('promise');
  6. var SphericalMercator = require('sphericalmercator');
  7.  
  8. var mercator = new SphericalMercator({
  9.     size: 256 //tile size
  10. });
  11.  
  12. mapnik.register_default_input_plugins();
  13.  
  14. var app = express();
  15.  
  16. app.get('/:namelayer/:z/:x/:y.pbf', (req, res, next) => {
  17.     var options = {
  18.         x: parseInt(req.params.x),
  19.         y: parseInt(req.params.y),
  20.         z: parseInt(req.params.z),
  21.         layerName: req.params.namelayer
  22.     };
  23.  
  24.     makeVectorTile(options).then( (vectorTile) => {
  25.         zlib.deflate(vectorTile, (err, data) => {
  26.             if (err) {
  27.                 return res.status(500).send(err.message);
  28.             }
  29.  
  30.             res.setHeader('Content-Encoding', 'deflate');
  31.             res.setHeader('Content-Type', 'application/x-protobuf');
  32.             return res.send(data);
  33.         });
  34.     });
  35. });
  36.  
  37. function makeVectorTile(options) {
  38.     var extent = mercator.bbox(options.x, options.y, options.z, false, '3857');
  39.  
  40.     var map = new mapnik.Map(256, 256, '+init=epsg:3857');
  41.     map.extent = extent;
  42.  
  43.     var layer = new mapnik.Layer(options.layerName);
  44.     layer.datasource = new mapnik.Datasource({
  45.         type: process.env.DB_TYPE,
  46.         dbname: process.env.DB_DATABASE,
  47.         table: options.layerName,
  48.         user: process.env.DB_USER,
  49.         password: process.env.DB_PASSWORD
  50.     });
  51.  
  52.     layer.styles = ['default'];
  53.     map.add_layer(layer);
  54.    
  55.     return new Promise( (resolve, reject) => {
  56.         var vtile = new mapnik.VectorTile(parseInt(options.z), parseInt(options.x), parseInt(options.y));
  57.         map.render(vtile, function (err, vtile) {
  58.             if (err) {
  59.                 console.log('Error: ', err)
  60.                 return reject(err);
  61.             }
  62.             console.log(`${vtile.getData().length} KB`);
  63.             resolve(vtile.getData());
  64.         });
  65.     });
  66. };
  67.  
  68. module.exports = app;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement