UNPKG

svg-mapper

Version:

Tool to slice big, annotated SVG into WebMercator tiles

97 lines (96 loc) 4.1 kB
// Generated by LiveScript 1.2.0 (function(){ var zlib, async, canvg, Canvas, fs, optimist, TileMaker, TileJsonGenerator, utils, argv, dirname, zoomLevel, mode, currentSub, subSize, svgSource, svg, ref$, exportables, bounds, tileJsonGenerator, this$ = this; zlib = require('zlib'); async = require('async'); canvg = require('canvg'); Canvas = require('canvas'); fs = require('fs'); optimist = require('optimist'); TileMaker = require('./TileMaker'); TileJsonGenerator = require('./TileJsonGenerator'); utils = require('./utils'); optimist.usage("Usage: $0 -d [directory] -z [num] -m [image|json] ").demand(["d", "z", "m"]).describe("d", "Directory with prepared original.svg, exports.svg and data.json").describe("z", "Zoom level to generate").describe("m", "Mode, 'image' or 'json'").describe("c", "Subimage index to generate, zero-based.").describe("s", "Subimage size in counts of tiles (= maximum width or height of sliced image)"); argv = optimist.argv; dirname = argv.d; zoomLevel = argv.z; mode = argv.m; currentSub = argv.c || 0; subSize = argv.s || 19; svgSource = (function(){ switch (mode) { case "image": return dirname + "/original.svg"; case "json": return dirname + "/exports.svg"; default: throw new Error("Unknown mode: " + mode + ". Allowed modes are 'image' and 'json'."); } }()); svg = fs.readFileSync(svgSource).toString(); ref$ = JSON.parse( fs.readFileSync( dirname + "/data.json")), exportables = ref$.exportables, bounds = ref$.bounds; tileJsonGenerator = new TileJsonGenerator(exportables); utils.prepareLeaflet(function(){ var ref$, width, height, firstTileNumberX, firstTileNumberY, offsetX, offsetY, subMaxWidth, subMaxHeight, ySteps, xIndex, yIndex, notDrawableX, notDrawableY, subFirstTileNumberX, subFirstTileNumberY, remainingX, remainingY, subWidth, subHeight, canvasOptions, canvas, tilesDone, fileSuffix, x$, tileMaker, tileCount; ref$ = utils.getPixelDimensions(bounds, zoomLevel), width = ref$.width, height = ref$.height, firstTileNumberX = ref$.firstTileNumberX, firstTileNumberY = ref$.firstTileNumberY, offsetX = ref$.offsetX, offsetY = ref$.offsetY; subMaxWidth = subSize * 256; subMaxHeight = subSize * 256; ySteps = Math.ceil(height / subMaxHeight); xIndex = Math.floor(currentSub / ySteps); yIndex = currentSub % ySteps; notDrawableX = xIndex * subMaxWidth; notDrawableY = yIndex * subMaxHeight; subFirstTileNumberX = firstTileNumberX + notDrawableX / 256; subFirstTileNumberY = firstTileNumberY + notDrawableY / 256; remainingX = width + offsetX - notDrawableX; remainingY = height + offsetY - notDrawableY; subWidth = Math.min(remainingX, subMaxWidth); subHeight = Math.min(remainingY, subMaxHeight); canvasOptions = { offsetX: offsetX - notDrawableX, offsetY: offsetY - notDrawableY, scaleWidth: width, scaleHeight: height, ignoreDimensions: true }; canvas = new Canvas(subWidth, subHeight); canvg(canvas, svg, canvasOptions); tilesDone = 0; fileSuffix = (function(){ switch (mode) { case "image": return "png"; case "json": return "json"; } }()); x$ = tileMaker = new TileMaker(canvas, [256, 256], zoomLevel); x$.on('tile', function(z, x, y, canvas){ var buffer, data; x += subFirstTileNumberX; y += subFirstTileNumberY; buffer = canvas.toBuffer(); data = (function(){ switch (mode) { case "image": return buffer; case "json": return JSON.stringify( tileJsonGenerator.generateJson( canvas)); } }()); fs.writeFileSync(dirname + "/" + z + "/" + x + "/" + y + "." + fileSuffix, data); tilesDone++; if (0 === tilesDone % 25) { console.log(Math.round(tilesDone / tileCount * 100) + "%"); } if (tilesDone === tileCount) { return setTimeout(process.exit, 1000); } }); return tileCount = tileMaker.makeTiles(); }); }).call(this);