ユーザーが駐車した車の位置を特定し、駐車中の車との距離を表示するアプリを開発する必要があります。GPS と位置情報サービスを使用しました。
距離については、 harsine式を使用しましたが、距離は常に 0 メートルを示します。
私はグーグルで解決策を探してみましたが、正しい解決策は得られませんでした。
誰でも提案できますか?
ユーザーが駐車した車の位置を特定し、駐車中の車との距離を表示するアプリを開発する必要があります。GPS と位置情報サービスを使用しました。
距離については、 harsine式を使用しましたが、距離は常に 0 メートルを示します。
私はグーグルで解決策を探してみましたが、正しい解決策は得られませんでした。
誰でも提案できますか?
Google ドキュメントには 2 つの方法があります
GeoPoint から緯度/経度を取得している場合、それらはマイクロ度単位です。1e6 を掛ける必要があります。
しかし、私は以下の方法を使用することを好みました。(Haversine Formula に基づいています)
http://www.codecodex.com/wiki/Calculate_Distance_Between_Two_Points_on_a_Globe
double dist = GeoUtils.distanceKm(mylat, mylon, lat, lon);
/**
* Computes the distance in kilometers between two points on Earth.
*
* @param lat1 Latitude of the first point
* @param lon1 Longitude of the first point
* @param lat2 Latitude of the second point
* @param lon2 Longitude of the second point
* @return Distance between the two points in kilometers.
*/
public static double distanceKm(double lat1, double lon1, double lat2, double lon2) {
int EARTH_RADIUS_KM = 6371;
double lat1Rad = Math.toRadians(lat1);
double lat2Rad = Math.toRadians(lat2);
double deltaLonRad = Math.toRadians(lon2 - lon1);
return Math.acos(Math.sin(lat1Rad) * Math.sin(lat2Rad) + Math.cos(lat1Rad) * Math.cos(lat2Rad) * Math.cos(deltaLonRad)) * EARTH_RADIUS_KM;
}
最後にボーナス情報を共有したいと思います。
車でのルート案内を探している場合は、2 つの場所の間をルートしてから、
android.location APIでこのメソッドを使用してみてください
このメソッドは、2 つの場所の間のおおよその距離 (メートル単位) を計算し、必要に応じてそれらの間の最短経路の最初と最後の方位を計算します。
注: GeoPoint から緯度/経度を取得している場合、それらはマイクロ度単位です。1E6 を掛ける必要があります
2つのジオポイント間の距離をHaversine式で計算したい場合
public class DistanceCalculator {
// earth’s radius = 6,371km
private static final double EARTH_RADIUS = 6371 ;
public static double distanceCalcByHaversine(GeoPoint startP, GeoPoint endP) {
double lat1 = startP.getLatitudeE6()/1E6;
double lat2 = endP.getLatitudeE6()/1E6;
double lon1 = startP.getLongitudeE6()/1E6;
double lon2 = endP.getLongitudeE6()/1E6;
double dLat = Math.toRadians(lat2-lat1);
double dLon = Math.toRadians(lon2-lon1);
double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
Math.sin(dLon/2) * Math.sin(dLon/2);
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
return EARTH_RADIUS * c;
}
}
distanceBetween()
メソッドは、2 点間の直線距離を示します。2点間のルート距離を取得しましたここで私の回答を参照してください
harvesine 式の問題は、実際の距離を計算しないことです。球上の 2 点からの距離です。実際の距離は、通りや水路によって異なります。harvesine 式も少し複雑なので、Google-Api に実際の距離を与えるように依頼する方が簡単です。Googlemaps API を使用するには、方向 API を学習する必要があります。
android.location.Location.distanceBetween(double startLatitude、double startLongitude、double endLatitude、double endLongitude、float[] 結果)
ジオポイントには getLongitudeE6() と getLatitudeE6() が役立ちます。これらは E6 なので、1E6 で割る必要があることに注意してください。
distanceBetween は実際の距離 (道路距離) を参照していません。そのため、この Google ソース コードにアクセスすることをお勧めします。2 つのジオポイント間の実際の道路距離が表示されます。 リンクは、 Android 用とBlackberry 用の 2 つのバージョンがあります。チェックしてください