我正在编写一个基于位置的应用程序,并希望对合理的 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 的收费似乎存在一些噪音,我无法找到关于收费如何工作的明确解释。
所有的智慧都感激地接受。