UNPKG

staticmaps

Version:

A Node.js library for creating map images with markers, polylines, polygons and text.

248 lines (245 loc) 10.1 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _sharp = _interopRequireDefault(require("sharp")); var _lodash = _interopRequireDefault(require("lodash.last")); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } var Image = exports["default"] = /*#__PURE__*/function () { function Image() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; (0, _classCallCheck2["default"])(this, Image); this.options = options; this.width = this.options.width; this.height = this.options.height; this.quality = this.options.quality || 100; } /** * Prepare all tiles to fit the baselayer */ (0, _createClass2["default"])(Image, [{ key: "prepareTileParts", value: function prepareTileParts(data) { var _this = this; return new Promise(function (resolve) { var tile = (0, _sharp["default"])(data.body); tile.metadata().then(function (metadata) { var x = data.box[0]; var y = data.box[1]; var sx = x < 0 ? 0 : x; var sy = y < 0 ? 0 : y; var dx = x < 0 ? -x : 0; var dy = y < 0 ? -y : 0; var extraWidth = x + (metadata.width - _this.width); var extraHeight = y + (metadata.width - _this.height); var w = metadata.width + (x < 0 ? x : 0) - (extraWidth > 0 ? extraWidth : 0); var h = metadata.height + (y < 0 ? y : 0) - (extraHeight > 0 ? extraHeight : 0); // Fixed #20 https://github.com/StephanGeorg/staticmaps/issues/20 if (!w || !h) { resolve({ success: false }); return null; } return tile.extract({ left: dx, top: dy, width: w, height: h }).toBuffer().then(function (part) { resolve({ success: true, position: { top: Math.round(sy), left: Math.round(sx) }, data: part }); })["catch"](function () { return resolve({ success: false }); }); })["catch"](function () { return resolve({ success: false }); }); }); } }, { key: "draw", value: function () { var _draw = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(tiles) { var _this2 = this; var baselayer, tileParts, preparedTiles, preparedTilesForSharp; return _regenerator["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: this.tempBuffer = null; if (this.image) { _context.next = 8; break; } // Generate baseimage baselayer = (0, _sharp["default"])({ create: { width: this.width, height: this.height, channels: 4, background: { r: 0, g: 0, b: 0, alpha: 0 } } }); // Save baseImage as buffer _context.next = 5; return baselayer.png().toBuffer(); case 5: this.tempBuffer = _context.sent; _context.next = 9; break; case 8: this.tempBuffer = this.image; case 9: // Prepare tiles for composing baselayer tileParts = []; tiles.forEach(function (tile, i) { tileParts.push(_this2.prepareTileParts(tile, i)); }); _context.next = 13; return Promise.all(tileParts); case 13: preparedTiles = _context.sent.filter(function (v) { return v.success; }); // Compose all prepared tiles to the baselayer preparedTilesForSharp = preparedTiles.filter(function (preparedTile) { return !!preparedTile; }) // remove non-existing tiles .map(function (preparedTile) { var position = preparedTile.position, data = preparedTile.data; position.top = Math.round(position.top); position.left = Math.round(position.left); return _objectSpread({ input: data }, position); }); _context.next = 17; return (0, _sharp["default"])(this.tempBuffer).composite(preparedTilesForSharp).toBuffer(); case 17: this.tempBuffer = _context.sent; this.image = this.tempBuffer; return _context.abrupt("return", true); case 20: case "end": return _context.stop(); } }, _callee, this); })); function draw(_x) { return _draw.apply(this, arguments); } return draw; }() /** * Save image to file */ }, { key: "save", value: (function () { var _save = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() { var fileName, outOpts, format, outputOptions, _args2 = arguments; return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: fileName = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : 'output.png'; outOpts = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : {}; format = (0, _lodash["default"])(fileName.split('.')); outputOptions = outOpts; outputOptions.quality = outputOptions.quality || this.quality; _context2.t0 = format.toLowerCase(); _context2.next = _context2.t0 === 'webp' ? 8 : _context2.t0 === 'jpg' ? 11 : _context2.t0 === 'jpeg' ? 11 : _context2.t0 === 'png' ? 14 : 14; break; case 8: _context2.next = 10; return (0, _sharp["default"])(this.image).webp(outputOptions).toFile(fileName); case 10: return _context2.abrupt("break", 16); case 11: _context2.next = 13; return (0, _sharp["default"])(this.image).jpeg(outputOptions).toFile(fileName); case 13: return _context2.abrupt("break", 16); case 14: _context2.next = 16; return (0, _sharp["default"])(this.image).png(outputOptions).toFile(fileName); case 16: case "end": return _context2.stop(); } }, _callee2, this); })); function save() { return _save.apply(this, arguments); } return save; }() /** * Return image as buffer */ ) }, { key: "buffer", value: (function () { var _buffer = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() { var mime, outOpts, outputOptions, _args3 = arguments; return _regenerator["default"].wrap(function _callee3$(_context3) { while (1) switch (_context3.prev = _context3.next) { case 0: mime = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : 'image/png'; outOpts = _args3.length > 1 && _args3[1] !== undefined ? _args3[1] : {}; outputOptions = outOpts; outputOptions.quality = outputOptions.quality || this.quality; _context3.t0 = mime.toLowerCase(); _context3.next = _context3.t0 === 'image/webp' ? 7 : _context3.t0 === 'image/jpeg' ? 8 : _context3.t0 === 'image/jpg' ? 8 : _context3.t0 === 'image/png' ? 9 : 9; break; case 7: return _context3.abrupt("return", (0, _sharp["default"])(this.image).webp(outputOptions).toBuffer()); case 8: return _context3.abrupt("return", (0, _sharp["default"])(this.image).jpeg(outputOptions).toBuffer()); case 9: return _context3.abrupt("return", (0, _sharp["default"])(this.image).png(outputOptions).toBuffer()); case 10: case "end": return _context3.stop(); } }, _callee3, this); })); function buffer() { return _buffer.apply(this, arguments); } return buffer; }()) }]); return Image; }(); module.exports = Image;