|
- import {geoEquirectangular, geoOrthographic} from "d3-geo";
- import {asin, atan, degrees, radians, sin, tan} from "./math.js";
-
- 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].apply(projection, arguments), 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("angle");
- property("clipAngle");
- property("clipExtent");
- property("fitExtent");
- property("fitHeight");
- property("fitSize");
- property("fitWidth");
- property("scale");
- property("translate");
- property("precision");
-
- return gilbert
- .scale(249.5);
- }
|