function getTileArrayInfo(latLngList, options) {
const [minTileX, minTileY, maxTileX, maxTileY] = latLngList.reduce(
function([minTileX, minTileY, maxTileX, maxTileY], [lat, lng], i) {
const [xTile, yTile] = latLngToXY([lat, lng], options.zoom);
if (i === 0) {
minTileX = maxTileX = xTile;
minTileY = maxTileY = yTile;
} else {
minTileX = Math.min(minTileX, xTile);
minTileY = Math.min(minTileY, yTile);
maxTileX = Math.max(maxTileX, xTile);
maxTileY = Math.max(maxTileY, yTile);
}
return [minTileX, minTileY, maxTileX, maxTileY];
},
[undefined, undefined, undefined, undefined]
);
const [tileXSpan, tileYSpan] = [
maxTileX - minTileX + 1,
maxTileY - minTileY + 1
];
const tileDim = Math.min(
options.maxWidth / tileXSpan,
options.maxHeight / tileYSpan
);
const [minLat, minLng] = xyToLatLng([minTileX, minTileY], options.zoom);
const [maxLat, maxLng] = xyToLatLng(
[maxTileX + 1, maxTileY + 1],
options.zoom
);
const [latSpan, lngSpan] = [maxLat - minLat, maxLng - minLng];
const [tileArrayOriginX, tileArrayOriginY] = options.tileArrayOrigin;
function transform([lat, lng]) {
const [pLat, pLng] = [(lat - minLat) / latSpan, (lng - minLng) / lngSpan];
return [
parseInt(tileArrayOriginX + pLng * tileXSpan * tileDim),
parseInt(tileArrayOriginY + pLat * tileYSpan * tileDim)
];
}
return {
origin: [minTileX, minTileY],
dimensions: [tileXSpan, tileYSpan],
tileDim,
transform
};
}