Java 爪哇两个地理位置之间的距离:NaN
我有这段代码,根据两个IP地址对应的纬度和经度计算它们之间的近似物理距离Java 爪哇两个地理位置之间的距离:NaN,java,geolocation,Java,Geolocation,我有这段代码,根据两个IP地址对应的纬度和经度计算它们之间的近似物理距离 public static double distance(double lat1, double lon1, double lat2, double lon2) { double theta = lon1 - lon2; double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.c
public static double distance(double lat1, double lon1, double lat2, double lon2)
{
double theta = lon1 - lon2;
double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) +
Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta));
dist = Math.acos(dist);
dist = rad2deg(dist);
dist = dist * 60 * 1.1515;
return (dist);
}
lat和long是有符号值。但是,此代码有时将dist返回为NaN
我错过什么了吗?θ需要是绝对值吗
更新:
返回Nan的测试值:-
lat1=-23.5477,lon1=-46.6358,lat2=-23.5477,lon2=-46.6358
lat1=53.3331,lon1=-6.2489,lat2=53.3331,lon2=-6.2489当两个输入点相同时,以下表达式返回的结果略大于1(1.0000000000002) 这一定是由于浮点运算的精度有限(或三角函数的精度有限)
Math.acos(dist)
如果dist
>1,则返回NaN。你可以通过简单的改变来克服这个问题
dist = Math.acos(dist);
到
一些测试数据可能会有帮助,您是否尝试过任何类型的调试?也许会把数值打印出来?我会用测试数据更新这个问题。@mad程序员添加测试数据,你的起点和终点是一样的吗?
dist = Math.acos(dist);
dist = Math.acos(Math.min(dist,1));