| 1 | import {abs, atan, atan2, cos, epsilon, halfPi, log, pi, pow, sign, sin, sqrt, tan} from "../math.js";
|
|---|
| 2 | import {conicProjection} from "./conic.js";
|
|---|
| 3 | import {mercatorRaw} from "./mercator.js";
|
|---|
| 4 |
|
|---|
| 5 | function tany(y) {
|
|---|
| 6 | return tan((halfPi + y) / 2);
|
|---|
| 7 | }
|
|---|
| 8 |
|
|---|
| 9 | export function conicConformalRaw(y0, y1) {
|
|---|
| 10 | var cy0 = cos(y0),
|
|---|
| 11 | n = y0 === y1 ? sin(y0) : log(cy0 / cos(y1)) / log(tany(y1) / tany(y0)),
|
|---|
| 12 | f = cy0 * pow(tany(y0), n) / n;
|
|---|
| 13 |
|
|---|
| 14 | if (!n) return mercatorRaw;
|
|---|
| 15 |
|
|---|
| 16 | function project(x, y) {
|
|---|
| 17 | if (f > 0) { if (y < -halfPi + epsilon) y = -halfPi + epsilon; }
|
|---|
| 18 | else { if (y > halfPi - epsilon) y = halfPi - epsilon; }
|
|---|
| 19 | var r = f / pow(tany(y), n);
|
|---|
| 20 | return [r * sin(n * x), f - r * cos(n * x)];
|
|---|
| 21 | }
|
|---|
| 22 |
|
|---|
| 23 | project.invert = function(x, y) {
|
|---|
| 24 | var fy = f - y, r = sign(n) * sqrt(x * x + fy * fy),
|
|---|
| 25 | l = atan2(x, abs(fy)) * sign(fy);
|
|---|
| 26 | if (fy * n < 0)
|
|---|
| 27 | l -= pi * sign(x) * sign(fy);
|
|---|
| 28 | return [l / n, 2 * atan(pow(f / r, 1 / n)) - halfPi];
|
|---|
| 29 | };
|
|---|
| 30 |
|
|---|
| 31 | return project;
|
|---|
| 32 | }
|
|---|
| 33 |
|
|---|
| 34 | export default function() {
|
|---|
| 35 | return conicProjection(conicConformalRaw)
|
|---|
| 36 | .scale(109.5)
|
|---|
| 37 | .parallels([30, 30]);
|
|---|
| 38 | }
|
|---|