使用Java以千米为单位计算纬度经度坐标的距离

时间:2011-04-05 19:56:02

标签: java distance latitude-longitude

我有以下计算距离并以英里为单位返回的方法:

public static int calcDistance(float latA, float longA, float latB, float longB) {

    double theDistance = (Math.sin(Math.toRadians(latA)) *
            Math.sin(Math.toRadians(latB)) +
            Math.cos(Math.toRadians(latA)) *
            Math.cos(Math.toRadians(latB)) *
            Math.cos(Math.toRadians(longA - longB)));

    return new Double((Math.toDegrees(Math.acos(theDistance))) * 69.09).intValue();
}

为了让这种方法返回公里数需要改变什么?

还有其他计算A和B之间距离的方法吗?

(最好是在java代码中)

5 个答案:

答案 0 :(得分:4)

您只需将最后一行更改为:

return new Double((Math.toDegrees(Math.acos(theDistance))) * 
    69.09*1.6093).intValue();

1英里= 1.6093公里

答案 1 :(得分:2)

由于该公式以英里为单位返回结果,因此只需将里程转换为公里

kilometers = miles * 1.609344

答案 2 :(得分:0)

我相信你正在寻找半身定制的公式:http://www.movable-type.co.uk/scripts/latlong.html

公式乘以地球半径,确定结果单位。

答案 3 :(得分:0)

您可以将代码更改为

return new Double((Math.toDegrees(Math.acos(theDistance))) * 111.12).intValue();

相当于已经表达的转化次数。

在计算纬度和经度的距离时,有另外的更好的公式。 Lambert's formula似乎非常出色,在数千公里的距离上精确到10米,并使用了您已经提供的一些代码。

答案 4 :(得分:0)

您计算的距离基于地球作为球体,这可能有助于比较近似 - 短距离。为了在更长距离(例如航空旅行)上获得更好的结果,我建议使用地理空间实用程序库(例如开源GeoTools)来考虑地球形状的椭球性质。

许多专业级Geo解决方案使用WGS-84作为模型,GeoTools支持该模型。

请记住 - 如果您的假设是错误的,那么获得100个小数位数的“准确度”并不重要! ;)