UNPKG

svg-mapper

Version:

Tool to slice big, annotated SVG into WebMercator tiles

133 lines (131 loc) 4.91 kB
#!/usr/bin/env node // 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);