2013-08-22 2 views
0

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

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

iRoute += myGPSLocation.distanceTo(prevLocation); 

Спасибо заранее!

+0

Попробуйте outputing значения '' myGPSLocation' и prevLocation'. Если они кажутся разумными, и он все же дает странный ответ, это может быть точность измерений. – atomman

+0

Это не похоже, что это скажет вам расстояние до последней точки, а вместо этого суммирует общее пройденное расстояние. Можете ли вы показать больше кода, пожалуйста? –

ответ

0

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

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

+0

Ошибка, которую он описал, чаще всего возникает при использовании эмулятора, даже сегодня в 2016 году. Проблема исчезает на физическом устройстве. – bold

+0

@bold Это не имеет ничего общего с расстоянием до, которое просто математически вычисляет расстояние между двумя координатами lat, lon. Этот расчет всегда работает. Что может не работать (в эмуляторе) - значение lastValid location. Поэтому distancTo вызывается с неправильными входными данными. – AlexWien

+0

Я проверил значения в отладчике. Метод получает правильные значения (почти то же самое long long и dest lat long), но mResults выводит совершенно неправильные значения. Результат должен быть не более 10, но выводит что-то выше 350. – bold

1

Остановить использование местоположения google.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; 
} 
+0

уточните, что «не работает последовательно». Я предполагаю, что вы алгоритм довольно интенсивно вычислить и предполагает сферическую землю на уровне моря, которая представляет собой много багажа. – BernalKC

Смежные вопросы