Haversine 公式计算两点间大圆距离(地球曲面距离)
Haversine 公式用于计算球面上两点间的最短距离(大圆距离)。
以米为单位的实现
function calculateDistance(lat1, lng1, lat2, lng2) {
const R = 6371000; // 地球半径,单位:米
const toRad = x => x * Math.PI / 180;
const dLat = toRad(lat2 - lat1);
const dLng = toRad(lng2 - lng1);
const a = Math.sin(dLat / 2) ** 2 +
Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) *
Math.sin(dLng / 2) ** 2;
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
const distance = R * c;
console.log('两点距离:', distance, '米');
return distance;
}
以公里为单位的实现
function calculateDistance(lat1, lng1, lat2, lng2) {
const R = 6371; // 地球半径,单位:公里
const toRad = x => x * Math.PI / 180;
const dLat = toRad(lat2 - lat1);
const dLng = toRad(lng2 - lng1);
const a = Math.sin(dLat / 2) ** 2 +
Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) *
Math.sin(dLng / 2) ** 2;
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
const distance = R * c; // 单位:公里
console.log('两点距离:', distance.toFixed(2), '公里');
return distance;
}
示例:计算用户与天安门的距离
const targetLat = 39.9087;
const targetLng = 116.3975;
function calculateToTiananmen(lat, lng) {
const km = calculateDistance(lat, lng, targetLat, targetLng);
alert(`您距离天安门还有 ${km.toFixed(2)} 公里`);
}
如果需要四舍五入或保留1-2位小数,可以使用.toFixed(2)方法。
Haversine 公式计算两点间大圆距离(地球曲面距离)
Haversine 公式用于计算球面上两点间的最短距离(大圆距离)。
以米为单位的实现
function calculateDistance(lat1, lng1, lat2, lng2) {
const R = 6371000; // 地球半径,单位:米
const toRad = x => x * Math.PI / 180;
const dLat = toRad(lat2 - lat1);
const dLng = toRad(lng2 - lng1);
const a = Math.sin(dLat / 2) ** 2 +
Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) *
Math.sin(dLng / 2) ** 2;
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
const distance = R * c;
console.log('两点距离:', distance, '米');
return distance;
}
以公里为单位的实现
function calculateDistance(lat1, lng1, lat2, lng2) {
const R = 6371; // 地球半径,单位:公里
const toRad = x => x * Math.PI / 180;
const dLat = toRad(lat2 - lat1);
const dLng = toRad(lng2 - lng1);
const a = Math.sin(dLat / 2) ** 2 +
Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) *
Math.sin(dLng / 2) ** 2;
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
const distance = R * c; // 单位:公里
console.log('两点距离:', distance.toFixed(2), '公里');
return distance;
}
示例:计算用户与天安门的距离
const targetLat = 39.9087;
const targetLng = 116.3975;
function calculateToTiananmen(lat, lng) {
const km = calculateDistance(lat, lng, targetLat, targetLng);
alert(`您距离天安门还有 ${km.toFixed(2)} 公里`);
}
如果需要四舍五入或保留1-2位小数,可以使用.toFixed(2)方法。