function geoWesternUsa (){
const epsilon = 1e-6
var cache,
cacheStream,
lower48 = d3.geoConicEqualArea()
.parallels([29.5, 45.5])
.scale(1070)
.translate([400, 269])
.rotate([108, 0])
.center([7, 38.7]),
lower48point,
alaska = d3.geoConicEqualArea().rotate([145, 0]).center([-4, 58.5]).parallels([55, 65]),
alaskaPoint,
hawaii = d3.geoConicEqualArea().rotate([157, 0]).center([-8, 19.9]).parallels([8, 18]),
hawaiiPoint,
point,
pointStream = {
point: (x,y) => {
point = [x, y]
}
}
function westernUsa(coordinatesarr) {
var [x, y] = coordinatesarr
return point = null,
(lower48point.point(x, y), point) ||
(alaskaPoint.point(x, y), point) ||
(hawaiiPoint.point(x, y), point)
}
function reset () {
cache = cacheStream = null
return westernUsa
}
westernUsa.invert = function(coordinatesarr) {
var k = lower48.scale(),
[xt, yt] = lower48.translate(),
[xc, yc] = coordinatesarr,
x = (xc - xt) / k,
y = (yc - yt) / 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(coordinatesarr)
}
westernUsa.stream = function(stream) {
return cache &&
(cacheStream === stream)
? cache
: cache = multiplex([
lower48.stream(cacheStream = stream),
alaska.stream(stream),
hawaii.stream(stream)
])
}
westernUsa.precision = function(_) {
if ( !arguments.length) {
return lower48.precision()
}
lower48.precision(_), alaska.precision(_), hawaii.precision(_)
return reset()
}
westernUsa.scale = function(k) {
if ( !arguments.length) {
return lower48.scale()
}
lower48.scale(k), alaska.scale(k * alaskascalar), hawaii.scale(k)
return westernUsa.translate(lower48.translate())
}
westernUsa.translate = function(t) {
if (!arguments.length) {
return lower48.translate()
}
var k = lower48.scale(),
[x, y] = t
x = +x
y = +y
lower48point = lower48
.translate([x + .25 * k, y])
.clipExtent(
[[x - 0.455 * k, y - 0.238 * k],
[x + 0.455 * k, y + 0.238 * k]])
.stream(pointStream)
alaskaPoint = alaska
.translate([x - 0.17 * k, y + 0.08 * k])
.clipExtent(
[[x - 1 * k + epsilon, y - k + epsilon],
[x - 0 * k - epsilon, y + k - epsilon]])
.stream(pointStream)
hawaiiPoint = hawaii
.translate([x - .190 * 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()
}
return westernUsa.scale(900)
}