- キャッシュされた(古い)位置データを除外し、
- 無効な場所の結果(精度<0)を除外し、
- 精度要件をに設定します
kCLLocationAccuracyBest
。
- 位置ノイズを除去するために、最小距離フィルター、できれば少なくとも10メートルを設定します。
- 編集
oldLocation
:がnilの場合、距離を計算しないでください。
できることは他にもありますが、十分なhorizonalAccuracy(<30m)が得られれば、これは機能するはずです。精度の低い結果を除外することもできますが、その場合は、もう少し複雑な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];
}
didUpdateLocationsを使用して同じことをしたい場合は、iOS6用に編集してください:(上記のメソッドは非推奨になっているため)最も簡単な解決策は、プロパティ内の各場所を保存して、次の更新時に前の場所を取得することです。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
}