使用Java计算经纬度坐标之间的距离(单位:公里)

4
我有以下方法,用于计算距离并将其以英里为单位返回:
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个回答

4
你只需要将最后一行改为:
return new Double((Math.toDegrees(Math.acos(theDistance))) * 
    69.09*1.6093).intValue();

1英里 = 1.6093公里


1英里 = 1.609344千米 ;-) - Mr.Wizard
对于纬度来说也许可以,但是经度的距离基于纬度是不同的(在赤道和极地1度不是相同的...) - SJuan76

2
自公式返回的结果是英里,只需将其转换为公里即可。
kilometers = miles * 1.609344

0

你可以将你的代码改成这样

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

相当于已经表达的转换。

对于给定的纬度和经度,有替代且更好的公式来计算距离。Lambert's formula 看起来非常优秀,可以在数千公里的距离上给出10米的精度,并使用了你已经提供的一些代码。


0

0

您计算的距离是基于地球作为一个球体,这对于比较近似的距离可能还不错。但对于更长的距离(如空中旅行),建议使用地理空间实用程序库(例如开源GeoTools)考虑到地球形状的椭球性质以获得更好的结果。

许多专业级地理解决方案使用WGS-84模型,而GeoTools支持该模型。

记住——如果你的假设是错误的,即使获得100个小数位的“准确性”也是无效的!;)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接