Android: distanceTo() неверные значения

Я пишу заявку для отслеживания моего маршрута. Я запрашиваю обновления от GPS каждую минуту, и он работает нормально. Это показывает мне мою точную точку зрения. Когда я хочу вычислить расстояние между текущей точкой и предыдущей, она работает нормально, но время от времени она вычисляет общее расстояние неверно (я переместился примерно на 200 м, и он вернул мне значение более 10 км). Кто-нибудь знает, почему это могло произойти?

Вот функция, которую я использую:

iRoute += myGPSLocation.distanceTo(prevLocation);

Заранее спасибо!

2 ответа

Прекратите использование функций Google Location.distancebetween & location.distanceto. Они не работают последовательно.

Вместо этого используйте прямую формулу для расчета расстояния:

double distance_between(Location l1, Location l2)
{
    //float results[] = new float[1];
    /* Doesn't work. returns inconsistent results
    Location.distanceBetween(
            l1.getLatitude(),
            l1.getLongitude(),
            l2.getLatitude(),
            l2.getLongitude(),
            results);
            */
    double lat1=l1.getLatitude();
    double lon1=l1.getLongitude();
    double lat2=l2.getLatitude();
    double lon2=l2.getLongitude();
    double R = 6371; // km
    double dLat = (lat2-lat1)*Math.PI/180;
    double dLon = (lon2-lon1)*Math.PI/180;
    lat1 = lat1*Math.PI/180;
    lat2 = lat2*Math.PI/180;

    double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
            Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2);
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    double d = R * c * 1000;

    log_write("dist betn "+
            d + " " +
            l1.getLatitude()+ " " +
            l1.getLongitude() + " " +
            l2.getLatitude() + " " +
            l2.getLongitude()
            );

    return d;
}

distanceTo() работает правильно.
Ошибка на вашей стороне, наиболее вероятная алгоритмическая, например, если нет доступного GPS-решения, и телефон занимает местоположение на основе соты GSM, это, конечно, может быть отключено на 1000 м.

Для вашего приложения, которое, вероятно, хочет подвести итог пройденного расстояния, используйте только GPS-исправления, не используйте другого LocationProvider, чем GPS!

Другие вопросы по тегам