| import {abs, atan, atan2, cos, epsilon, halfPi, log, pi, pow, sign, sin, sqrt, tan} from "../math.js"; |
| import {conicProjection} from "./conic.js"; |
| import {mercatorRaw} from "./mercator.js"; |
|
|
| function tany(y) { |
| return tan((halfPi + y) / 2); |
| } |
|
|
| export function conicConformalRaw(y0, y1) { |
| var cy0 = cos(y0), |
| n = y0 === y1 ? sin(y0) : log(cy0 / cos(y1)) / log(tany(y1) / tany(y0)), |
| f = cy0 * pow(tany(y0), n) / n; |
|
|
| if (!n) return mercatorRaw; |
|
|
| function project(x, y) { |
| if (f > 0) { if (y < -halfPi + epsilon) y = -halfPi + epsilon; } |
| else { if (y > halfPi - epsilon) y = halfPi - epsilon; } |
| var r = f / pow(tany(y), n); |
| return [r * sin(n * x), f - r * cos(n * x)]; |
| } |
|
|
| project.invert = function(x, y) { |
| var fy = f - y, r = sign(n) * sqrt(x * x + fy * fy), |
| l = atan2(x, abs(fy)) * sign(fy); |
| if (fy * n < 0) |
| l -= pi * sign(x) * sign(fy); |
| return [l / n, 2 * atan(pow(f / r, 1 / n)) - halfPi]; |
| }; |
|
|
| return project; |
| } |
|
|
| export default function() { |
| return conicProjection(conicConformalRaw) |
| .scale(109.5) |
| .parallels([30, 30]); |
| } |
|
|