svg-mapper
Version:
Tool to slice big, annotated SVG into WebMercator tiles
133 lines (131 loc) • 4.91 kB
JavaScript
// Generated by LiveScript 1.2.0
(function(){
var fs, exec, async, utils, optimist, argv, subSize, subMaxWidth, subMaxHeight, skipTiles, skipJsons, cores, ref$, zoomLevelBoundaries, absoluteOrRelative, absoluteAddress, stat, svgSuffixRegex, files, commands, this$ = this;
fs = require('fs');
exec = require('child_process').exec;
async = require('async');
utils = require('./utils');
optimist = require('optimist');
optimist.usage("Usage: $0 [svg file] -z [num] -s [num] -c [num] [--only-jsons | --only-tiles]").demand(1).demand(['z']).describe("z", "Zoomlevel boundaries (inclusive), eg. 5-8").describe("c", "Number of CPU cores to use")['default']("c", 4).describe("s", "Maximum size of image before slicing")['default']("s", 19).alias("z", "zoom").alias("c", "cores");
argv = optimist.argv;
subSize = +argv.s || 19;
subMaxWidth = subSize * 256;
subMaxHeight = subSize * 256;
skipTiles = skipJsons = false;
if (argv["only-jsons"]) {
skipTiles = true;
}
if (argv["only-tiles"]) {
skipJsons = true;
}
cores = +argv.c || 4;
if (!((ref$ = argv.z) != null && ref$.match(/[0-9]-[0-9]+/))) {
console.log("Invalid zoomlevel boundaries, use eg. -z 5-8");
return;
}
zoomLevelBoundaries = argv.z.split("-").map(function(it){
return parseInt(it, 10);
});
absoluteOrRelative = (ref$ = optimist.argv._) != null ? ref$[0] : void 8;
absoluteAddress = (function(){
switch (false) {
case !fs.existsSync(absoluteOrRelative):
return absoluteOrRelative;
case !fs.existsSync(process.cwd() + "/" + absoluteOrRelative):
return process.cwd() + "/" + absoluteOrRelative;
default:
throw new Error("File not found: " + absoluteOrRelative);
}
}());
stat = fs.statSync(absoluteAddress);
svgSuffixRegex = /\.svg$/;
files = stat.isDirectory()
? fs.readdirSync(absoluteAddress).filter(function(it){
return svgSuffixRegex.test(it);
}).map(function(it){
return absoluteAddress + "/" + it;
})
: [absoluteAddress];
commands = [];
async.eachLimit(files, cores, function(file, cb){
var dir, this$ = this;
dir = file.replace(svgSuffixRegex, '');
dir += "/";
return fs.mkdir(dir, function(err){
var cmd;
if (err) {
console.log("Directory already exists or is not creatable, skipping: " + dir);
cb();
return;
}
console.log("Generating metadata for " + file);
cmd = "node " + __dirname + "/metadata.js -f " + file + " -d " + dir;
return exec(cmd, function(err, stdout, stderr){
var bounds;
[err, stderr].filter(function(it){
return it;
}).forEach(function(it){
throw new Error(it);
});
bounds = JSON.parse(
fs.readFileSync(
dir + "/data.json")).bounds;
return utils.prepareLeaflet(function(){
var zoomLevelDataCurry, zoomLevels;
zoomLevelDataCurry = function(zoomLevel){
return utils.getZoomlevelData(bounds, subMaxWidth, subMaxHeight, zoomLevel);
};
zoomLevels = (function(){
var i$, to$, results$ = [];
for (i$ = zoomLevelBoundaries[0], to$ = zoomLevelBoundaries[1]; i$ <= to$; ++i$) {
results$.push(i$);
}
return results$;
}()).map(zoomLevelDataCurry);
console.log("Creating directories");
return utils.createDirectories(dir, zoomLevels, function(){
commands = commands.concat(utils.generateCommands(dir, subSize, zoomLevels, {
skipTiles: skipTiles,
skipJsons: skipJsons
}));
return cb();
});
});
});
});
}, function(){
var i, len, processing;
i = 0;
len = commands.length;
processing = {};
console.log("Starting tile generation. Using " + cores + " cores to do " + len + " jobs.");
return async.eachLimit(commands, cores, function(cmd, cb){
var index, this$ = this;
index = ++i;
processing[index] = true;
process.stdout.write("Started job #" + index + " of " + len + " total.\n");
return exec(cmd, function(err, stdout, stderr){
var out, res$, pindex, that;
process.stdout.write("Done job #" + index + ".");
delete processing[index];
res$ = [];
for (pindex in processing) {
res$.push(pindex);
}
out = res$;
if (out.length) {
process.stdout.write(" Still processing jobs #" + out.join(", "));
process.stdout.write(". Jobs remaining: " + (len - i) + ".");
}
process.stdout.write("\n");
if (that = stderr) {
console.log(that);
}
return cb();
});
}, function(){
return console.log("All done, tiles are now in same directory as " + absoluteAddress);
});
});
}).call(this);