You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
1.5 KiB
46 lines
1.5 KiB
import {geoProjection as projection} from "d3-geo";
|
|
import {abs, acos, cos, epsilon, halfPi, sin, pi, sqrt, sqrt2} from "./math.js";
|
|
|
|
var pi_sqrt2 = pi / sqrt2;
|
|
|
|
export function larriveeRaw(lambda, phi) {
|
|
return [
|
|
lambda * (1 + sqrt(cos(phi))) / 2,
|
|
phi / (cos(phi / 2) * cos(lambda / 6))
|
|
];
|
|
}
|
|
|
|
larriveeRaw.invert = function(x, y) {
|
|
var x0 = abs(x),
|
|
y0 = abs(y),
|
|
lambda = epsilon,
|
|
phi = halfPi;
|
|
if (y0 < pi_sqrt2) phi *= y0 / pi_sqrt2;
|
|
else lambda += 6 * acos(pi_sqrt2 / y0);
|
|
for (var i = 0; i < 25; i++) {
|
|
var sinPhi = sin(phi),
|
|
sqrtcosPhi = sqrt(cos(phi)),
|
|
sinPhi_2 = sin(phi / 2),
|
|
cosPhi_2 = cos(phi / 2),
|
|
sinLambda_6 = sin(lambda / 6),
|
|
cosLambda_6 = cos(lambda / 6),
|
|
f0 = 0.5 * lambda * (1 + sqrtcosPhi) - x0,
|
|
f1 = phi / (cosPhi_2 * cosLambda_6) - y0,
|
|
df0dPhi = sqrtcosPhi ? -0.25 * lambda * sinPhi / sqrtcosPhi : 0,
|
|
df0dLambda = 0.5 * (1 + sqrtcosPhi),
|
|
df1dPhi = (1 + 0.5 * phi * sinPhi_2 / cosPhi_2) / (cosPhi_2 * cosLambda_6),
|
|
df1dLambda = (phi / cosPhi_2) * (sinLambda_6 / 6) / (cosLambda_6 * cosLambda_6),
|
|
denom = df0dPhi * df1dLambda - df1dPhi * df0dLambda,
|
|
dPhi = (f0 * df1dLambda - f1 * df0dLambda) / denom,
|
|
dLambda = (f1 * df0dPhi - f0 * df1dPhi) / denom;
|
|
phi -= dPhi;
|
|
lambda -= dLambda;
|
|
if (abs(dPhi) < epsilon && abs(dLambda) < epsilon) break;
|
|
}
|
|
return [x < 0 ? -lambda : lambda, y < 0 ? -phi : phi];
|
|
};
|
|
|
|
export default function() {
|
|
return projection(larriveeRaw)
|
|
.scale(97.2672);
|
|
}
|
|
|