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.
41 lines
1.2 KiB
41 lines
1.2 KiB
import {geoProjection as projection} from "d3-geo";
|
|
import {abs, epsilon} from "./math.js";
|
|
|
|
// Based on Java implementation by Bojan Savric.
|
|
// https://github.com/OSUCartography/JMapProjLib/blob/master/src/com/jhlabs/map/proj/PattersonProjection.java
|
|
|
|
var pattersonK1 = 1.0148,
|
|
pattersonK2 = 0.23185,
|
|
pattersonK3 = -0.14499,
|
|
pattersonK4 = 0.02406,
|
|
pattersonC1 = pattersonK1,
|
|
pattersonC2 = 5 * pattersonK2,
|
|
pattersonC3 = 7 * pattersonK3,
|
|
pattersonC4 = 9 * pattersonK4,
|
|
pattersonYmax = 1.790857183;
|
|
|
|
export function pattersonRaw(lambda, phi) {
|
|
var phi2 = phi * phi;
|
|
return [
|
|
lambda,
|
|
phi * (pattersonK1 + phi2 * phi2 * (pattersonK2 + phi2 * (pattersonK3 + pattersonK4 * phi2)))
|
|
];
|
|
}
|
|
|
|
pattersonRaw.invert = function(x, y) {
|
|
if (y > pattersonYmax) y = pattersonYmax;
|
|
else if (y < -pattersonYmax) y = -pattersonYmax;
|
|
var yc = y, delta;
|
|
|
|
do { // Newton-Raphson
|
|
var y2 = yc * yc;
|
|
yc -= delta = ((yc * (pattersonK1 + y2 * y2 * (pattersonK2 + y2 * (pattersonK3 + pattersonK4 * y2)))) - y) / (pattersonC1 + y2 * y2 * (pattersonC2 + y2 * (pattersonC3 + pattersonC4 * y2)));
|
|
} while (abs(delta) > epsilon);
|
|
|
|
return [x, yc];
|
|
};
|
|
|
|
export default function() {
|
|
return projection(pattersonRaw)
|
|
.scale(139.319);
|
|
}
|
|
|