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.
37 lines
1.8 KiB
37 lines
1.8 KiB
import {geoProjection as projection} from "d3-geo";
|
|
import {abs, epsilon, pi, sign} from "./math.js";
|
|
|
|
export function laskowskiRaw(lambda, phi) {
|
|
var lambda2 = lambda * lambda, phi2 = phi * phi;
|
|
return [
|
|
lambda * (0.975534 + phi2 * (-0.119161 + lambda2 * -0.0143059 + phi2 * -0.0547009)),
|
|
phi * (1.00384 + lambda2 * (0.0802894 + phi2 * -0.02855 + lambda2 * 0.000199025) + phi2 * (0.0998909 + phi2 * -0.0491032))
|
|
];
|
|
}
|
|
|
|
laskowskiRaw.invert = function(x, y) {
|
|
var lambda = sign(x) * pi,
|
|
phi = y / 2,
|
|
i = 50;
|
|
do {
|
|
var lambda2 = lambda * lambda,
|
|
phi2 = phi * phi,
|
|
lambdaPhi = lambda * phi,
|
|
fx = lambda * (0.975534 + phi2 * (-0.119161 + lambda2 * -0.0143059 + phi2 * -0.0547009)) - x,
|
|
fy = phi * (1.00384 + lambda2 * (0.0802894 + phi2 * -0.02855 + lambda2 * 0.000199025) + phi2 * (0.0998909 + phi2 * -0.0491032)) - y,
|
|
deltaxDeltaLambda = 0.975534 - phi2 * (0.119161 + 3 * lambda2 * 0.0143059 + phi2 * 0.0547009),
|
|
deltaxDeltaPhi = -lambdaPhi * (2 * 0.119161 + 4 * 0.0547009 * phi2 + 2 * 0.0143059 * lambda2),
|
|
deltayDeltaLambda = lambdaPhi * (2 * 0.0802894 + 4 * 0.000199025 * lambda2 + 2 * -0.02855 * phi2),
|
|
deltayDeltaPhi = 1.00384 + lambda2 * (0.0802894 + 0.000199025 * lambda2) + phi2 * (3 * (0.0998909 - 0.02855 * lambda2) - 5 * 0.0491032 * phi2),
|
|
denominator = deltaxDeltaPhi * deltayDeltaLambda - deltayDeltaPhi * deltaxDeltaLambda,
|
|
deltaLambda = (fy * deltaxDeltaPhi - fx * deltayDeltaPhi) / denominator,
|
|
deltaPhi = (fx * deltayDeltaLambda - fy * deltaxDeltaLambda) / denominator;
|
|
lambda -= deltaLambda, phi -= deltaPhi;
|
|
} while ((abs(deltaLambda) > epsilon || abs(deltaPhi) > epsilon) && --i > 0);
|
|
return i && [lambda, phi];
|
|
};
|
|
|
|
export default function() {
|
|
return projection(laskowskiRaw)
|
|
.scale(139.98);
|
|
}
|
|
|