Java 无法使用纬度和经度计算距离

Java 无法使用纬度和经度计算距离,java,Java,我有一个写有纬度和经度的SQLite表。当我试图用它来计算距离时,我得到了错误的答案 平民的​​ArrayList​ 获得积分{ ​ArrayList​ 位置=​刚出现的​​ArrayList​; ​数据操作​db=t​他的​可读取数据库; ​光标​cursor=db.rawQuery​从中选择纬度、经度​+​表\u名称\u位置,​​无效的​; 我​F​cursor.getCount>​0​{ ​虽然​cursor.moveToNext{ ​双重的​纬度=cursor.getDoublecurs

我有一个写有纬度和经度的SQLite表。当我试图用它来计算距离时,我得到了错误的答案

平民的​​ArrayList​ 获得积分{ ​ArrayList​ 位置=​刚出现的​​ArrayList​; ​数据操作​db=t​他的​可读取数据库; ​光标​cursor=db.rawQuery​从中选择纬度、经度​+​表\u名称\u位置,​​无效的​; 我​F​cursor.getCount>​0​{ ​虽然​cursor.moveToNext{ ​双重的​纬度=cursor.getDoublecursor.getColumnIndex​拉特​; ​双重的​经度=cursor.getDoublecursor.getColumnIndex​朗吉​; 位置、纬度; 位置。经度; } } 光标。关闭; ​R​埃图恩​地方​ } 私有的​​双重的​距离​双重的​lat1,​双重的​lon1,​双重的​lat2,​双重的​lon2{​双重的​θ=lon1-lon2; ​双重的​距离=​数学​sindeg2radlat1 * ​数学​sindeg2radlat2 + ​数学​cosdeg2radlat1 * ​数学​cosdeg2radlat2 * ​数学​cosdeg2radtheta; 距离=​数学​acosdist;dist=rad2degdist; 距离=距离*​60​* ​1.1515;​ R​埃图恩​区;​ } ​私有的​​双重的​脱胶剂​双重的​deg{r​埃图恩​度数*​数学​π/​180​; } ​私有的​​双重的​rad2deg​双重的​拉德{​R​埃图恩​拉德*​180​/ ​数学​圆周率; } 预计输出距离圣彼得堡和莫斯科4800公里。 但实际结果是9000公里


我使用Android 9.0和Java 11,正如Jean-Claude所指出的,看看harvesine

public double distance(double p1LatRad, double p1LongRad, double p2LatRad, double p2LongRad) {
    double sinLatDiff = Math.sin((p1LatRad - p2LatRad) / 2.0);
    double sinLongDiff = Math.sin((p1LongRad - p2LongRad) / 2.0);
    double a = sinLatDiff * sinLatDiff + Math.cos(p1LatRad) * Math.cos(p2LatRad) * sinLongDiff * sinLongDiff;
    return 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)) * 6_378_100;
}

此外,不要实现自己的弧度转换。您可以使用内置的Math.toRadians和Math.toDegrees函数。

公式存在问题。请参见此处:可能还有此处: