计算两个GPS坐标点之间的距离,函数使用了 Haversine 公式来计算两点之间的距离,单位为米
function calcDistance(lat1, lon1, lat2, lon2) {
const R = 6371e3; // 地球半径
const φ1 = (lat1 * Math.PI) / 180; // 第一个点的纬度转化为弧度
const φ2 = (lat2 * Math.PI) / 180; // 第二个点的纬度转化为弧度
const Δφ = ((lat2 - lat1) * Math.PI) / 180; // 两点纬度之差转化为弧度
const Δλ = ((lon2 - lon1) * Math.PI) / 180; // 两点经度之差转化为弧度
const a =
Math.sin(Δφ / 2) * Math.sin(Δφ / 2) +
Math.cos(φ1) * Math.cos(φ2) * Math.sin(Δλ / 2) * Math.sin(Δλ / 2);
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
const distance = R * c; // 距离,单位为米
return distance;
}
计算两点对于正北方向的朝向角度,第二个点相对于第一个点的正北方向的角度
这个公式计算出的朝向角度是以正北方向为0度,顺时针旋转为正,逆时针旋转为负。如果需要以正南方向为0度,可以将计算结果加上180度,然后对360取模即可
function getAngle(lat1, lon1, lat2, lon2) {
const dLon = ((lon2 - lon1) * Math.PI) / 180;
const y = Math.sin(dLon) * Math.cos((lat2 * Math.PI) / 180);
const x =
Math.cos((lat1 * Math.PI) / 180) * Math.sin((lat2 * Math.PI) / 180) -
Math.sin((lat1 * Math.PI) / 180) *
Math.cos((lat2 * Math.PI) / 180) *
Math.cos(dLon);
const brng = (Math.atan2(y, x) * 180) / Math.PI;
const angle = (brng + 360) % 360;
return angle;
}
测试
const a = {
latitude: 45.539301,
longitude: 84.823943,
};
const b = {
latitude: 45.539285,
longitude: 84.823943,
};
console.log(
calcDistance(a.latitude, a.longitude, b.latitude, b.longitude),
getAngle(a.latitude, a.longitude, b.latitude, b.longitude)
);
// 输出结果:1.7791188265616218 180