- 無効場所結果(精度< 0)、
kCLLocationAccuracyBest
に設定された設定精度要件を除外
- 、キャッシュされた(古い)位置データをフィルタリング、
- 最小距離フィルタを設定し、好ましくは位置ノイズを除去するために少なくとも10メートル。
- EDIT:
oldLocation
がnilの場合、距離を計算しないでください。
これ以上のことがありますが、十分なhorizonalAccuracy(< 30m)があれば、これはうまくいくはずです。精度の低い結果を除外することはできますが、あなたはもう少し複雑なoldLocationを追跡しなければなりません。
NSLog(下記参照)を追加すると、何が起きているのかを知ることができます。あなたがまだ良い結果を得ていない場合は、NSLogの出力をポストするので、何が起こっているのかを知ることができます。あなたは(上記の方法は現在廃止されているので)didUpdateLocations:を使用して同じことをやってみたかった場合iOS6ため
-(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];
}
EDIT最も簡単な解決策は、次の更新にあなたが持っているように、単にプロパティにそれぞれの場所を保存することです前の場所。oldLocation
を保持するクラスのプロパティを宣言します。
@property (nonatomic, retain) CLLocation* oldLocation;
その後、デリゲートメソッドが呼び出される次回のためoldLocation
として使用するために、各newLocation
を保存デリゲートメソッドで:
-(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で始まります。ここでは、約2m先まで歩いた後の出力を示します。 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メートルのために、精度+/- 50メートル 2012-04-17 17:58:11.248 LocationManagerTest2 [422:707] 39.856165/- 74.940107〜39.856223/-74.940010 10m、精度+/- 50m distanceMovedが約15mに達しました - あまりにも多く – bnasty
私はこのコードを数回前に使ってみましたが、いくつかの一見正確な結果が得られました。 – bnasty
の距離が-1だったのは、あなたのoldLocationが0だった場所で、おそらくoldLocationのパラメータがnilだったことを意味します。そのためのチェックを追加する必要があります(上記の私の編集を参照してください)。あなたはhorizontalAccuracyが50mであると報告するとき、高い精度を期待できません!つまり、GPSには十分な信号がありません。これは、報告された位置がどの方向にも50メートル離れている可能性があることを意味します。 – progrmr