UNPKG

svg-mapper

Version:

Tool to slice big, annotated SVG into WebMercator tiles

203 lines (202 loc) 8.03 kB
// 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);