移动状态下到某个位置的距离

3

我正在编写一个应用程序,可以在用户移动时显示用户距离固定点的距离(即每次用户移动时更新显示用户到点之间的距离)。我使用CLLocationManager和以下代码:

- (void)viewDidLoad
{
    locationManager=[[CLLocationManager alloc]init]; 
    locationManager.distanceFilter = kCLDistanceFilterNone;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    [locationManager startUpdatingLocation];      
}

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation      *)newLocation fromLocation:(CLLocation *)oldLocation 
{   
    CLLocationDistance meters = [newLocation distanceFromLocation:fixedPoint];
    self.distanceLabel.text = [[NSString alloc] initWithFormat:@"Distance: %.1f feet", meters*3.2808399];
}

这个标签应该显示用户到某个点的距离,但它并没有持续地更新。即使它被更新了,它也通常不能正确地显示用户到固定点的距离。我想知道是否有更好的方法来尝试解决这个问题,或者核心位置框架的基本限制是否使得这种操作不可能。非常感谢您的任何帮助。


我会将这些位置(newLocation和oldLocation)写入日志,以便我可以检查值。这些值有没有可能不够精确,无法得到足够准确的英尺测量结果?此外,根据苹果公司的说法,iOS设备首先连接WiFi,然后是蜂窝塔,最后才是GPS卫星来确定用户的位置。这是因为WiFi连接速度比蜂窝塔快,而蜂窝塔连接GPS卫星也更快。如果按照这个顺序连接设备,设备会更加响应。这可能是你遇到问题的原因之一。 - RLH
这是你实际的代码吗?我没有看到locationManager的代理被设置(如果没有设置代理方法就不会被调用)。fixedPoint是如何设置的? - user467105
是的,我设置了代理并为测试目的初始化了任意坐标。我尝试了RLH建议的方法,但日志中捕获的点分散而且不够准确。我得到的印象是,我正在尝试做的可能超出了手机用于确定其当前位置的机制的限制。 - InsaneOstrich
顺便说一下,“最佳”精度设置实际上是kCLLocationAccuracyBestForNavigation,尽管它会消耗最多的电力。 - user467105
kCLLocationAccuracyBestForNavigation 只有在连接电源时才有效。另外,使用 NSString stringWithFormat 代替,那里存在(小)内存泄漏。 - Jacob Jennings
1个回答

4

您是否过滤旧(已缓存)位置?您还应该基于精度进行过滤,可能不需要低精度的位置。

您不会持续或定期更新,回调仅在位置更改时发生。

假设设备具有GPS并且可以看到足够的GPS卫星以获得良好的位置,则此方法运行良好。

-(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

    ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接