【问题标题】:CLLocationManager distanceFromLocation: returns -1CLLocationManager distanceFromLocation:返回 -1
【发布时间】:2011-03-12 12:36:32
【问题描述】:

我正在尝试在我的应用程序的最开始使用核心定位来获取初始位置。

我有委托方法:

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

    NSDate* eventDate = newLocation.timestamp;
    NSTimeInterval howRecent = [eventDate timeIntervalSinceNow];

    DLog(@"received location data from %f ago, lat/long - %+.6f, %+.6f\nold lat/long %+.6f, %+.6f\nhorizontal accuracy is %f", 
     howRecent, newLocation.coordinate.latitude, newLocation.coordinate.longitude, 
     oldLocation.coordinate.latitude, oldLocation.coordinate.longitude, 
     newLocation.horizontalAccuracy);

    // check if new update is significantly different from old one.  If it is, then reverse-geocode.
    if ([newLocation respondsToSelector:@selector(distanceFromLocation:)]) {
        DLog(@"distance from old to new location - %f", [newLocation distanceFromLocation:oldLocation]);
        if ([newLocation distanceFromLocation:oldLocation] < 1000) {
            // reverse geocode please
            [self stopLocationManager];
        }
    }

    else if ([newLocation respondsToSelector:@selector(getDistanceFrom:)]){
        DLog(@"distance from old to new location - %f", [newLocation getDistanceFrom:oldLocation]);
        if ([newLocation getDistanceFrom:oldLocation] < 1000) {
            // reverse geocode please
            [self stopLocationManager];
        }
    }
}

这是日志输出:

... -[AppHelper locationManager:didUpdateToLocation:fromLocation:] received location data from -13.261873 ago, lat/long - +37.705413, -121.866296
old lat/long +0.000000, +0.000000
horizontal accuracy is 1982.000000
... -[AppHelper locationManager:didUpdateToLocation:fromLocation:] distance from old to new location - -1.000000

知道为什么从新位置到旧位置 (0,0) 的初始距离计算会产生 -1 结果吗?

【问题讨论】:

    标签: iphone distance cllocationmanager


    【解决方案1】:

    似乎距离为-1,因为旧位置 (0,0) 无效。我会忽略第一个距离(-1)并等待下一个距离。

    对我来说,第一个位置不能有旧位置是完全合理的。

    【讨论】:

    • 错误具有误导性,因为 0,0 实际上是一个有效位置。我查看了 googlemaps,它位于非洲大陆的西部 :( 所以,我试图忽略纬度/经度是否等于 0 ,但是如果 (!(oldLocation.coordinate.latitude == 0.0 && oldLocation.coordinate.longitude == 0.0) 总是返回零,这不起作用哈哈。无论如何,当您调用 nil 对象的属性时似乎有问题。 . 我认为如果 oldlocation 实际上是 0,0 处的有效对象,则计算工作正常。
    • 是的,但是您似乎不太可能在纬度/经度 +0.000000、+0.000000 和纬度/经度之间移动 - +37.705413、-121.866296 之间没有任何更新,所以我仍然认为忽略第一个距离是要走的路。 :P
    • 如果你在一个 nil 对象上调用方法,它总是返回 0。
    • 是的,这不太可能,所以我同意你对 99.9% 情况的回答。不过,当我的代码始终正确时,我只是强迫症。感谢您的 cmets!
    • re:nil 对象上的方法返回 0 - 是的,这就是我所理解的,但这是奇怪的部分:oldLocation.coordinate.latitude == 0.0 返回 YES,而 oldLocation.coordinate.longitude == 0.0在单独的测试中也返回 YES.. 但如果我将它们放在一起,如 !(oldLocation.coordinate.latitude == 0.0 && oldLocation.coordinate.longitude == 0.0),这将返回 YES 而不是 NO
    【解决方案2】:

    天哪,我第二次回答我自己的问题.. 抱歉,我猜我调试得不够!

    所以这就是发生的事情 - 当第一次调用委托时,看起来 oldLocation 可以用 nil 调用。

    因此,distanceFromLocation: 使用 nil 参数调用,并返回 -1 作为某种错误代码。

    无论如何,我现在只是添加一个检查以查看 oldlocation 是否为 nil,并忽略第二个更新。

    如果 distanceFromLocation: 在使用 nil 参数而不是神秘的 -1 错误代码调用时实际上会触发某种断言,那就太好了! :D

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-05
      • 1970-01-01
      相关资源
      最近更新 更多