UNPKG

@alvarcarto/tilewarm

Version:

A command-line tool to warm up your tile server cache

49 lines (43 loc) 1.43 kB
const _ = require('lodash'); const turf = require('@turf/turf'); const tileCover = require('@mapbox/tile-cover'); function createTiles(opts) { const geometries = []; if (opts.input) { const geojson = opts.input; if (geojson.type === 'FeatureCollection') { _.forEach(geojson.features, i => geometries.push(i.geometry)); } else if (geojson.type === 'Feature') { geometries.push(geojson.geometry); } else if (geojson.type === 'Polygon') { geometries.push(geojson); } else { throw new Error(`Unsupported GeoJSON type at top level: ${geojson.type}`); } } else { const point = turf.point([opts.point.lng, opts.point.lat]); // If buffer not defined, use 10meters const radius = opts.buffer.radius < 0.0001 ? 0.01 : opts.buffer.radius; const buffered = turf.buffer(point, radius, { units: opts.buffer.unit }); geometries.push(buffered.geometry); } const a = _.map(geometries, geometry => { const b = _.map(opts.zoom, z => tileCover.tiles(geometry, { min_zoom: z, max_zoom: z })); return _.flatten(b); }); const sorted = _.orderBy(_.flatten(a), ['2', '0', '1']); return _.uniqBy(sorted, xyz => `${xyz[0]}${xyz[1]}${xyz[2]}`); } function buildUrl(template, xyz) { return template .replace(/\{x\}/g, xyz[0]) .replace(/\{y\}/g, xyz[1]) .replace(/\{z\}/g, xyz[2]); } module.exports = { createTiles, buildUrl, };