私はロケーションベースのアプリを書いていて、賢明な API の使用法について知恵を得たいと思っています。
これまでに理解したのは、 int を使用する方が効率的であるということです。それらを大量に保存し、多くの距離計算を行う必要があります。
私のアプリは LocationListener を実装する Service を使用し、経度と緯度を int 値 (マイクロ度) として (ormlite 経由で) 計算された SQL データベース内に格納しています ::
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 返された距離値は私を混乱させます。100m 歩くと、アプリは Location.distanceTo(myLastLocation) を使用して、約 100m 進んだことを適切に通知します。しかし、保存された int 値に対して上記の方法を使用すると、値ゼロが返されます。
誰かが E6 形式を説明できれば、それは素晴らしいことです。
1E6 は 1000000 と同じですか?
さらに、この GeoPoint クラスがあることがわかります。GeoPoints で膨大な数の計算を行うことが Google によって請求されるかどうかわからないため、これを使用することをためらっています。GoogleMaps API の使用に対する課金については騒がしいようで、その課金がどのように機能するかについての明確な説明を見つけることができませんでした。
すべての知恵を感謝して受け取りました。