inverseResampleJSON = function (projection, delta) {
const
maxDepth = 16,
radians = Math.PI/180,
dd = Math.tan(radians*delta/2) ** 2;
var resampleLineTo = function(
w0, u0,
w1, u1,
ll01,
depth, array) {
if (depth--) {
var
w2 = planar_midpoint(w0, w1),
λφ2 = projection.invert(...w2),
u2 = cartesian(λφ2),
ll02 = stereo_length2(u2, u0),
ll12 = stereo_length2(u2, u1),
AA = stereo_area2(u2, u0, u1),
hh = AA * (1 + 0.25*ll01)*(1 + 0.25*ll01) / (dd * ll01),
ww = 2 * ((ll02 - ll12) / ll01) * ((ll02 - ll12) / ll01);
if (((hh + ww > 1) & (ll02 + ll12 > dd)) | (ll02 + ll12 > 0.25)) {
resampleLineTo(w0, u0, w2, u2, ll02, depth, array);
array.push(λφ2);
resampleLineTo(w2, u2, w1, u1, ll12, depth, array);
}
}
}
var resampleChain = function(pointarray) {
let outarray = [];
let w0 = pointarray[0], λφ0 = projection.invert(...w0), u0 = cartesian(λφ0);
outarray.push(λφ0);
for (var i = 1, n = pointarray.length; i < n; i++) {
let w1 = pointarray[i], λφ1 = projection.invert(...w1), u1 = cartesian(λφ1);
resampleLineTo(w0, u0, w1, u1, stereo_length2(u0, u1), maxDepth, outarray)
outarray.push(λφ1);
w0 = w1, u0 = u1;
}
return outarray;
}
var project = w => projection.invert(...w);
var mapInPlace = fn => array => array.forEach((e, i) => array[i] = fn(e));
var convert, convertType = ({
Point: o => o.coordinates = project(o.coordinates),
MultiPoint: o => mapInPlace(project)(o.coordinates),
LineString: o => o.coordinates = resampleChain(o.coordinates),
Polygon: o => mapInPlace(resampleChain)(o.coordinates),
MultiLineString: o => mapInPlace(resampleChain)(o.coordinates),
MultiPolygon: o => o.coordinates.forEach(mapInPlace(resampleChain)),
Feature: o => convert(o.geometry),
GeometryCollection: o => o.geometries.forEach(convert),
FeatureCollection: o => o.features.forEach(convert),
});
convert = o => (convertType?.[o?.type]?.(o), o);
return function(json) {
json = JSON.parse(JSON.stringify(json));
return convert(json);
}
}