2010-11-06 82 views
3

我开始混淆CLLocationManager,并试图使用下面的回调方法。我去了外面在我的iPhone上测试它,并且在前几次更新时,我似乎正在得到一些乱码值,就像突然间我的距离是39米,即使我没有移动到任何地方。或者有时它会从5开始,然后跳到20米,再次没有我移动到任何地方。我走出去走了,从最初的起点看起来更新似乎是'好',然后当我回到原点时,我回到了原来的39米的起点。我想知道我在下面做的是否正确。我还包含了我的viewDidLoad方法,用于初始化我的CLLocationManager对象。使用CLLocationManager获取精确的位置

有没有办法确保我的第一个值是准确的?提前致谢。

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    locationManager = [[CLLocationManager alloc] init]; 
    locationManager.delegate = self; 
    locationManager.distanceFilter = kCLDistanceFilterNone; 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
} 
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    if (startingPoint == nil) { 
     NSLog(@"NIL starting point"); 
     self.startingPoint = newLocation; 
    } 

    CLLocationDistance distance = [newLocation distanceFromLocation:startingPoint]; 
    NSString *distanceString = [[NSString alloc] initWithFormat:@"%g m", distance]; 
    distanceLabel.text = distanceString; 
    [distanceString release]; 

    numberOfUpdates++; 
    NSString *countString = [[NSString alloc] initWithFormat:@"%d", numberOfUpdates]; 
    countLabel.text = countString; 
    [countString release]; 
} 

回答

5

GPS是一项不完善的技术。大气条件,卫星可用性(和位置),天空能见度,附近物体(建筑物)反射的信号都会导致其固有的不准确性。虽然有一个“准确度”值(即通常是相当不错) - 即使这样也不完全可靠。

飞机不允许使用GPS进行精确测量 - 即使他们的接收器不够准确,而且他们需要其他技术(这有其自身的问题)。

尝试运行标准“地图”应用程序并将其用作比较。我认为你的代码很好 - 它只是GPS而已。

当然我是这么说的,因为我正在开发自己的海上导航应用程序,自己也遇到过所有这些问题。

2

在你didUpdate方法,你可以测试newLocation.horizontalAccuracy属性的可接受值和折腾那是不可能的任何值(甚至是不可能的!)。

3

虽然这是一个老问题,我仍然想回答。第一次调用“didUpdateToLocation”通常是一些旧值,你应该总是检查时间戳。从Apple文档:

NSDate* eventDate = newLocation.timestamp; 
NSTimeInterval howRecent = [eventDate timeIntervalSinceNow]; 
if (abs(howRecent) < 15.0) 
{ 
    // use the value 
}