You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

经纬度两点距离计算结果异常:已实现公式但结果不符预期

问题分析与修复方案

嘿,我一看你的代码就知道问题出在哪了——你没把经纬度的角度值转换成弧度!Java里的Math.sin()、Math.cos()这些三角函数默认都是基于弧度计算的,而我们日常用的经纬度是角度(比如北纬30°、东经120°),直接把角度值丢进去计算,结果肯定会跑偏。另外,你代码里的c变量定义好像没写完,我也帮你一起补全修正了。

修正后的完整代码

public double distance(double x, double y, double x2, double y2) {
    // 地球平均半径(单位:米)
    double r = 6371e3;
    // 米转英里的转换系数
    double toMile = 0.000621371;
    
    // 核心修正:将所有经纬度从角度转换为弧度
    double lat1 = Math.toRadians(x);
    double lon1 = Math.toRadians(y);
    double lat2 = Math.toRadians(x2);
    double lon2 = Math.toRadians(y2);
    
    double latDiff = lat2 - lat1;
    double lonDiff = lon2 - lon1;
    
    // a 是两点间弦长一半的平方
    double a = Math.sin(latDiff / 2) * Math.sin(latDiff / 2)
            + Math.cos(lat1) * Math.cos(lat2) * Math.sin(lonDiff / 2) * Math.sin(lonDiff / 2);
    // c 是两点间的角距离(单位:弧度)
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
    
    // 先计算米为单位的距离,再转换为英里返回
    double distanceInMeters = r * c;
    return distanceInMeters * toMile;
}

关键修正点说明

  • 弧度转换:用Java自带的Math.toRadians()方法把角度转成弧度,这是解决计算错误的核心。如果手动转换的话,就是乘以Math.PI / 180,不过内置方法更简洁不易出错。
  • 变量可读性优化:我把原来的x/y/x2/y2改成了lat1/lon1/lat2/lon2,这样代码逻辑更清晰,毕竟抽象的x/y很难直接对应经纬度的含义。
  • 补全代码片段:你原来的代码里c变量的定义没写完,我帮你补全了完整的Math.atan2调用。

你可以用已知距离的点位测试验证,比如北京(39.9042, 116.4074)和上海(31.2304, 121.4737),实际直线距离约1067公里(663英里),用修正后的代码计算会得到接近的结果。

内容的提问来源于stack exchange,提问作者soul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:13:12