我正在编写一个基于位置的应用程序,并希望在合理的API使用方面获得一些智慧。
到目前为止我所理解的是使用int更有效。我将需要存储它们的负载并进行大量的距离计算。
我的应用使用了一个实现LocationListener的服务,我正在存储经度&纬度为SQL db(通过ormlite)内部的int值(微度),因此计算::
public static int degreesToMicroDegrees(double degrees){
return (int)(degrees * 1E6);
}
有时我需要知道何时返回特定的“位置”,因此我从数据库中取回int值以与最新的位置更新进行比较。
问题是,在我最新的位置更新中比较int值(我以前在哪里)和double值(我现在的位置)之间的'location'的最佳方法是什么?
我搜索了一些数学来完成距离计算,发现了这个::
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类。我对使用它犹豫不决,因为我不清楚是否会对Google收取大量的GeoPoints计算费用。关于使用GoogleMaps API的收费似乎存在一些噪音,我无法找到有关收费如何运作的明确解释。
感激所有的智慧。
答案 0 :(得分:3)
只是我的2点:
1E6与1,000,000相同。
要将你的int纬度/经度转换为双倍,你可以这样做:
(double)theLat/1E6;
我还建议您使用Location
类的Location.distanceBetween方法。
GeoPoint不会为您的申请产生任何费用。我用它所有的时间。 : - )