DebasishDhal99's picture
Add sidebar on upper left to select units and collapse the geodistance feature
7e40962
raw
history blame
1.52 kB
// Haversine-based geodesic interpolator
function generateGeodesicPoints(lat1, lon1, lat2, lon2, numPoints = 512) {
/**
* Generates a series of points along the geodesic path between two geographic coordinates, using Haversine function.
* @returns {Array} An array of points, each represented as [latitude, longitude].
*/
const toRad = deg => deg * Math.PI / 180;
const toDeg = rad => rad * 180 / Math.PI;
const1 = toRad(lat1);
const1 = toRad(lon1);
const2 = toRad(lat2);
const2 = toRad(lon2);
const 螖 = 2 * Math.asin(
Math.sqrt(
Math.sin((蠁2 - 蠁1) / 2) ** 2 +
Math.cos(蠁1) * Math.cos(蠁2) *
Math.sin((位2 - 位1) / 2) ** 2
)
);
if (螖 === 0) return [[lat1, lon1]];
const sin螖 = Math.sin(螖);
const points = [];
for (let i = 0; i <= numPoints; i++) {
const f = i / numPoints;
const A = Math.sin((1 - f) * 螖) / sin螖;
const B = Math.sin(f * 螖) / sin螖;
const x = A * Math.cos(蠁1) * Math.cos(位1) + B * Math.cos(蠁2) * Math.cos(位2);
const y = A * Math.cos(蠁1) * Math.sin(位1) + B * Math.cos(蠁2) * Math.sin(位2);
const z = A * Math.sin(蠁1) + B * Math.sin(蠁2);
const 蠁i = Math.atan2(z, Math.sqrt(x * x + y * y));
const 位i = Math.atan2(y, x);
points.push([toDeg(蠁i), toDeg(位i)]);
}
return points;
}
export default generateGeodesicPoints;