spilhausSquare = {
const { abs, max, min, sin, cos, asin, acos, tan } = Math;
const pi = Math.PI, halfPi = pi / 2;
const spilhausSquareRaw = function(lambda, phi) {
let a, b, sm, sn, xy;
const sp = tan(0.5 * phi);
a = cos(asin(sp)) * sin(0.5 * lambda);
sm = (sp + a) < 0;
sn = (sp - a) < 0;
b = acos(sp);
a = acos(a);
return ellipticFactory(a, b, sm, sn);
}
spilhausSquareRaw.invert = function(x, y) {
let phi = max(min(y / 1.8540746957596883, 1), -1) * halfPi;
let lam = abs(phi) < pi ? max(min(x / 1.854074716833181, 1), -1) * pi : 0;
return inverse(x, y, lam, phi, spilhausSquareRaw);
}
return () => d3.geoProjection(spilhausSquareRaw)
.rotate([-66.94970198, 49.56371678, 40.17823482])
.scale(134.838125);
}