как рассчитать расстояние между двумя точками в приложении для Android - PullRequest
3 голосов
/ 21 апреля 2011

В моем приложении я пытаюсь рассчитать расстояние, на которое человек путешествует от одного места к другому.Для этого я использую формулу Хаверсайна,

R = earth’s radius (mean radius = 6,371km)
Δlat = lat2− lat1
Δlong = long2− long1
a = sin²(Δlat/2) + cos(lat1).cos(lat2).sin²(Δlong/2)
c = 2.atan2(√a, √(1−a))
d = R.c 

, получая широту и долготу начального и конечного места, и рассчитываю расстояние в км.Но другие говорят, что этот расчет расстояния работает только в том случае, если он путешествует по воздушным путям и получает разное, если пользователь путешествует по автомобильным дорогам.

Если это так, как я могу получить правильное расстояние при проезде по дорогам.* Пожалуйста, помогите мне, друзья

Ответы [ 6 ]

6 голосов
/ 21 апреля 2011

Этот метод используется в стандартном API (метод Location.distanceBetween)) http://developer.android.com/reference/android/location/Location.html

3 голосов
/ 21 апреля 2011

Используйте следующую формулу, чтобы найти расстояние между двумя широтами:

private double calculateDistance(double lat1, double lon1, double lat2, double lon2, String unit) 
{
      double theta = lon1 - lon2;
      double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta));
      dist = Math.acos(dist);
      dist = rad2deg(dist);
      dist = dist * 60 * 1.1515;
      if (unit == "K") {
        dist = dist * 1.609344;
      } else if (unit == "M") {
        dist = dist * 0.8684;
        }
      return (dist);
}

    /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
    /*::  This function converts decimal degrees to radians             :*/
    /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
    private double deg2rad(double deg) 
    {
      return (deg * Math.PI / 180.0);
    }

    /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
    /*::  This function converts radians to decimal degrees             :*/
    /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
    private double rad2deg(double rad)
    {
      return (rad * 180.0 / Math.PI);
    }

Передайте лат, long с функцией и единицей, в которой вы хотите расстояние («K» для километра и «M» для миль). Надеюсь, это поможет вам.

2 голосов
/ 21 апреля 2011

Location.distanceBetween() сделает это для двух координатных точек широты и долготы.

2 голосов
/ 21 апреля 2011

Когда вы путешествуете по дороге (даже по воздуху), направление Земли вступает в игру, поскольку Земля не плоская.но эта формула Haversine уже должна позаботиться об этом.Во-вторых, люди могли сказать, что когда вы путешествуете по дороге, вы не идете прямо между двумя точками.Вы делаете довольно много ходов.И чтобы «точно» определить расстояние между двумя точками, вы можете принять во внимание и эти повороты.

1 голос
/ 21 апреля 2011

Я нашел образец кода в следующей ссылке для расчета расстояния, проходящего через дороги.

http://code.google.com/p/krvarma-android-samples/source/browse/#svn/trunk/GPSSample%253Fstate%253Dclosed

0 голосов
/ 21 апреля 2011

Кажется, что расстояние через радиальные дороги больше, потому что поезда и грузовики движутся не по прямой, а на воздушном транспорте.

Вам нужна дорожная карта для точного вычисления расстояния

...