Source: tissot.js

import { geoCircle } from "d3-geo";

/**
 * @function tissot
 * @summary Generate Tissot's indicatrix.
 * @param {number} [step = 20] - The distance between each circle
 * @example
 * geotoolbox.tissot(*a geojson*)
 */

export function tissot(step = 20) {
  const circle = geoCircle()
    .center((d) => d)
    .radius(step / 4)
    .precision(10);
  const features = [];
  for (let y = -80; y <= 80; y += step) {
    for (let x = -180; x < 180; x += step) {
      features.push({
        type: "Feature",
        properties: {},
        geometry: {
          type: "MultiPolygon",
          coordinates: [circle([x, y]).coordinates],
        },
      });
    }
  }

  return { type: "FeatureCollection", features: features };
}