|
import {atan, exp, halfPi, log, pi, tan, tau} from "../math.js"; |
|
import rotation from "../rotation.js"; |
|
import projection from "./index.js"; |
|
|
|
export function mercatorRaw(lambda, phi) { |
|
return [lambda, log(tan((halfPi + phi) / 2))]; |
|
} |
|
|
|
mercatorRaw.invert = function(x, y) { |
|
return [x, 2 * atan(exp(y)) - halfPi]; |
|
}; |
|
|
|
export default function() { |
|
return mercatorProjection(mercatorRaw) |
|
.scale(961 / tau); |
|
} |
|
|
|
export function mercatorProjection(project) { |
|
var m = projection(project), |
|
center = m.center, |
|
scale = m.scale, |
|
translate = m.translate, |
|
clipExtent = m.clipExtent, |
|
x0 = null, y0, x1, y1; |
|
|
|
m.scale = function(_) { |
|
return arguments.length ? (scale(_), reclip()) : scale(); |
|
}; |
|
|
|
m.translate = function(_) { |
|
return arguments.length ? (translate(_), reclip()) : translate(); |
|
}; |
|
|
|
m.center = function(_) { |
|
return arguments.length ? (center(_), reclip()) : center(); |
|
}; |
|
|
|
m.clipExtent = function(_) { |
|
return arguments.length ? ((_ == null ? x0 = y0 = x1 = y1 = null : (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1])), reclip()) : x0 == null ? null : [[x0, y0], [x1, y1]]; |
|
}; |
|
|
|
function reclip() { |
|
var k = pi * scale(), |
|
t = m(rotation(m.rotate()).invert([0, 0])); |
|
return clipExtent(x0 == null |
|
? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw |
|
? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]] |
|
: [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]); |
|
} |
|
|
|
return reclip(); |
|
} |
|
|