2011-11-01 3 views
3

평균 속도를 계산하기 위해 내 속도와 거리를 얻으려면 CoreLocation 프레임 워크를 사용하고 있습니다.CoreLocation 음수 값

CoreLocation이 보내는 첫 번째 업데이트에서 속도와 이동 거리 모두 음수 값을 표시합니다. 이 문제를 어떻게 해결할 수 있습니까?

속도는 locationController.locationManager.location.speed입니다. 여기에서 locationController은 내 CoreLocation 대리인을 보유하고 있습니다. 거리는 이전 위치와 새 위치 및 거리 계산을 통해 계산됩니다. CLLocationManager Class Reference에 메모있다

//Distance 
- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
      fromLocation:(CLLocation *)oldLocation 
{ 
    // make sure the old and new coordinates are different 
    if ((oldLocation.coordinate.latitude != newLocation.coordinate.latitude) && 
     (oldLocation.coordinate.longitude != newLocation.coordinate.longitude)) 
    {   
     mDistance = [newLocation distanceFromLocation:oldLocation]; 
    } 
} 

답변

5

코어 위치에 의해 반환 된 데이터는 여러 가지 이유로 유효하지 않을 수 있습니다. 데이터를 사용하기 전에이 메소드를 실행하여 유효한지 확인하십시오.

// From http://troybrant.net/blog/2010/02/detecting-bad-corelocation-data/ 
- (BOOL)isValidLocation:(CLLocation *)newLocation 
     withOldLocation:(CLLocation *)oldLocation 
{ 
    // filter out nil locations 
    if (!newLocation){ 
     return NO; 
    } 
    // filter out points by invalid accuracy 
    if (newLocation.horizontalAccuracy < 0){ 
     return NO; 
    } 
    // filter out points that are out of order 
    NSTimeInterval secondsSinceLastPoint = [newLocation.timestamp 
              timeIntervalSinceDate:oldLocation.timestamp]; 
    if (secondsSinceLastPoint < 0){ 
     return NO; 
    } 
    // filter out points created before the manager was initialized 
    NSTimeInterval secondsSinceManagerStarted = [newLocation.timestamp 
               timeIntervalSinceDate:locationManagerStartDate]; 
    if (secondsSinceManagerStarted < 0){ 
     return NO; 
    } 
    // newLocation is good to use 
    return YES; 
} 
+0

이 잘 작동하지만, 나는 또한 부정적인 거리를 방지하기 위해 뭔가를 추가했다 :'경우 ([를 newLocation distanceFromLocation : oldLocation] <0) { 반환 NO; }' – Baub

+0

죄송합니다. 내 발췌 문장 앱에서 가져 와서 URL이 없습니다. 답변이 업데이트되었습니다. – Jano

2

:

가 초기 위치를 반환하는 데 몇 초가 걸릴 수 있기 때문에이 위치 관리자는 일반적으로 다음 즉시 이전에 캐시 위치 데이터를 제공하며 더 많은 것을 제공 그대로 - 사용 가능한 위치 데이터를 가져옵니다. 따라서 작업을 수행하기 전에 위치 개체의 타임 스탬프를 확인하는 것이 좋습니다.

캐싱 된 값이 있는지 여부를 확인하고 무시한 다음 첫 번째 "실제"업데이트를 기다려야합니다.

NSTimeInterval timeSinceLastUpdate = [[newLocation timestamp] timeIntervalSinceNow]; 

// If the information is older than a minute, or two minutes, or whatever 
// you want based on expected average speed and desired accuracy, 
// don't use it. 
if(timeSinceLastUpdate < -60){ 
    return; 
} 
0

첫 번째 지점을 수집하는 경우에는 속도 나 거리를 계산할 참조가 없습니다. 내가 필요한 것을 얻을 수 없다면 -1을 반환하도록 정의되어 있다고 생각합니다.

이 문제를 해결하려면 음수 값을 확인하십시오.

if(location.speed > 0) { 
    return; 
}