-
Notifications
You must be signed in to change notification settings - Fork 202
/
Copy pathpatterson.js
41 lines (34 loc) · 1.24 KB
/
patterson.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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);
}