【问题标题】:How does the distanceTo() method of the Location class work internally?Location 类的 distanceTo() 方法在内部是如何工作的?
【发布时间】:2015-08-20 06:09:26
【问题描述】:

我尝试在两个Location 对象之间使用distanceTo(),但是AFAIK 在所有情况下都没有返回正确的值。相反,我编写了一个自定义方法,它返回我认为正确的值。

float distanceBetween(Location l1, Location l2)
{
    float lat1= (float)l1.getLatitude();
    float lon1=(float)l1.getLongitude();
    float lat2=(float)l2.getLatitude();
    float lon2=(float)l2.getLongitude();
    float R = 6371; // km
    float dLat = (float)((lat2-lat1)*Math.PI/180);
    float dLon = (float)((lon2-lon1)*Math.PI/180);
    lat1 = (float)(lat1*Math.PI/180);
    lat2 = (float)(lat2*Math.PI/180);

    float a = (float)(Math.sin(dLat/2) * Math.sin(dLat/2) +
            Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2));
    float c = (float)(2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)));
    float d = R * c * 1000;

    return d;
}

谁能告诉我我的实现与 distanceTo() 返回的内容之间有什么区别?

【问题讨论】:

  • 有问题吗?
  • 你在哪里接触到这个?

标签: android gps android-location


【解决方案1】:

我很确定Location.distanceTo() 的设计是正确的。它使用高度精确和准确的WGS84方法。我最近在一些测试用例中使用了Location.distanceTo(),它从来没有错。

你没有解释为什么你认为这个方法不能正常工作。您可能会得到错误的值,因为您没有为 Location 对象设置正确的纬度和经度值。此外,您可以在 IDE 中设置 Android 的源代码并自行检查方法。完全正确。

编辑:

在您发布的那个链接上,有一个answer 简明扼要地总结了这个问题:

distanceTo() 工作正常。错误就在你身边,很可能 算法之一,例如,如果没有可用的 GPS 定位,并且手机 需要一个基于 GSM 小区的位置,这当然可以相差 1000m。

对于您可能想要总结行驶距离的应用, 只进行 GPS 修复,不要使用 GPS 以外的其他 LocationProvider!

所以这个故事的寓意是确保您只使用 GPS 提供程序来计算距离。

编辑 2:

Google 建议使用 Google Play Services Location API 而不是 android.location API。新的 API 应该更准确。

参考资料:

1. Making Your App Location-Aware.

【讨论】:

  • 请看这个:stackoverflow.com/questions/18377587/…从location.ditanceTo(location2)重新调整的距离每次都不一样
  • 是的,总而言之,要在不使用 GPS 的情况下获得准确的结果,我认为我们必须使用这个基于数学公式的函数。
  • 该函数是适用于小距离的近似值。您应该使用 GPS 提供程序来获取当前位置,然后调用 distanceTo 来计算变化/差异。请参阅编辑后的答案:)
【解决方案2】:

正如上面引用我的一个旧答案所解释的那样,distanceTo() 可以正常工作。 我了解自我实现的 distanceTo 方法的优势。 这使您的代码独立于库,并且具有更好的可移植性,并且 在不同的平台上总是会给出相同的距离。 (例如使用测试用例时)

但后来我建议使用另一个公式:
在您的代码中,地球半径不够精确,您应该采用 WGS84 地球半径(以米为单位),即 GPS 接收器在其地球模型中使用的地球半径。您可以通过搜索互联网轻松找到 WGS84 地球半径。
那么你应该使用半正弦公式:众所周知,这也适用于小距离。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 2017-05-03
    • 2015-10-04
    • 1970-01-01
    相关资源
    最近更新 更多