This commit is contained in:
Jason Davies 2013-02-18 12:50:11 +00:00
Родитель 4648db5bdd
Коммит 4ce9bffe91
5 изменённых файлов: 105 добавлений и 10 удалений

19
d3.js поставляемый
Просмотреть файл

@ -5475,6 +5475,7 @@ d3 = function() {
var alaska = d3.geo.albers().rotate([ 160, 0 ]).center([ 0, 60 ]).parallels([ 55, 65 ]);
var hawaii = d3.geo.albers().rotate([ 160, 0 ]).center([ 0, 20 ]).parallels([ 8, 18 ]);
var puertoRico = d3.geo.albers().rotate([ 60, 0 ]).center([ 0, 10 ]).parallels([ 8, 18 ]);
var alaskaInvert, hawaiiInvert, puertoRicoInvert;
function albersUsa(coordinates) {
return projection(coordinates)(coordinates);
}
@ -5482,6 +5483,9 @@ d3 = function() {
var lon = point[0], lat = point[1];
return lat > 50 ? alaska : lon < -140 ? hawaii : lat < 21 ? puertoRico : lower48;
}
albersUsa.invert = function(coordinates) {
return alaskaInvert(coordinates) || hawaiiInvert(coordinates) || puertoRicoInvert(coordinates) || lower48.invert(coordinates);
};
albersUsa.scale = function(x) {
if (!arguments.length) return lower48.scale();
lower48.scale(x);
@ -5497,10 +5501,25 @@ d3 = function() {
alaska.translate([ dx - .4 * dz, dy + .17 * dz ]);
hawaii.translate([ dx - .19 * dz, dy + .2 * dz ]);
puertoRico.translate([ dx + .58 * dz, dy + .43 * dz ]);
alaskaInvert = d3_geo_albersUsaInvert(alaska, [ [ -180, 50 ], [ -130, 72 ] ]);
hawaiiInvert = d3_geo_albersUsaInvert(hawaii, [ [ -164, 18 ], [ -154, 24 ] ]);
puertoRicoInvert = d3_geo_albersUsaInvert(puertoRico, [ [ -67.5, 17.5 ], [ -65, 19 ] ]);
return albersUsa;
};
return albersUsa.scale(lower48.scale());
};
function d3_geo_albersUsaInvert(projection, extent) {
var a = projection(extent[0]), b = projection([ .5 * (extent[0][0] + extent[1][0]), extent[0][1] ]), c = projection([ extent[1][0], extent[0][1] ]), d = projection(extent[1]);
var dya = b[1] - a[1], dxa = b[0] - a[0], dyb = c[1] - b[1], dxb = c[0] - b[0];
var ma = dya / dxa, mb = dyb / dxb;
var cx = .5 * (ma * mb * (a[1] - c[1]) + mb * (a[0] + b[0]) - ma * (b[0] + c[0])) / (mb - ma), cy = (.5 * (a[0] + b[0]) - cx) / ma + .5 * (a[1] + b[1]);
var dx0 = d[0] - cx, dy0 = d[1] - cy, dx1 = a[0] - cx, dy1 = a[1] - cy, r0 = dx0 * dx0 + dy0 * dy0, r1 = dx1 * dx1 + dy1 * dy1;
var a0 = Math.atan2(dy0, dx0), a1 = Math.atan2(dy1, dx1);
return function(coordinates) {
var dx = coordinates[0] - cx, dy = coordinates[1] - cy, r = dx * dx + dy * dy, a = Math.atan2(dy, dx);
if (r0 < r && r < r1 && a0 < a && a < a1) return projection.invert(coordinates);
};
}
function d3_geo_albers(φ0, φ1) {
var sinφ0 = Math.sin(φ0), n = (sinφ0 + Math.sin(φ1)) / 2, C = 1 + sinφ0 * (2 * n - sinφ0), ρ0 = Math.sqrt(C) / n;
function albers(λ, φ) {

8
d3.min.js поставляемый

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -1,6 +1,4 @@
// TODO composite invert
// A composite projection for the United States, 960x500. The set of standard
// A composite projection for the United States, 960×500. The set of standard
// parallels for each region comes from USGS, which is published here:
// http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers
d3.geo.albersUsa = function() {
@ -21,6 +19,10 @@ d3.geo.albersUsa = function() {
.center([0, 10])
.parallels([8, 18]);
var alaskaInvert,
hawaiiInvert,
puertoRicoInvert;
function albersUsa(coordinates) {
return projection(coordinates)(coordinates);
}
@ -34,6 +36,10 @@ d3.geo.albersUsa = function() {
: lower48;
}
albersUsa.invert = function(coordinates) {
return alaskaInvert(coordinates) || hawaiiInvert(coordinates) || puertoRicoInvert(coordinates) || lower48.invert(coordinates);
};
albersUsa.scale = function(x) {
if (!arguments.length) return lower48.scale();
lower48.scale(x);
@ -52,8 +58,52 @@ d3.geo.albersUsa = function() {
alaska.translate([dx - .40 * dz, dy + .17 * dz]);
hawaii.translate([dx - .19 * dz, dy + .20 * dz]);
puertoRico.translate([dx + .58 * dz, dy + .43 * dz]);
alaskaInvert = d3_geo_albersUsaInvert(alaska, [[-180, 50], [-130, 72]]);
hawaiiInvert = d3_geo_albersUsaInvert(hawaii, [[-164, 18], [-154, 24]]);
puertoRicoInvert = d3_geo_albersUsaInvert(puertoRico, [[-67.5, 17.5], [-65, 19]]);
return albersUsa;
};
return albersUsa.scale(lower48.scale());
};
function d3_geo_albersUsaInvert(projection, extent) {
var a = projection(extent[0]),
b = projection([.5 * (extent[0][0] + extent[1][0]), extent[0][1]]),
c = projection([extent[1][0], extent[0][1]]),
d = projection(extent[1]);
var dya = b[1]- a[1],
dxa = b[0]- a[0],
dyb = c[1]- b[1],
dxb = c[0]- b[0];
var ma = dya / dxa,
mb = dyb / dxb;
// Find center of circle going through points [a, b, c].
var cx = .5 * (ma * mb * (a[1] - c[1]) + mb * (a[0] + b[0]) - ma * (b[0] + c[0])) / (mb - ma),
cy = (.5 * (a[0] + b[0]) - cx) / ma + .5 * (a[1] + b[1]);
// Radial distance² from center.
var dx0 = d[0] - cx,
dy0 = d[1] - cy,
dx1 = a[0] - cx,
dy1 = a[1] - cy,
r0 = dx0 * dx0 + dy0 * dy0,
r1 = dx1 * dx1 + dy1 * dy1;
// Angular extent.
var a0 = Math.atan2(dy0, dx0),
a1 = Math.atan2(dy1, dx1);
return function(coordinates) {
var dx = coordinates[0] - cx,
dy = coordinates[1] - cy,
r = dx * dx + dy * dy,
a = Math.atan2(dy, dx);
if (r0 < r && r < r1 && a0 < a && a < a1) return projection.invert(coordinates);
};
}

Просмотреть файл

@ -7,9 +7,7 @@ var suite = vows.describe("d3.geo.albers");
suite.addBatch({
"albers": {
topic: function() {
return d3.geo.albers();
},
topic: d3.geo.albers,
"Arctic": function(albers) {
var coords = albers([0, 85]);
assert.inDelta(coords[0], 1031.393796, 1e-6);

Просмотреть файл

@ -0,0 +1,28 @@
require("../env");
var vows = require("vows"),
assert = require("assert");
var suite = vows.describe("d3.geo.albersUsa");
suite.addBatch({
"albersUsa": {
topic: d3.geo.albersUsa,
"Washington": equalInverse([-120.5, 47.5], [215.478997, 51.976493]),
"San Francisco": equalInverse([-122.42, 37.78], [150.072677, 211.257829]),
"Juneau, Alaska": equalInverse([-134.22, 58.43], [217.366590, 409.498517]),
"Honolulu, Hawaii": equalInverse([-157.82, 21.30], [325.696002, 427.278824]),
"San Juan, Puerto Rico": equalInverse([-66.07, 18.45], [909.159250, 456.394827])
}
});
suite.export(module);
function equalInverse(location, point) {
return function(projection) {
var projected;
assert.inDelta(projected = projection(location), point, 1e-6);
assert.inDelta(projection.invert(projected), location, 1e-6);
assert.inDelta(projection(projection.invert(point)), point, 1e-6);
};
};