60 lines
1.8 KiB
JavaScript
60 lines
1.8 KiB
JavaScript
![]() |
import {geoEquirectangular, geoOrthographic} from "d3-geo";
|
||
|
import {asin, atan, degrees, radians, sin, tan} from "./math";
|
||
|
|
||
|
function gilbertForward(point) {
|
||
|
return [point[0] / 2, asin(tan(point[1] / 2 * radians)) * degrees];
|
||
|
}
|
||
|
|
||
|
function gilbertInvert(point) {
|
||
|
return [point[0] * 2, 2 * atan(sin(point[1] * radians)) * degrees];
|
||
|
}
|
||
|
|
||
|
export default function(projectionType) {
|
||
|
if (projectionType == null) projectionType = geoOrthographic;
|
||
|
var projection = projectionType(),
|
||
|
equirectangular = geoEquirectangular().scale(degrees).precision(0).clipAngle(null).translate([0, 0]); // antimeridian cutting
|
||
|
|
||
|
function gilbert(point) {
|
||
|
return projection(gilbertForward(point));
|
||
|
}
|
||
|
|
||
|
if (projection.invert) gilbert.invert = function(point) {
|
||
|
return gilbertInvert(projection.invert(point));
|
||
|
};
|
||
|
|
||
|
gilbert.stream = function(stream) {
|
||
|
var s1 = projection.stream(stream), s0 = equirectangular.stream({
|
||
|
point: function(lambda, phi) { s1.point(lambda / 2, asin(tan(-phi / 2 * radians)) * degrees); },
|
||
|
lineStart: function() { s1.lineStart(); },
|
||
|
lineEnd: function() { s1.lineEnd(); },
|
||
|
polygonStart: function() { s1.polygonStart(); },
|
||
|
polygonEnd: function() { s1.polygonEnd(); }
|
||
|
});
|
||
|
s0.sphere = s1.sphere;
|
||
|
return s0;
|
||
|
};
|
||
|
|
||
|
function property(name) {
|
||
|
gilbert[name] = function(_) {
|
||
|
return arguments.length ? (projection[name](_), gilbert) : projection[name]();
|
||
|
};
|
||
|
}
|
||
|
|
||
|
gilbert.rotate = function(_) {
|
||
|
return arguments.length ? (equirectangular.rotate(_), gilbert) : equirectangular.rotate();
|
||
|
};
|
||
|
|
||
|
gilbert.center = function(_) {
|
||
|
return arguments.length ? (projection.center(gilbertForward(_)), gilbert) : gilbertInvert(projection.center());
|
||
|
};
|
||
|
|
||
|
property("clipAngle");
|
||
|
property("clipExtent");
|
||
|
property("scale");
|
||
|
property("translate");
|
||
|
property("precision");
|
||
|
|
||
|
return gilbert
|
||
|
.scale(249.5);
|
||
|
}
|