私は、メートル単位で距離を計算し、さらに使用するために緯度経度を記録するこのウォーキング/ランニング アプリに取り組んでいます。距離を計算すると、毎回間違った距離が得られます。他のランニング アプリと比較したところ、通常、私の距離とは異なる距離が表示されます。
私が使用しているコードは次のとおりです。
#define kDesiredAccuracy 5.0f
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
self.locationManager.distanceFilter = kDesiredAccuracy;
_routes = [[NSMutableArray alloc] init];
lastKnownLocation = nil;
-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
// return if accuracy is less than 0 or is greater than desired accuracy.
if (newLocation.horizontalAccuracy < 0)
{
return;
}
if(newLocation.horizontalAccuracy > kDesiredAccuracy)
{
return;
}
NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow];
CLLocationSpeed speed = [newLocation speed];
// return if stale data or user is not moving
if (locationAge > 5.0 || speed <= 0) return;
//return if first location is found
if(lastKnownLocation == nil)
{
lastKnownLocation = newLocation;
return;
}
CLLocationDistance distance = [newLocation distanceFromLocation:(self.pramDistance > 0)?lastKnownLocation:oldLocation];
if(distance > 0)
{
// save distance for future use
NSMutableDictionary *dict=[[NSMutableDictionary alloc] init];
[dict setObject:[NSString stringWithFormat:@"%g", newLocation.coordinate.latitude] forKey:@"latitude"];
[dict setObject:[NSString stringWithFormat:@"%g", newLocation.coordinate.longitude] forKey:@"longtitude"];
[dict setObject:[NSString stringWithFormat:@"%f",distance] forKey:@"distance"];
[_routes addObject:dict];
// add distance to total distance.
self.pramDistance += distance;
}
}
ユーザーがウォーキング/ランニングを終了したら、マップ ビューでウォーキング/ランニングのルートを描画します。この目的のために、記録されたすべての場所を使用して MKMapView に策略線を引くだけです。
マップ ビューにルートのジグザグ線が表示され、距離が常に正しくありません。どこが間違っているのか、適切に機能させるには何を修正すればよいのか教えてください。
比較は次のとおりです(左が他のアプリで、右が私のアプリです):