|
6 | 6 | * LICENSE file in the root directory of this source tree.
|
7 | 7 | */
|
8 | 8 |
|
9 |
| -/** |
10 |
| - * Forked from https://github.com/d3/d3-geo-projection |
11 |
| - * Pasted from https://github.com/etpinard/d3-geo-projection |
| 9 | +/* |
| 10 | + * Generated by https://github.com/etpinard/d3-geo-projection-picker |
12 | 11 | *
|
13 |
| - * Containing only the 'most useful' projection types |
14 |
| - * and compatible with CommonJs |
| 12 | + * which is hand-picks projection from https://github.com/d3/d3-geo-projection |
15 | 13 | *
|
| 14 | + * into a CommonJS require-able module. |
16 | 15 | */
|
17 | 16 |
|
18 |
| -var d3 = require('d3'); |
| 17 | +'use strict'; |
19 | 18 |
|
20 |
| -function addProjectionToD3() { |
| 19 | +function addProjectionsToD3(d3) { |
21 | 20 | d3.geo.project = function(object, projection) {
|
22 | 21 | var stream = projection.stream;
|
23 | 22 | if (!stream) throw new Error("not yet supported");
|
@@ -78,7 +77,7 @@ function addProjectionToD3() {
|
78 | 77 | d3_geo_projectPoints.push([ x, y ]);
|
79 | 78 | },
|
80 | 79 | lineEnd: function() {
|
81 |
| - if (d3_geo_projectPoints.length) d3_geo_projectLines.push(d3_geo_projectPoints), |
| 80 | + if (d3_geo_projectPoints.length) d3_geo_projectLines.push(d3_geo_projectPoints), |
82 | 81 | d3_geo_projectPoints = [];
|
83 | 82 | },
|
84 | 83 | result: function() {
|
@@ -205,7 +204,7 @@ function addProjectionToD3() {
|
205 | 204 | };
|
206 | 205 | var projection = d3.geo.projection(forward), stream_ = projection.stream;
|
207 | 206 | projection.stream = function(stream) {
|
208 |
| - var rotate = projection.rotate(), rotateStream = stream_(stream), sphereStream = (projection.rotate([ 0, 0 ]), |
| 207 | + var rotate = projection.rotate(), rotateStream = stream_(stream), sphereStream = (projection.rotate([ 0, 0 ]), |
209 | 208 | stream_(stream));
|
210 | 209 | projection.rotate(rotate);
|
211 | 210 | rotateStream.sphere = function() {
|
@@ -405,6 +404,39 @@ function addProjectionToD3() {
|
405 | 404 | (d3.geo.sinusoidal = function() {
|
406 | 405 | return projection(sinusoidal);
|
407 | 406 | }).raw = sinusoidal;
|
| 407 | + function aitoff(λ, φ) { |
| 408 | + var cosφ = Math.cos(φ), sinciα = sinci(acos(cosφ * Math.cos(λ /= 2))); |
| 409 | + return [ 2 * cosφ * Math.sin(λ) * sinciα, Math.sin(φ) * sinciα ]; |
| 410 | + } |
| 411 | + aitoff.invert = function(x, y) { |
| 412 | + if (x * x + 4 * y * y > π * π + ε) return; |
| 413 | + var λ = x, φ = y, i = 25; |
| 414 | + do { |
| 415 | + var sinλ = Math.sin(λ), sinλ_2 = Math.sin(λ / 2), cosλ_2 = Math.cos(λ / 2), sinφ = Math.sin(φ), cosφ = Math.cos(φ), sin_2φ = Math.sin(2 * φ), sin2φ = sinφ * sinφ, cos2φ = cosφ * cosφ, sin2λ_2 = sinλ_2 * sinλ_2, C = 1 - cos2φ * cosλ_2 * cosλ_2, E = C ? acos(cosφ * cosλ_2) * Math.sqrt(F = 1 / C) : F = 0, F, fx = 2 * E * cosφ * sinλ_2 - x, fy = E * sinφ - y, δxδλ = F * (cos2φ * sin2λ_2 + E * cosφ * cosλ_2 * sin2φ), δxδφ = F * (.5 * sinλ * sin_2φ - E * 2 * sinφ * sinλ_2), δyδλ = F * .25 * (sin_2φ * sinλ_2 - E * sinφ * cos2φ * sinλ), δyδφ = F * (sin2φ * cosλ_2 + E * sin2λ_2 * cosφ), denominator = δxδφ * δyδλ - δyδφ * δxδλ; |
| 416 | + if (!denominator) break; |
| 417 | + var δλ = (fy * δxδφ - fx * δyδφ) / denominator, δφ = (fx * δyδλ - fy * δxδλ) / denominator; |
| 418 | + λ -= δλ, φ -= δφ; |
| 419 | + } while ((Math.abs(δλ) > ε || Math.abs(δφ) > ε) && --i > 0); |
| 420 | + return [ λ, φ ]; |
| 421 | + }; |
| 422 | + (d3.geo.aitoff = function() { |
| 423 | + return projection(aitoff); |
| 424 | + }).raw = aitoff; |
| 425 | + function winkel3(λ, φ) { |
| 426 | + var coordinates = aitoff(λ, φ); |
| 427 | + return [ (coordinates[0] + λ / halfπ) / 2, (coordinates[1] + φ) / 2 ]; |
| 428 | + } |
| 429 | + winkel3.invert = function(x, y) { |
| 430 | + var λ = x, φ = y, i = 25; |
| 431 | + do { |
| 432 | + var cosφ = Math.cos(φ), sinφ = Math.sin(φ), sin_2φ = Math.sin(2 * φ), sin2φ = sinφ * sinφ, cos2φ = cosφ * cosφ, sinλ = Math.sin(λ), cosλ_2 = Math.cos(λ / 2), sinλ_2 = Math.sin(λ / 2), sin2λ_2 = sinλ_2 * sinλ_2, C = 1 - cos2φ * cosλ_2 * cosλ_2, E = C ? acos(cosφ * cosλ_2) * Math.sqrt(F = 1 / C) : F = 0, F, fx = .5 * (2 * E * cosφ * sinλ_2 + λ / halfπ) - x, fy = .5 * (E * sinφ + φ) - y, δxδλ = .5 * F * (cos2φ * sin2λ_2 + E * cosφ * cosλ_2 * sin2φ) + .5 / halfπ, δxδφ = F * (sinλ * sin_2φ / 4 - E * sinφ * sinλ_2), δyδλ = .125 * F * (sin_2φ * sinλ_2 - E * sinφ * cos2φ * sinλ), δyδφ = .5 * F * (sin2φ * cosλ_2 + E * sin2λ_2 * cosφ) + .5, denominator = δxδφ * δyδλ - δyδφ * δxδλ, δλ = (fy * δxδφ - fx * δyδφ) / denominator, δφ = (fx * δyδλ - fy * δxδλ) / denominator; |
| 433 | + λ -= δλ, φ -= δφ; |
| 434 | + } while ((Math.abs(δλ) > ε || Math.abs(δφ) > ε) && --i > 0); |
| 435 | + return [ λ, φ ]; |
| 436 | + }; |
| 437 | + (d3.geo.winkel3 = function() { |
| 438 | + return projection(winkel3); |
| 439 | + }).raw = winkel3; |
408 | 440 | }
|
409 | 441 |
|
410 |
| -module.exports = addProjectionToD3; |
| 442 | +module.exports = addProjectionsToD3; |
0 commit comments