2011-12-13 3 views
1

두 개의 GPS 위치 사이의 거리를 계산하고 싶습니다. 각 GPS 값은 기수 값과 경도 값으로 계산됩니다. 단거리 결과에 대해서는 계산이 정확해야합니다. 예. < 300m. Google 어스를 사용하는 경우 (코드에있는 coord 참조) 거리는 ~ 136m입니다. 제가 제공하는 솔루션을 사용하는 경우 : http://www.movable-type.co.uk/scripts/latlong.html (haversine 수식) 그 결과는 거의 없습니다.GPS 거리 계산

사용되는 코드 :

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; 
} 

나는 그것이 약간 변경해야 확신 해요,하지만 난 그것을 볼 수 없습니다.

+0

Google은 '안드로이드 GPS 거리'에 대해 많은 답변을 제공합니다. 예를 들면 다음과 같습니다. http://www.tutorials-android.com/learn/How_to_calculate_the_distance_between_two_GPS_coordinates.rhtml –

+0

당신은 300m 미만을 기대한다고 말했지만 그게 정확히 무엇입니까? 해당 페이지로 좌표를 넣거나 코드를 통해 실행하면 0.049km = 49m로 끝납니다. 문제가 Google 어스에 더 가까이있을 것으로 예상됩니까? – kabuko

+0

카 부코, 그게 내 문제 야. GoogleEarth는 더 현실적인 136m를 반환합니다. 나는 작은 편차가 <10m 만큼은 상관하지 않지만, 136과 49는 너무 큰 차이가 있습니다. –

답변

1

나는 그 페이지의 haversine 공식에도 문제가있었습니다. 귀하의 질문에 대한 답변이 정확하지는 않지만, Google 어스와 동일한 결과를 제공하는 코사인 공식의 법칙을 통해 더 많은 성공을 거두었습니다. 경우 그것은이처럼 보였다, 도움 :

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; 
} 

편집 : 나는 구글 맵스와 구글 어스에서 내 코드에서 좌표를 시도하고, 내가 그들 모두를 위해 49m를 얻고있다

. 어쩌면 문제가 없었던 것일까? screenshot

+0

스티브, 코드는 기본적으로 같은 49m를 반환합니다. 내가 사용했던 좌표로 테스트 할 수 있습니까? Google 어스가 잘못되었다고 상상할 수는 없습니다. –

+0

http://www.movable-type.co.uk/scripts/latlong.html에 좌표 값을 입력하면 계산이 정확합니다. 따라서 상부 기능과 현장의 이론적 기능 사이에는 약간의 차이점이 있어야합니다. –

+0

FWIW, 나는 또한 http://www.movable-type.co.uk/scripts/latlong.html에서 49m 결과를 얻고 있습니다. –

1

조금 늦었지만이 더 많은 옵션 애플 Corelocation (49.2733 미터)를 사용하여

  1. 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; 
} 

아마도 두 번째 방법 (수동 계산)을 선호합니다.