mapslice
Version:
Slices a given image into tiles to be used for a interactive map display. (including command-line tool)
30 lines (28 loc) • 1.12 kB
JavaScript
const mkdirp = require('mkdirp')
const outputResolve = require('./util/outputResolve')
const path = require('path')
const maybeAbort = require('./util/maybeAbort')
const abortDisposers = require('./util/abortDisposers')
function pos (x) {
return (x >= 0) ? `+${x}` : x
}
module.exports = async function processTile (options, levelFile, tile) {
const tileFile = outputResolve(options.output, tile.zoomLevel, tile.yIndex, tile.xIndex)
const parentDir = path.dirname(tileFile)
try {
await mkdirp(parentDir)
maybeAbort(options.signal)
} catch (cause) {
throw Object.assign(new Error('Can not create parent directory'), { code: 'MPARENTTILE', cause, parentDir })
}
const crop = `${tile.width}x${tile.height}${pos(tile.x)}${pos(tile.y)}`
return await new Promise((resolve, reject) => {
options.gm(levelFile).options({ disposers: abortDisposers(options.signal) }).out('-crop', crop).write(tileFile, cause => {
if (cause) {
return reject(Object.assign(new Error('Can not crop tile'), { code: 'MNOCROP', cause, tileFile }))
}
resolve(tileFile)
})
})
}