function initSource({ source, tileFactory }) {
const { type, tileSize = 512, minzoom = 0, maxzoom = 30 } = source;
const tileCache = tileRack.initCache(tileSize, tileFactory);
var numTiles = 0;
const layout = d3tileAlternate
.tile()
.tileSize(tileSize * Math.sqrt(2))
.maxZoom(maxzoom)
.clampX(false);
function getTiles(viewport, transform) {
layout.size(viewport);
let tiles = layout(transform);
let metric = getTileMetric(layout, tiles, 1.5);
let dropCondition = tile => metric(tile) > 0.9;
const grid = tiles.map(([x, y, z]) => {
const [xw, yw, zw] = d3.tileWrap([x, y, z]);
const box = tileCache.retrieve([zw, xw, yw], dropCondition);
if (!box) return;
return Object.assign(box, { x, y, z });
});
let tilePixels = Math.round(tiles.scale * devicePixelRatio);
grid.scale = tilePixels / devicePixelRatio;
grid.translate = tiles.translate.map(
x => Math.round(x * tilePixels) / tilePixels
);
numTiles = tileCache.trim(metric, 0.9);
return grid;
}
return { getTiles, numTiles: () => numTiles };
}