wmts-to-mbtiles
Version:
Save tiles from WMTS service to MBTiles format
79 lines (67 loc) • 2.04 kB
JavaScript
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)
}