modules/geo/raw_mercator.js (20 lines of code) (raw):
import {
geoMercatorRaw as d3_geoMercatorRaw,
geoTransform as d3_geoTransform
} from 'd3-geo';
import {
zoomIdentity as d3_zoomIdentity
} from 'd3-zoom';
/*
Bypasses features of D3's default projection stream pipeline that are unnecessary:
* Antimeridian clipping
* Spherical rotation
* Resampling
*/
export function geoRawMercator() {
var project = d3_geoMercatorRaw;
var k = 512 / Math.PI; // scale
var x = 0;
var y = 0; // translate
var clipExtent = [[0, 0], [0, 0]];
function projection(point) {
point = project(point[0] * Math.PI / 180, point[1] * Math.PI / 180);
return [point[0] * k + x, y - point[1] * k];
}
projection.invert = function(point) {
point = project.invert((point[0] - x) / k, (y - point[1]) / k);
return point && [point[0] * 180 / Math.PI, point[1] * 180 / Math.PI];
};
projection.scale = function(_) {
if (!arguments.length) return k;
k = +_;
return projection;
};
projection.translate = function(_) {
if (!arguments.length) return [x, y];
x = +_[0];
y = +_[1];
return projection;
};
projection.clipExtent = function(_) {
if (!arguments.length) return clipExtent;
clipExtent = _;
return projection;
};
projection.transform = function(obj) {
if (!arguments.length) return d3_zoomIdentity.translate(x, y).scale(k);
x = +obj.x;
y = +obj.y;
k = +obj.k;
return projection;
};
projection.stream = d3_geoTransform({
point: function(x, y) {
var vec = projection([x, y]);
this.stream.point(vec[0], vec[1]);
}
}).stream;
return projection;
}