Corelocation框架不会产生准确的距离

时间:2010-06-25 14:25:13

标签: iphone objective-c gps

我正在开发一个计算人员行进距离的应用程序。我在iPad(Device-3.2)上测试它。我的iPad正在使用WiFi来获取当前位置。即使我已经过滤了值,结果也非常不准确。我不知道GPS是否会给我准确的结果。我正在粘贴下面的整个代码。请验证代码,如有错误,请告诉我。如果有人在iPhone(3g)或iPad(3g)上测试代码,那将非常有用。如果不可能那么只需检查逻辑.....我也想计算燃烧的卡路里..有没有任何公式这样做..?我已经制作了简单的基于视图的项目.....并在nib文件中使用了距离标签来设置距离值,但是距离正以非常快的速度更新....请更正它。




    //  iPacometerViewController.h
    @interface iPacometerViewController : UIViewController {
    CLLocationManager *locationManager;
    CLLocation *oldLocat;
    CLLocation *newLocat;
    IBOutlet UILabel *distanceLabel;
    }

    @property(nonatomic,assign)IBOutlet UILabel *distanceLabel;
    @property(nonatomic,retain)CLLocationManager *locationManager;
    @property(nonatomic,retain)CLLocation *oldLocat;
    @property(nonatomic,retain)CLLocation *newLocat;

-(void)computeDistanceFrom:(CLLocation *)oldL tO:(CLLocation *)newL;

@end

//  iPacometerViewController.m

#import "iPacometerviewController.h"

@implementation iPacometerViewController

static double distance = 0.0;
@synthesize locationManager;
@synthesize oldLocat;
@synthesize newLocat;
@synthesize distanceLabel;


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
       [super viewDidLoad];

    //initializing location manager
    locationManager =[[CLLocationManager alloc]init];
    locationManager.delegate = self;
    locationManager.distanceFilter = 150.0f;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [locationManager startUpdatingLocation];
    oldLocat = [[CLLocation alloc]init];
    newLocat = [[CLLocation alloc]init];
}


- (void)locationManager:(CLLocationManager *)manager
                  didUpdateToLocation:(CLLocation *)newLocation
                  fromLocation:(CLLocation *)oldLocation
         {

    if (newLocation.horizontalAccuracy  60.0) return;   // data is too long ago, don't use it

    NSLog(@"oldd %@",oldLocation);
    self.oldLocat = oldLocation;
    self.newLocat = newLocation;
    if(oldLocat!=nil)
    {
    [self computeDistanceFrom:oldLocat tO:newLocat];
    }
}


-(void)computeDistanceFrom:(CLLocation *)oldL tO:(CLLocation *)newL
         {
    NSLog(@"oldd %@",oldL);
    NSLog(@"new %@",newL);

    CLLocationDistance currentDistance = [oldL distanceFromLocation:newL];
    NSLog(@"you have travel=%f",currentDistance);   
        distance = distance + currentDistance;
    double distanceInKm = distance/1000;
    NSString *distanceLabelValue = [NSString stringWithFormat:@"%1.2f Kms",distanceInKm];
    distanceLabel.text = distanceLabelValue;
}   

- (void)didReceiveMemoryWarning {
     // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];
     // Release any cached data, images, etc that aren't in use.
}



- (void)dealloc {
        //[mapView release];
    [oldloct release];
    [newLocat release];
    [locationManager release];
    [super dealloc];
}
@end

1 个答案:

答案 0 :(得分:0)

你的逻辑很好。它的iPhone逻辑很糟糕。

在编写此类代码时,我看到了两个主要问题。

1)我称之为中毒点。这些是iPhone错误报告的缓存点。您可以通过删除时间戳与最新点相同或早于最新点的任何点来检查它们。记录一个点的访问频率也可能是值得的。中毒点往往会一次又一次地(可能是5次)被访问,作为从真实轨道的跳跃。如果你能发现它们,你可以排除它们。

2)准确性 - 特别是高度变化。查看每个点返回的水平和垂直精度数字。看看高度。如果它们不准确,那么速度和因此行进的距离也将是如此。距离不好的一个原因是你的一对的一端有高度,而另一端则没有:“不”被归类为零 - 所以如果你在海拔200米的时候刚刚走了200米而没有移动!

为了提高准确性,你可能最好不要编写自己的大圆距离算法(或者考虑距离很小的简单毕达哥拉斯算法),它会忽略高度,或者只是对你使用的点进行更好的过滤。

我很难找到一种可靠的方法来测量位置,距离和距离。 iPhone(3GS)速度快。我想,iPad或Touch会变得更糟。

如果你能给我发一封邮件,我会发给你原始的iPhone日志记录软件。如果你可以运行几次旅行并让我得到结果会很好 - 我正在尝试解决同样的问题,但只能使用GPS数据集。