0

我正在计算两个纬度和经度之间的距离。我得到了一些距离的结果,但有时,我得到的结果是 NAN。

这是我在 2 个地方得到的纬度和经度。

例如:38.655553,-121.091611

38.654875,-121.091324

我正在使用以下代码参考以下链接计算距离

计算两个地理位置之间的距离

public static double distanceBetween (double currentLat2, double currentLong2, double mallLat2, double mallLong2)
{
     float pk = (float) (180/3.14169);

        double a1 = currentLat2 / pk;
        double a2 = currentLong2 / pk;
        double b1 = mallLat2 / pk;
        double b2 = mallLong2 / pk;

        double t1 = FloatMath.cos((float) a1)*FloatMath.cos((float) a2)*FloatMath.cos((float) b1)*FloatMath.cos((float) b2);
        double t2 = FloatMath.cos((float) a1)*FloatMath.sin((float) a2)*FloatMath.cos((float) b1)*FloatMath.sin((float) b2);
        double t3 = FloatMath.sin((float) a1)*FloatMath.sin((float) b1);
        double tt = Math.acos(t1 + t2 + t3);

       return 6366000*tt;               
}

有什么帮助吗?

谢谢。

4

3 回答 3

1

的文档Location.distanceTo(LOcation)说:

返回此位置与给定位置之间的近似距离(以米为单位)。距离是使用 WGS84 椭球定义的。

所以你可以试试这样:

public static float distanceBetween (double currentLat2, double currentLong2, double mallLat2, double mallLong2) {
        Location loc1 = new Location("");
        loc1.setLatitude(currentLat2);
        loc1.setLongitude(currentLong2);

        Location loc2 = new Location("");
        loc2.setLatitude(mallLat2);
        loc2.setLongitude(mallLong2);

        return loc1.distanceTo(loc2);
}
于 2013-04-23T13:16:43.773 回答
1

MathFloatfloat演员一起是你的问题的原因。

我重写了,现在可以了,它给了 79.34m

但是主要的问题是你在这个任务中使用了错误的公式,你在这里使用了具有余弦定律的更大圆距离公式,众所周知,它对于浮点运算是“病态的”。然后更糟糕的是,您只使用单精度而不是双精度。

更稳健的公式是haversine公式。它旨在克服大圆公式的缺点。

在这里您的原始代码已修复,(但我仍然建议使用 hasrsine 公式代替)

public void test1() {

    // 79.34253285803419
    double lat1 = 38.655553;
    double lon1 = -121.091611;

    double lat2 = 38.654875;
    double lon2 = -121.091324;

    System.out.println(distanceBetween(lat1,  lon1,  lat2,  lon2));
}

public static double distanceBetween (double currentLat2, double currentLong2, double mallLat2, double mallLong2)
{
        double pk = 180 / Math.PI;
        double a1 = currentLat2 / pk;
        double a2 = currentLong2 / pk;
        double b1 = mallLat2 / pk;
        double b2 = mallLong2 / pk;

        double t1 = Math.cos( a1) * Math.cos(a2) * Math.cos(b1) * Math.cos(b2);
        double t2 = Math.cos( a1) * Math.sin(a2) * Math.cos(b1) * Math.sin(b2);
        double t3 = Math.sin( a1) * Math.sin(b1);
        double tt = Math.acos(t1 + t2 + t3);

       return 6366000*tt;
}
于 2013-04-23T15:52:44.293 回答
0

您可以记录 t1、t2、t3 的输出吗?我感觉 for 的论点Math.acos()超出了范围。也不确定为什么当您可以使用Math.sinand时不必要地强制转换为 float 并返回 double Math.cos

编辑

Math.PI代替 3.14169使用。这种近似导致您的错误。

于 2013-04-23T13:04:10.937 回答