Расчет расстояния GPS - PullRequest
       29

Расчет расстояния GPS

1 голос
/ 13 декабря 2011

Я хочу рассчитать расстояние между двумя точками GPS, каждое из которых имеет значение широты и долготы.Расчеты должны быть точными для коротких результатов.например.<300м.Если я использую Google Планета Земля (см. Координаты в моем коде), расстояние составляет ~ 136 м.Если я использую решение, предоставленное статьей: <a href="http://www.movable-type.co.uk/scripts/latlong.html" rel="nofollow">http://www.movable -type.co.uk / scripts / latlong.html (формула haversine), результат будет ничем похожим.

используемый код:

public void GpsCalc(){
    double d = getDistance(51.342299,4.371359, 51.342490,4.371997); 
    Log.e("GpsCalc", String.valueOf(d));
}

public static double getDistance(double lat1, double lng1, double lat2, double lng2){
    double R = 6371; // earth’s radius (mean radius = 6,371km)
    double dLat =  Math.toRadians(lat2-lat1);

    double dLon =  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(dLon/2) * Math.sin(dLon/2); 
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    double dr1 = R * c;//in radians      

    Log.e("getDistance-dr1", String.valueOf(dr1));

    return dr1;
}

Я уверен, что должны быть небольшие изменения, но я не вижу этого.

Ответы [ 2 ]

1 голос
/ 04 декабря 2012

Немного поздно, но есть еще два варианта

  1. Использование Apple Corelocation (49,2733 метра)

    CLLocation *currentLocation = [[CLLocation alloc] initWithLatitude:_posGPSCurrent.latitude longitude:_posGPSCurrent.longitude];
    
    CLLocation *location = [[CLLocation alloc] initWithLatitude:_posGPSTarget.latitude longitude:_posGPSTarget.longitude];
    
    // in kilometers
    CLLocationDistance distance =[currentLocation distanceFromLocation:location]/1000;
    
  2. Ручной расчет (49,1393 метра)

Включить библиотеку математики

#include <math.h>

// distance in Kilometers (Haversine)

-(double)distanceFromGPSlat1:(double)tlat1 lon2:(double)tlon1 lat2:(double)tlat2 lon2:(double)tlon2
{
double distance = ((acos(sin(tlat1*M_PI/180)*sin(tlat2*M_PI/180)+cos(tlat1*M_PI/180)*cos(tlat2*M_PI/180)*cos((tlon1-tlon2)*M_PI/180))*180/M_PI)*60*1.1515*1.609344);

return distance;
}

Возможно, я предпочитаю второй метод (ручной расчет).

1 голос
/ 13 декабря 2011

У меня также были проблемы с формулой haversine на этой странице.Я знаю, что это не совсем ответ на ваш вопрос, но я добился большего успеха с формулой закона косинусов, которая дает те же результаты, что и Google Earth.В случае, если это помогает, это выглядело так:

public double getDistance(double lat1, double lon1, double lat2, double lon2) {
    double latA = Math.toRadians(lat1);
    double lonA = Math.toRadians(lon1);
    double latB = Math.toRadians(lat2);
    double lonB = Math.toRadians(lon2);
    double cosAng = (Math.cos(latA) * Math.cos(latB) * Math.cos(lonB-lonA)) +
                    (Math.sin(latA) * Math.sin(latB));
    double ang = Math.acos(cosAng);
    double dist = ang * EARTH_RADIUS;
    return dist;
}

РЕДАКТИРОВАТЬ:

Я попробовал ваши координаты в Google Maps и Google Earth и в моем коде, и яЯ получаю 49 м для всех из них.Может быть, никогда не было проблем?screenshot

...