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

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

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代码中)

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

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

1英里= 1.6093公里

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

 kilometers = miles * 1.609344 

我相信你正在寻找hasrsine公式: http : //www.movable-type.co.uk/scripts/latlong.html

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

您可以更改您的代码

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

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

在给定纬度和经度的情况下,有另外的更好的公式来计算距离。 兰伯特的公式似乎非常出色,在数千公里的距离内精确到10米,并使用了您已经提供的一些代码。

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

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

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