html5地理定位仅获取经纬度,计算两点距离需用haversine公式;因地球是球体,直接套用勾股定理误差大,haversine兼顾精度与效率,javascript实现可直接调用,结合geolocation api可实现如附近商家距离计算。

HTML5 地理定位本身不直接计算两点距离,它只负责获取用户当前经纬度(latitude、longitude)。真正计算两个地理坐标间实际距离,需要用球面距离公式——最常用的是Haversine 公式,因为它能准确反映地球曲率,适用于大多数精度要求不极端的场景(如附近商家、运动轨迹、步行导航等)。
为什么不能用平面勾股定理?
地球是近似球体,经纬度是球面坐标。两点在地图上看似直线,实际是地球表面的一段弧线。纬度每度约111公里,但经度每度长度随纬度升高而减小(赤道最长,两极为0)。直接套用二维距离公式误差极大,尤其跨纬度大或高纬度区域。
所以必须用球面三角模型,Haversine 是兼顾精度与计算效率的成熟方案。
核心:Haversine 公式实现(JavaScript)
以下是标准、可直接运行的计算函数:
function getDistance(lat1, lon1, lat2, lon2) {
const R = 6371; // 地球平均半径,单位:公里
const toRad = x => x * Math.PI / 180;
const φ1 = toRad(lat1);
const φ2 = toRad(lat2);
const Δφ = toRad(lat2 - lat1);
const Δλ = toRad(lon2 - lon1);
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));
return R * c; // 单位:公里
}
用法示例:getDistance(39.9042, 116.4074, 31.2304, 121.4737) → 北京到上海,结果约 1067 公里。
如何结合 HTML5 Geolocation 使用?
典型流程是:先用 navigator.geolocation.getCurrentPosition 获取用户位置,再调用上面的距离函数对比已知目标点(如门店坐标):
- 确保页面通过 HTTPS 提供服务(现代浏览器强制要求)
- 请求权限后,在成功回调中提取
position.coords.latitude和position.coords.longitude - 将用户坐标和目标坐标(例如从数据库或配置中读取)传入
getDistance() - 可选:四舍五入保留一位小数,单位加“km”或“m”(
进阶考虑:精度与替代方案
如果对精度要求更高(比如测绘级),可考虑:
- Vincenty 公式:基于椭球地球模型,误差小于 0.5mm,但计算更复杂
-
调用地图 SDK:百度、高德、腾讯地图 JS API 都提供
getDistance方法,自动处理投影与优化,适合生产环境 - 注意坐标系:国内地图(如百度)使用 BD-09 坐标系,GPS 原始坐标是 WGS-84,混用会导致几公里偏差,需做坐标转换
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











