- 篩選出緩存(舊)的位置數據,
- 篩選出無效的位置結果(精度< 0),
- 集精度要求設置爲
kCLLocationAccuracyBest
,
- 設置的最小距離過濾器,優選在至少10米以過濾位置噪音。
- 編輯:當
oldLocation
爲零時,不計算距離。
還有更多你可以做,但這應該工作,只要你得到足夠好的horizonalAccuracy(< 30米)。您可以過濾掉低精度的結果,但是您必須自己跟蹤一下這個更復雜一點的oldLocation。
添加NSLog(見下文),以便了解發生了什麼。如果你仍然沒有得到好的結果發佈的NSLog的輸出,所以我們可以看到發生了什麼,並幫助更多。
-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
NSTimeInterval age = -[newLocation.timestamp timeIntervalSinceNow];
if (age > 120) return; // ignore old (cached) updates
if (newLocation.horizontalAccuracy < 0) return; // ignore invalid udpates
// EDIT: need a valid oldLocation to be able to compute distance
if (oldLocation == nil || oldLocation.horizontalAccuracy < 0) return;
CLLocationDistance distance = [newLocation distanceFromLocation: oldLocation];
NSLog(@"%6.6f/%6.6f to %6.6f/%6.6f for %2.0fm, accuracy +/-%2.0fm",
oldLocation.coordinate.latitude,
oldLocation.coordinate.longitude,
newLocation.coordinate.latitude,
newLocation.coordinate.longitude,
distance,
newLocation.horizontalAccuracy);
distanceMoved += distance;
theLabel.text = [NSString stringWithFormat: @"%f meters", distanceMoved];
}
- (void)viewDidLoad
{
locMan = [[CLLocationManager alloc] init];
locMan.delegate = self;
locMan.desiredAccuracy = kCLLocationAccuracyBest;
locMan.distanceFilter = 10;
[locMan startUpdatingLocation];
isInitial = true;
distanceMoved = 0.0;
[super viewDidLoad];
}
編輯iOS6的,如果你想要做的使用didUpdateLocations:(因爲上面的方法現在已經過時)最簡單的辦法是簡單地在屬性保存每個位置,這樣你有下一次更新相同以前的位置。聲明一個屬性的類來保存oldLocation
:
@property (nonatomic, retain) CLLocation* oldLocation;
然後在委託方法您將每個newLocation
用作oldLocation
下一次委託方法被稱爲:
-(void)locationManager:(CLLocationManager *)manager didUpdateToLocations:(NSArray *)locations
{
CLLocation* newLocation = [locations lastObject];
NSTimeInterval age = -[newLocation.timestamp timeIntervalSinceNow];
if (age > 120) return; // ignore old (cached) updates
if (newLocation.horizontalAccuracy < 0) return; // ignore invalid udpates
// EDIT: need a valid oldLocation to be able to compute distance
if (self.oldLocation == nil || self.oldLocation.horizontalAccuracy < 0) {
self.oldLocation = newLocation;
return;
}
CLLocationDistance distance = [newLocation distanceFromLocation: self.oldLocation];
NSLog(@"%6.6f/%6.6f to %6.6f/%6.6f for %2.0fm, accuracy +/-%2.0fm",
self.oldLocation.coordinate.latitude,
self.oldLocation.coordinate.longitude,
newLocation.coordinate.latitude,
newLocation.coordinate.longitude,
distance,
newLocation.horizontalAccuracy);
distanceMoved += distance;
theLabel.text = [NSString stringWithFormat: @"%f meters", distanceMoved];
self.oldLocation = newLocation; // save newLocation for next time
}
我剛剛使用了這個確切的代碼,但我將距離過濾器更改爲1.出於某種原因,我的距離從-1開始。這裏是我的輸出行走後大約2米前進: 2012-04-17 17:58:05.341 LocationManagerTest2 [422:707] 0.000000/0.000000至39.856110/-74.940113 -1m,精度+/- 10m 2012-04 -17 17:58:10.248 LocationManagerTest2 [422:707] 39.856110/-74.940113到39.856165/-74.940107爲6米,準確度+/- 50m 2012-04-17 17:58:11.248 LocationManagerTest2 [422:707] 39.856165/- 74.940107到39.856223/-74.940010爲10米,準確度爲+/- 50m 距離移動到了15米左右 - 太多了 – bnasty 2012-04-17 22:00:37
我之前也試過使用這段代碼,並且我得到了一些看似準確的結果,遠離 – bnasty 2012-04-17 22:05:10
-1距離是您oldLocation爲0的位置,這可能意味着oldLocation參數爲零。您還需要添加一個支票(請參閱上面的編輯)。報告水平時準確度不高,準確度爲50m!這意味着GPS沒有足夠好的信號,這意味着報告的位置可以向任何方向偏離50米。 – progrmr 2012-04-18 01:31:12