svg-mapper
Version:
Tool to slice big, annotated SVG into WebMercator tiles
97 lines (96 loc) • 4.1 kB
JavaScript
// 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);