js 经纬度计算两地之间的距离(原理与方法)
封面图
•
2025-10-19
•
JavaScript
179
0
0
0
在 JavaScript 中计算两个经纬度之间的距离,通常使用 **Haversine 公式**。这个公式可以准确地计算地球表面上两点之间的最短距离(大圆弧距离),适用于大多数地理定位场景。 --- ## ✅ 一、原理:Haversine 公式 Haversine 公式基于球面三角学,用于计算两个点之间的直线距离(即大圆距离)。 ### 公式: $$ a = \sin^2\left(\frac{\Delta \phi}{2}\right) + \cos(\phi_1) \cdot \cos(\phi_2) \cdot \sin^2\left(\frac{\Delta \lambda}{2}\right) $$ $$ c = 2 \cdot \text{atan2}\left( \sqrt{a}, \sqrt{1-a} \right) $$ $$ d = R \cdot c $$ - $\phi_1, \phi_2$ 是两个点的纬度(以弧度为单位) - $\lambda_1, \lambda_2$ 是两个点的经度(以弧度为单位) - $\Delta \phi = \phi_2 - \phi_1$ - $\Delta \lambda = \lambda_2 - \lambda_1$ - $R$ 是地球半径(平均约为 6371 km) --- ## ✅ 二、JavaScript 实现 ```javascript function getDistanceFromLatLonInKm(lat1, lon1, lat2, lon2) { const R = 6371; // 地球半径,单位:公里 const dLat = deg2rad(lat2 - lat1); const dLon = deg2rad(lon2 - lon1); const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.sin(dLon / 2) * Math.sin(dLon / 2); const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); const d = R * c; // 距离,单位:公里 return d; } // 将角度转换为弧度 function deg2rad(deg) { return deg * (Math.PI / 180); } ``` --- ## ✅ 三、使用示例 ```javascript const distance = getDistanceFromLatLonInKm(40.7128, -74.0060, 34.0522, -118.2437); console.log(`两地之间的距离是 ${distance.toFixed(2)} 公里`); ``` > 说明: > - `40.7128, -74.0060` 是纽约市的经纬度 > - `34.0522, -118.2437` 是洛杉矶的经纬度 > - 输出结果大约是 3935.75 公里 --- ## ✅ 四、其他注意事项 - 如果需要米(meter)作为单位,可以将 `R` 改为 `6371000`。 - Haversine 公式假设地球是一个完美的球体,实际地球是椭球体,但对大多数应用来说误差是可以接受的。 - 对于更高精度的需求,可以使用 **Vincenty 公式**,但实现复杂度较高。 --- ## ✅ 五、扩展:返回米或英里 ```javascript function getDistanceInMeters(lat1, lon1, lat2, lon2) { return getDistanceFromLatLonInKm(lat1, lon1, lat2, lon2) * 1000; } function getDistanceInMiles(lat1, lon1, lat2, lon2) { return getDistanceFromLatLonInKm(lat1, lon1, lat2, lon2) * 0.621371; } ``` --- 如需更精确的地理计算(比如考虑地球椭球形状),可使用 [geolib](https://github.com/manuelbieh/geolib) 或 [Turf.js](https://turfjs.org/) 这样的库。 --- 如果你有具体的应用场景(如地图、导航、位置服务等),我可以进一步帮你优化代码或推荐合适的工具。
上一篇:
js中escape,encodeURI,encodeURIComponent三个函数的区别
下一篇:
js如何打印object对象
标题录入,一次不能超过6条
返回顶部
留言
留言
评论