UNPKG

wmts-to-mbtiles

Version:

Save tiles from WMTS service to MBTiles format

79 lines (67 loc) 2.04 kB
#!/usr/bin/env node const _ = require('lodash') const program = require('commander') const Promise = require('bluebird') const WmtsToMbtiles = require('./src/wmts-to-mbtiles') const {getCapabilities} = require('./src/wmts-parser') const defaultZoom = 10 const cmd = program .option('--layers', 'List WMTS service layers') .option('--layer [id]', 'Get layer') .option('--output [mbtiles]', 'Output file') .option('--zoom [zoom]', 'Zoom level', defaultZoom) .option('--input [url]', 'WMTS service GetCapabilities URL') .option('--bbox [w s e n]', 'Latitude and longitude values, eg. "23.411 59.731 26.850 60.562"') .parse(process.argv) const options = cmd.opts() const {lat, long, layer, input, output, layers} = options if (!input) { argumentError(`Requires input WMTS service URL!`) } if (layers) { printLayers() } else { if (!layer) { argumentError(`Requires layer id!`) } const bbox = options.bbox ? options.bbox.split(' ').map(parseFloat) : undefined if (bbox) { console.log('Requested bounds:', bbox) } if (bbox && bbox.length !== 4) { argumentError(`Invalid bounds!`) } if (!options.zoom) { argumentError(`Requires zoom!`) } const zoom = parseInt(options.zoom) const defaultMbtilesFile = `./${_.snakeCase(_.deburr(layer))}-${zoom}.mbtiles` if (!output) { argumentError(`Requires output file!`) } WmtsToMbtiles({ mbtilesFile: output || defaultMbtilesFile, wmtsUrl: input, layer, zoom, bbox }) } function printLayers() { console.log('Fetching layers ....') getCapabilities(input) .then(capabilities => { return _.map(capabilities.layers, l => _.pick(l, ['id', 'title'])) }) .then(layers => { const maxLen = _.get(_.maxBy(layers, l => l.id.length), 'id.length') console.log('Layers:') console.log(`${_.map(layers, l => `${_.padEnd(l.id, maxLen)} :: ${l.title}`).join('\n')}`) process.exit(0) }) } function argumentError(err) { cmd.outputHelp() console.log(err) process.exit(-1) }