|
import {epsilon} from "../math.js"; |
|
import albers from "./albers.js"; |
|
import conicEqualArea from "./conicEqualArea.js"; |
|
import {fitExtent, fitSize, fitWidth, fitHeight} from "./fit.js"; |
|
|
|
|
|
|
|
function multiplex(streams) { |
|
var n = streams.length; |
|
return { |
|
point: function(x, y) { var i = -1; while (++i < n) streams[i].point(x, y); }, |
|
sphere: function() { var i = -1; while (++i < n) streams[i].sphere(); }, |
|
lineStart: function() { var i = -1; while (++i < n) streams[i].lineStart(); }, |
|
lineEnd: function() { var i = -1; while (++i < n) streams[i].lineEnd(); }, |
|
polygonStart: function() { var i = -1; while (++i < n) streams[i].polygonStart(); }, |
|
polygonEnd: function() { var i = -1; while (++i < n) streams[i].polygonEnd(); } |
|
}; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
export default function() { |
|
var cache, |
|
cacheStream, |
|
lower48 = albers(), lower48Point, |
|
alaska = conicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, |
|
hawaii = conicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, |
|
point, pointStream = {point: function(x, y) { point = [x, y]; }}; |
|
|
|
function albersUsa(coordinates) { |
|
var x = coordinates[0], y = coordinates[1]; |
|
return point = null, |
|
(lower48Point.point(x, y), point) |
|
|| (alaskaPoint.point(x, y), point) |
|
|| (hawaiiPoint.point(x, y), point); |
|
} |
|
|
|
albersUsa.invert = function(coordinates) { |
|
var k = lower48.scale(), |
|
t = lower48.translate(), |
|
x = (coordinates[0] - t[0]) / k, |
|
y = (coordinates[1] - t[1]) / k; |
|
return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska |
|
: y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii |
|
: lower48).invert(coordinates); |
|
}; |
|
|
|
albersUsa.stream = function(stream) { |
|
return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]); |
|
}; |
|
|
|
albersUsa.precision = function(_) { |
|
if (!arguments.length) return lower48.precision(); |
|
lower48.precision(_), alaska.precision(_), hawaii.precision(_); |
|
return reset(); |
|
}; |
|
|
|
albersUsa.scale = function(_) { |
|
if (!arguments.length) return lower48.scale(); |
|
lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_); |
|
return albersUsa.translate(lower48.translate()); |
|
}; |
|
|
|
albersUsa.translate = function(_) { |
|
if (!arguments.length) return lower48.translate(); |
|
var k = lower48.scale(), x = +_[0], y = +_[1]; |
|
|
|
lower48Point = lower48 |
|
.translate(_) |
|
.clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]]) |
|
.stream(pointStream); |
|
|
|
alaskaPoint = alaska |
|
.translate([x - 0.307 * k, y + 0.201 * k]) |
|
.clipExtent([[x - 0.425 * k + epsilon, y + 0.120 * k + epsilon], [x - 0.214 * k - epsilon, y + 0.234 * k - epsilon]]) |
|
.stream(pointStream); |
|
|
|
hawaiiPoint = hawaii |
|
.translate([x - 0.205 * k, y + 0.212 * k]) |
|
.clipExtent([[x - 0.214 * k + epsilon, y + 0.166 * k + epsilon], [x - 0.115 * k - epsilon, y + 0.234 * k - epsilon]]) |
|
.stream(pointStream); |
|
|
|
return reset(); |
|
}; |
|
|
|
albersUsa.fitExtent = function(extent, object) { |
|
return fitExtent(albersUsa, extent, object); |
|
}; |
|
|
|
albersUsa.fitSize = function(size, object) { |
|
return fitSize(albersUsa, size, object); |
|
}; |
|
|
|
albersUsa.fitWidth = function(width, object) { |
|
return fitWidth(albersUsa, width, object); |
|
}; |
|
|
|
albersUsa.fitHeight = function(height, object) { |
|
return fitHeight(albersUsa, height, object); |
|
}; |
|
|
|
function reset() { |
|
cache = cacheStream = null; |
|
return albersUsa; |
|
} |
|
|
|
return albersUsa.scale(1070); |
|
} |
|
|