svg-mapper
Version:
Tool to slice big, annotated SVG into WebMercator tiles
203 lines (202 loc) • 8.03 kB
JavaScript
// Generated by LiveScript 1.2.0
(function(){
var L, getPixelDimensions, prepareLeaflet, prepareSvgs, extractBounds, getPrepared$Svg, computeToContouredExports, fixCdata;
L = null;
module.exports.generateMetadata = function(svgAddress, targetDir, cb){
var fs, async, this$ = this;
fs = require('fs');
async = require('async');
return prepareSvgs(svgAddress, function(err, arg$){
var originalImage, contouredExportsImage, exportables, bounds, data;
originalImage = arg$.originalImage, contouredExportsImage = arg$.contouredExportsImage, exportables = arg$.exportables, bounds = arg$.bounds;
data = JSON.stringify({
exportables: exportables,
bounds: bounds
});
return async.parallel([
function(it){
return fs.writeFile(targetDir + "/original.svg", originalImage, it);
}, function(it){
return fs.writeFile(targetDir + "/exports.svg", contouredExportsImage, it);
}, function(it){
return fs.writeFile(targetDir + "/data.json", data, it);
}
], function(){
return typeof cb === 'function' ? cb() : void 8;
});
});
};
module.exports.getZoomlevelData = function(bounds, subMaxWidth, subMaxHeight, zoomLevel){
var ref$, width, height, firstTileNumberX, lastTileNumberX, xSteps, ySteps;
ref$ = getPixelDimensions(bounds, zoomLevel), width = ref$.width, height = ref$.height, firstTileNumberX = ref$.firstTileNumberX, lastTileNumberX = ref$.lastTileNumberX;
xSteps = Math.ceil(width / subMaxWidth);
ySteps = Math.ceil(height / subMaxHeight);
return {
zoomLevel: zoomLevel,
xSteps: xSteps,
ySteps: ySteps,
firstTileNumberX: firstTileNumberX,
lastTileNumberX: lastTileNumberX
};
};
module.exports.createDirectories = function(dir, zoomLevels, cb){
var fs, async, this$ = this;
fs = require('fs');
async = require('async');
return async.each(zoomLevels, function(arg$, cb){
var zoomLevel, firstTileNumberX, lastTileNumberX, this$ = this;
zoomLevel = arg$.zoomLevel, firstTileNumberX = arg$.firstTileNumberX, lastTileNumberX = arg$.lastTileNumberX;
return fs.mkdir(dir + "/" + zoomLevel, function(){
return async.each((function(){
var i$, to$, results$ = [];
for (i$ = firstTileNumberX, to$ = lastTileNumberX; i$ <= to$; ++i$) {
results$.push(i$);
}
return results$;
}()), function(x, cb){
var this$ = this;
return fs.mkdir(dir + "/" + zoomLevel + "/" + x, function(){
return cb();
});
}, function(){
return cb();
});
});
}, function(){
return typeof cb === 'function' ? cb() : void 8;
});
};
module.exports.generateCommands = function(dir, subSize, zoomLevels, options){
var skipJsons, ref$, skipTiles, commands, i$, len$, zoomLevel, xSteps, ySteps, j$, len1$, sub;
skipJsons = (ref$ = options.skipJsons) != null ? ref$ : false, skipTiles = (ref$ = options.skipTiles) != null ? ref$ : false;
commands = [];
for (i$ = 0, len$ = zoomLevels.length; i$ < len$; ++i$) {
ref$ = zoomLevels[i$], zoomLevel = ref$.zoomLevel, xSteps = ref$.xSteps, ySteps = ref$.ySteps;
for (j$ = 0, len1$ = (ref$ = (fn$())).length; j$ < len1$; ++j$) {
sub = ref$[j$];
if (!skipJsons) {
commands.push("node " + __dirname + "/map.js -d " + dir + " -z " + zoomLevel + " -c " + sub + " -m json -s " + subSize);
}
if (!skipTiles) {
commands.push("node " + __dirname + "/map.js -d " + dir + " -z " + zoomLevel + " -c " + sub + " -m image -s " + subSize);
}
}
}
return commands;
function fn$(){
var i$, to$, results$ = [];
for (i$ = 0, to$ = xSteps * ySteps; i$ < to$; ++i$) {
results$.push(i$);
}
return results$;
}
};
getPixelDimensions = module.exports.getPixelDimensions = function(arg$, zoomLevel){
var north, west, east, south, ref$, x0, y0, x1, y1, offsetX, offsetY, width, height, firstTileNumberX, firstTileNumberY, lastTileNumberX, lastTileNumberY;
north = arg$.north, west = arg$.west, east = arg$.east, south = arg$.south;
if (!L) {
throw new error("Leaflet is not prepared - call utils.prepareLeaflet and wait for it to finish before calling getPixelDimensions");
}
ref$ = L.CRS.EPSG3857.latLngToPoint(new L.LatLng(north, west), zoomLevel), x0 = ref$.x, y0 = ref$.y;
ref$ = L.CRS.EPSG3857.latLngToPoint(new L.LatLng(south, east), zoomLevel), x1 = ref$.x, y1 = ref$.y;
offsetX = x0 % 256;
offsetY = y0 % 256;
width = Math.abs(x0 - x1);
height = Math.abs(y0 - y1);
firstTileNumberX = Math.floor(x0 / 256);
firstTileNumberY = Math.floor(y0 / 256);
lastTileNumberX = Math.floor(x1 / 256);
lastTileNumberY = Math.floor(y1 / 256);
return {
width: width,
height: height,
firstTileNumberX: firstTileNumberX,
firstTileNumberY: firstTileNumberY,
lastTileNumberX: lastTileNumberX,
lastTileNumberY: lastTileNumberY,
offsetX: offsetX,
offsetY: offsetY
};
};
prepareLeaflet = module.exports.prepareLeaflet = function(cb){
var env, this$ = this;
env = require('jsdom').env;
return env("<div></div>", function(err, window){
var leaflet;
global.document = window.document;
global.window = window;
global.navigator = {
userAgent: "webkit"
};
leaflet = require('leaflet');
L = leaflet;
return cb();
});
};
prepareSvgs = function(svgAddress, cb){
var TileJsonGenerator, this$ = this;
TileJsonGenerator = require('./TileJsonGenerator');
return getPrepared$Svg(svgAddress, function(err, $content, $){
var bounds, originalImage, tileJsonGenerator, contouredExportsImage, exportables;
bounds = extractBounds($content);
originalImage = fixCdata($content.html());
tileJsonGenerator = new TileJsonGenerator;
computeToContouredExports($, $content, tileJsonGenerator);
contouredExportsImage = fixCdata($content.html());
exportables = tileJsonGenerator.exportables;
return cb(null, {
originalImage: originalImage,
contouredExportsImage: contouredExportsImage,
exportables: exportables,
bounds: bounds
});
});
};
extractBounds = function($content){
var bounds, ref$, north, west, south, east;
bounds = $content.find("svg").attr('data-bounds');
if (!bounds) {
throw new Error('data-bounds attribute of <svg> not found. Use eg. <svg data-bounds="51.05,12.09,48.55,18.85">');
}
ref$ = bounds.split(/[, ;]/g).map(parseFloat), north = ref$[0], west = ref$[1], south = ref$[2], east = ref$[3];
return {
north: north,
west: west,
south: south,
east: east
};
};
getPrepared$Svg = function(svgAddress, cb){
var env, fs, jquery, this$ = this;
env = require('jsdom').env;
fs = require('fs');
jquery = require('jquery');
return env("<div></div>", function(err, window){
var $;
$ = jquery(window);
return fs.readFile(svgAddress, function(err, content){
var $content;
content = content.toString();
$content = $("<div></div>");
$content.html(content);
$content.find("style").remove();
return cb(null, $content, $);
});
});
};
computeToContouredExports = function($, $content, tileJsonGenerator){
var $exportables;
$exportables = $content.find("[data-export]");
return $exportables.each(function(){
var $ele, exportable, index, color;
$ele = $(this);
exportable = $ele.attr('data-export');
index = tileJsonGenerator.getExportableIndex(exportable);
color = tileJsonGenerator.getColorByIndex(index);
return $ele.attr('fill', color);
});
};
fixCdata = function(str){
return str.replace("![CDATA[", "<![CDATA[");
};
}).call(this);