Java中计算两经纬度距离最常用且准确的方法是Haversine公式,它基于地球球体模型,数值稳定性好,返回以米为单位的距离,适用于大多数LBS场景。

Java 中计算两个经纬度坐标之间的距离,最常用且准确的方法是使用 球面余弦定理 或更稳定的 Haversine 公式,它们都基于地球近似为球体的前提,适用于大多数业务场景(如地图展示、附近搜索等)。
用 Haversine 公式计算距离(推荐)
Haversine 公式数值稳定性更好,尤其在两点距离很近或接近对跖点时比基础余弦公式更可靠。它返回单位为米的距离:
- 将经纬度从“度”转为“弧度”
- 计算纬度差、经度差的正弦和余弦值
- 套用公式:a = sin²(Δφ/2) + cos(φ₁)·cos(φ₂)·sin²(Δλ/2)
- 再算 c = 2·atan2(√a, √(1−a)),距离 d = R × c(R 取地球平均半径 6371008.8 米)
示例代码:
public static double haversineDistance(double lat1, double lon1, double lat2, double lon2) {
final double R = 6371008.8; // 地球平均半径,单位:米
double lat1Rad = Math.toRadians(lat1);
double lon1Rad = Math.toRadians(lon1);
double lat2Rad = Math.toRadians(lat2);
double lon2Rad = Math.toRadians(lon2);
<pre class="brush:php;toolbar:false;">double dLat = lat2Rad - lat1Rad;
double dLon = lon2Rad - lon1Rad;
double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.cos(lat1Rad) * Math.cos(lat2Rad) *
Math.sin(dLon / 2) * Math.sin(dLon / 2);
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
return R * c; // 单位:米}
用 Java 8+ 的 Math.toRadians 和 Math.sin/cos/atan2 就够了
无需引入第三方库。注意输入顺序:纬度在前(lat),经度在后(lon),这是 WGS84 标准坐标系的通用约定。若传入顺序颠倒,结果会严重错误。
- 确保传入的是十进制度数(如 39.9042°,不是 39°54′15″)
- 纬度范围应为 [-90, 90],经度为 [-180, 180];超出需做归一化处理
- 若需千米结果,直接除以 1000;若需英里,乘以 0.000621371
精度说明与适用边界
Haversine 假设地球是完美球体,实际误差一般在 0.5% 以内(例如北京到上海约 1050 km,误差约 ±5 km)。对绝大多数 LBS 应用已足够。如需厘米级精度(如测绘、高精定位),应使用 Vincenty 公式或调用专业 GIS 库(如 GeoTools)并考虑椭球模型(WGS84 椭球)。
简单验证示例
北京天安门(39.9042, 116.4074)到国贸(39.9139, 116.4782):
double dist = haversineDistance(39.9042, 116.4074, 39.9139, 116.4782); // ≈ 5820 米
结果与主流地图 App 显示的驾车/步行距离虽不完全一致(因道路绕行),但直线距离合理可信。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











