【问题标题】:Why is my CLLocation speed so inaccurate?为什么我的 CLLocation 速度如此不准确?
【发布时间】:2009-07-24 20:39:56
【问题描述】:

我正在使用 iPhone SDK,我想在我的应用程序中显示当前速度。有很多应用程序可以做到这一点非常精确,特别是对于跑步或骑自行车等低速行驶。我见过的最好的是 RunKeeper。

但是,在我的应用程序中,速度绝对不准确。在低速时它总是为空,只有在高速时它才会显示一些值,但它们很少更新并且没有真正用处。

- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
       fromLocation:(CLLocation *)oldLocation {
    if (newLocation.timestamp > oldLocation.timestamp &&
        newLocation.verticalAccuracy > 0.0f &&                                  // GPS is active
        newLocation.horizontalAccuracy < 500.0f &&                                  // GPS is active
        //newLocation.horizontalAccuracy < kCLLocationAccuracyHundredMeters &&  // good quality GPS signal
        //newLocation.speed > 1.0f &&                                           // enough movment for accurate speed and course measurement
        oldLocation != nil)                                                     // oldLocation is nil on the first reading
    {
        double speed = (newLocation.speed * 3.6);
        [self updateDisplayWithSpeed:speed];
        //double direction = newLocation.course;
    }
}

有人有这方面的工作代码吗?或者你能告诉我我的有什么问题吗?

【问题讨论】:

    标签: iphone objective-c gps


    【解决方案1】:

    我会尝试以下方法。

    请记住,您应该根据您的场景需要设置 distanceFilter 和 desiredAccuracy:步行与开车等不同。此外,当您向 GPS 请求高精度时,您必须始终丢弃由 GPS 提供的第一个位置GPS 并使用第二个作为起始位置。引用 Apple 文档:

    您应该为该属性分配一个适合您的使用场景的值。换句话说,如果您只需要几公里内的当前位置,则不应为精度指定 kCLLocationAccuracyBest。以更高的精度确定位置需要更多的时间和更多的力量。 在请求高精度位置数据时,位置服务传递的初始事件可能没有您请求的精度。定位服务尽快提供初始事件。然后,它会继续按照您要求的准确度确定位置,并在数据可用时根据需要提供其他事件。

    这是我的建议。

    首先,使用 GPS 更新位置,间隔至少为一秒。在此间隔之下,速度值是无用的,因为它以每秒米为单位进行测量,并且由于前面的讨论,您不可能在不到一秒的时间内以高精度获得有效更新。

    其次,仅对位置坐标使用有意义的值:您应该丢弃具有负水平精度的值。这就是我所说的好位置。

    第三,您可以自己计算距离:使用 getDistanceFrom() 计算上一个好位置和上一个好位置之间的距离,然后除以位置更新之间经过的秒数。这将为您提供以米/秒为单位的距离。我会尝试这样做并将结果与​​ Apple 提供的速度进行比较。

    【讨论】:

    • 您有处理第一个问题的代码示例吗?或者这只是检查与前一个位置的时间戳?
    【解决方案2】:

    请在您的代码中尝试以下操作:

    speedLabel.text = [NSString stringWithFormat:@"SPEED(Km/Hr): %f", [location speed]*3.6];
    latitudeLabel.text = [NSString stringWithFormat:@"LATITUDE: %f", location.coordinate.latitude];
    longitudeLabel.text = [NSString stringWithFormat:@"LONGITUDE: %f", location.coordinate.longitude];
    CLLocationDistance meters = [location distanceFromLocation:orginalLoc];
    distanceLabel.text = [NSString stringWithFormat:@"DISTANCE(M): %f", meters];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-11
      • 2010-11-14
      • 1970-01-01
      • 2012-03-02
      • 1970-01-01
      • 1970-01-01
      • 2013-05-14
      • 2020-11-13
      相关资源
      最近更新 更多