coordEach(geojson, function (coord) { var originalDistance = rhumbDistance(origin, coord); var bearing = rhumbBearing(origin, coord); var newDistance = originalDistance * factor; var newCoord = getCoords(rhumbDestination(origin, newDistance, bearing)); coord[0] = newCoord[0]; coord[1] = newCoord[1]; if (coord.length === 3) coord[2] *= factor; });
/** * Returns the distance between a point P on a segment AB, on Mercator projection * * @private * @param {Array<number>} a first segment point * @param {Array<number>} b second segment point * @param {Array<number>} p external point * @param {Object} [options={}] Optional parameters * @param {string} [options.units='kilometers'] can be degrees, radians, miles, or kilometers * @returns {number} distance */ function mercatorPH(a, b, p, options) { var delta = 0; // translate points if any is crossing the 180th meridian if (Math.abs(a[0]) >= 180 || Math.abs(b[0]) >= 180 || Math.abs(p[0]) >= 180) { delta = (a[0] > 0 || b[0] > 0 || p[0] > 0) ? -180 : 180; } var origin = point(p); var A = toMercator([a[0] + delta, a[1]]); var B = toMercator([b[0] + delta, b[1]]); var P = toMercator([p[0] + delta, p[1]]); var h = toWgs84(euclideanIntersection(A, B, P)); if (delta !== 0) h[0] -= delta; // translate back to original position var distancePH = rhumbDistance(origin, h, options); return distancePH; }