Java中的Haversine公式产生不正确的结果
Posted
技术标签:
【中文标题】Java中的Haversine公式产生不正确的结果【英文标题】:Haversine formula in Java producing incorrect result 【发布时间】:2014-05-21 07:11:55 【问题描述】:我正在尝试使用 Haversine formula
given on wikipedia 的这个实现进行试验,但这个公式没有给出预期的结果。
public class Haversine
public static final double R = 6372.8; // In kilometers
public static double haversine(double lat1, double lon1, double lat2, double lon2)
double dLat = Math.toRadians(lat2 - lat1);
double dLon = Math.toRadians(lon2 - lon1);
lat1 = Math.toRadians(lat1);
lat2 = Math.toRadians(lat2);
double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);
double c = 2 * Math.asin(Math.sqrt(a));
return R * c;
public static void main(String[] args)
System.out.println(haversine(36.12, -86.67, 33.94, -118.40));
Input GPS latitude format : ddmm.mmmm
Input GPS longitude format : dddmm.mmmm
以上格式的经纬度在需求文档中指定。
示例输入坐标如下:
lat1 = 3359.64868, lon1 = 8356.178
lat2 = 3359.649, lon2 = 8356.178
在将这些值传递给 Haversine 方法之前,我将这些值转换为度数格式。 如果不需要此步骤,请纠正我。
我正在使用下面的公式将度数格式转换为十进制度数格式:
Decimal Degree = degree + (minute / 60)
所以新坐标变成了
lat1 = 33 + (59.64868 / 60) = 33.994144666666664
lon1 = 83 + (56.178 / 60) = 83.9363
lat2 = 33 + (59.649 / 60) = 33.99415
lon2 = 83 + (56.178 / 60) = 83.9363
调用haversine方法变得像
haversine(33.994144666666664, 83.9363, 33.99415, 83.9363)
这是返回值5.932071604620887E-4
为了验证这些值,我向this website 上的转换器提供了相同的输入(33.994144666666664, 83.9363, 33.99415, 83.9363)
,但它给出的结果为0.001
km。
我尝试在不转换为十进制度的情况下提供输入值,但两种方法的输出也不匹配。
谁能告诉我我在这里犯了什么错误?
【问题讨论】:
请评论否决 您是否尝试过使用计算器浏览您的程序并查看结果的不同之处? 是和不是。我已经用计算器计算了度数/分钟的转换,但我没有调试 wiki 上给出的 java 代码,因为我期待这个代码是正确的。 好吧,为什么不试试呢? 【参考方案1】:你得到的结果5.932071604620887E-4
是5.932071604620887 * 10^(-4)
的表示,也就是5.932071604620887 / 10000 = 0.0005932071604620887
。
如果网站返回0.001
,我的建议是四舍五入到小数点后第三位。因此,您的计算是正确的。
【讨论】:
以上是关于Java中的Haversine公式产生不正确的结果的主要内容,如果未能解决你的问题,请参考以下文章
Haversine 公式错误 - 距离不正确 - Arduino