From 717ed0cd6cc0a03d6f829b079e05bb301916343e Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Mon, 3 Oct 2016 13:32:49 -0700 Subject: [PATCH] Use cylindrical projection when appropriate. --- src/projection/conicEqualArea.js | 14 +++++--------- src/projection/cylindricalEqualArea.js | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 9 deletions(-) create mode 100644 src/projection/cylindricalEqualArea.js diff --git a/src/projection/conicEqualArea.js b/src/projection/conicEqualArea.js index de3aff5..c408bb1 100644 --- a/src/projection/conicEqualArea.js +++ b/src/projection/conicEqualArea.js @@ -1,18 +1,14 @@ import {abs, asin, atan2, cos, epsilon, sign, sin, sqrt} from "../math"; import {conicProjection} from "./conic"; +import {cylindricalEqualAreaRaw} from "./cylindricalEqualArea"; export function conicEqualAreaRaw(y0, y1) { - var sy0 = sin(y0), - n = (sy0 + sin(y1)) / 2, - c = 1 + sy0 * (2 * n - sy0); + var sy0 = sin(y0), n = (sy0 + sin(y1)) / 2; - // gracefully handle the limit case where the two standard parallels - // are symetrical with the Equator - if (abs(n) < epsilon) { - n = (n < 0 ? -1 : 1) * epsilon; - } + // Are the parallels symmetrical around the Equator? + if (abs(n) < epsilon) return cylindricalEqualAreaRaw(y0); - var r0 = sqrt(c) / n; + var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n; function project(x, y) { var r = sqrt(c - 2 * n * sin(y)) / n; diff --git a/src/projection/cylindricalEqualArea.js b/src/projection/cylindricalEqualArea.js new file mode 100644 index 0000000..3074818 --- /dev/null +++ b/src/projection/cylindricalEqualArea.js @@ -0,0 +1,15 @@ +import {asin, cos, sin} from "../math"; + +export function cylindricalEqualAreaRaw(phi0) { + var cosPhi0 = cos(phi0); + + function forward(lambda, phi) { + return [lambda * cosPhi0, sin(phi) / cosPhi0]; + } + + forward.invert = function(x, y) { + return [x / cosPhi0, asin(y * cosPhi0)]; + }; + + return forward; +}