You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
3.0 KiB
105 lines
3.0 KiB
import {range} from "d3-array"; |
|
import {abs, ceil, epsilon} from "./math"; |
|
|
|
function graticuleX(y0, y1, dy) { |
|
var y = range(y0, y1 - epsilon, dy).concat(y1); |
|
return function(x) { return y.map(function(y) { return [x, y]; }); }; |
|
} |
|
|
|
function graticuleY(x0, x1, dx) { |
|
var x = range(x0, x1 - epsilon, dx).concat(x1); |
|
return function(y) { return x.map(function(x) { return [x, y]; }); }; |
|
} |
|
|
|
export default function graticule() { |
|
var x1, x0, X1, X0, |
|
y1, y0, Y1, Y0, |
|
dx = 10, dy = dx, DX = 90, DY = 360, |
|
x, y, X, Y, |
|
precision = 2.5; |
|
|
|
function graticule() { |
|
return {type: "MultiLineString", coordinates: lines()}; |
|
} |
|
|
|
function lines() { |
|
return range(ceil(X0 / DX) * DX, X1, DX).map(X) |
|
.concat(range(ceil(Y0 / DY) * DY, Y1, DY).map(Y)) |
|
.concat(range(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return abs(x % DX) > epsilon; }).map(x)) |
|
.concat(range(ceil(y0 / dy) * dy, y1, dy).filter(function(y) { return abs(y % DY) > epsilon; }).map(y)); |
|
} |
|
|
|
graticule.lines = function() { |
|
return lines().map(function(coordinates) { return {type: "LineString", coordinates: coordinates}; }); |
|
}; |
|
|
|
graticule.outline = function() { |
|
return { |
|
type: "Polygon", |
|
coordinates: [ |
|
X(X0).concat( |
|
Y(Y1).slice(1), |
|
X(X1).reverse().slice(1), |
|
Y(Y0).reverse().slice(1)) |
|
] |
|
}; |
|
}; |
|
|
|
graticule.extent = function(_) { |
|
if (!arguments.length) return graticule.extentMinor(); |
|
return graticule.extentMajor(_).extentMinor(_); |
|
}; |
|
|
|
graticule.extentMajor = function(_) { |
|
if (!arguments.length) return [[X0, Y0], [X1, Y1]]; |
|
X0 = +_[0][0], X1 = +_[1][0]; |
|
Y0 = +_[0][1], Y1 = +_[1][1]; |
|
if (X0 > X1) _ = X0, X0 = X1, X1 = _; |
|
if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _; |
|
return graticule.precision(precision); |
|
}; |
|
|
|
graticule.extentMinor = function(_) { |
|
if (!arguments.length) return [[x0, y0], [x1, y1]]; |
|
x0 = +_[0][0], x1 = +_[1][0]; |
|
y0 = +_[0][1], y1 = +_[1][1]; |
|
if (x0 > x1) _ = x0, x0 = x1, x1 = _; |
|
if (y0 > y1) _ = y0, y0 = y1, y1 = _; |
|
return graticule.precision(precision); |
|
}; |
|
|
|
graticule.step = function(_) { |
|
if (!arguments.length) return graticule.stepMinor(); |
|
return graticule.stepMajor(_).stepMinor(_); |
|
}; |
|
|
|
graticule.stepMajor = function(_) { |
|
if (!arguments.length) return [DX, DY]; |
|
DX = +_[0], DY = +_[1]; |
|
return graticule; |
|
}; |
|
|
|
graticule.stepMinor = function(_) { |
|
if (!arguments.length) return [dx, dy]; |
|
dx = +_[0], dy = +_[1]; |
|
return graticule; |
|
}; |
|
|
|
graticule.precision = function(_) { |
|
if (!arguments.length) return precision; |
|
precision = +_; |
|
x = graticuleX(y0, y1, 90); |
|
y = graticuleY(x0, x1, precision); |
|
X = graticuleX(Y0, Y1, 90); |
|
Y = graticuleY(X0, X1, precision); |
|
return graticule; |
|
}; |
|
|
|
return graticule |
|
.extentMajor([[-180, -90 + epsilon], [180, 90 - epsilon]]) |
|
.extentMinor([[-180, -80 - epsilon], [180, 80 + epsilon]]); |
|
} |
|
|
|
export function graticule10() { |
|
return graticule()(); |
|
}
|
|
|