3

我正在编写一个基于位置的应用程序,并希望对合理的 API 使用有所了解。

到目前为止,我所理解的是使用 int 更有效。我将需要存储它们的负载并进行大量距离计算。

我的应用程序使用实现 LocationListener 的服务,并且我将经度和纬度作为 int 值(微度)存储在 SQL db(通过 ormlite)中,因此计算得出 ::

public static int degreesToMicroDegrees(double degrees){
    return (int)(degrees * 1E6);
}

有时我需要知道我何时返回到特定的“位置”,因此我从数据库中取回 int 值以与最新的位置更新进行比较。

问题是,在我的最新位置更新中,比较 int 值(我曾经所在的位置)和 double 值(我现在所在的位置)之间的“位置”的最佳方法是什么?

我四处寻找一些数学来完成距离计算并找到了这个::

public static double distanceBetween(double lat1, double lng1, double lat2, double lng2) {

          double earthRadius = 3958.75; 
          double dLat = Math.toRadians(lat2-lat1); 
          double dLng = Math.toRadians(lng2-lng1); 
          double a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
                   Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * 
                   Math.sin(dLng/2) * Math.sin(dLng/2); 
          double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
          double dist = earthRadius * c; 

          return dist; 
        } 

我试过像这样传递我的 int 值 :: ((double)myIntValue) / 1E6F 返回的距离值让我感到困惑。如果我走 100 米,我的应用程序会明智地告诉我,我使用 Location.distanceTo(myLastLocation) 已经走了大约 100 米。但是,如果我对存储的 int 值使用上述方法,我会得到零值。

如果有人可以解释 E6 格式,那就太好了。

1E6 和 1000000 一样吗?

另外我可以看到有这个 GeoPoint 类。我很犹豫是否要使用它,因为我不清楚在 GeoPoints 上进行大量计算是否会由 Google 收费。关于使用 GoogleMaps API 的收费似乎存在一些噪音,我无法找到关于收费如何工作的明确解释。

所有的智慧都感激地接受。

4

1 回答 1

3

只是我的2美分:

1E6 与 1,000,000 相同。

要将您的 int 纬度/经度转换为双精度,您可以执行以下操作:

(double)theLat/1E6;

我还建议您使用类的Location.distanceBetween方法Location


GeoPoint 不会为您的申请产生任何费用。我用它所有的时间。:-)

于 2012-04-11T04:00:46.007 回答