iOS 核心位置 - 获取最准确的位置坐标

标签 ios objective-c cocoa-touch gps core-location

在我正在开发的应用程序中,我需要跟踪用户的旅程,然后将其映射到用户。在这种情况下,我需要尽可能准确的位置数据。

我创建了一个CLLocationManager为了这个任务。 为了恢复尽可能准确的位置,我将管理器所需的精度过滤器设置为 kCLLocationAccuracyBest. 为了确保当用户不移动时我不会获得额外的坐标,我将管理器的距离过滤器设置为 2.5 meters .

但是,我仍然觉得我可能会得到一些不准确的坐标,所以在我的 -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations 中在 delegate 方法中,我设置了一个过滤器,使用每个坐标的估计水平和垂直精度来确定是否应保留它,如果坐标满足条件,则将其存储为数组。

这是我的实现:

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
    for (CLLocation *loc in locations) {
         if (loc.horizontalAccuracy > -1 && loc.horizontalAccuracy <= 10 && loc.verticalAccuracy > -1 && loc.verticalAccuracy <= 30){
         [self.locationArray addObject:loc];
    }
}

大多数时候,这都非常有效。要求水平精度为 10 米,垂直精度为 30 米,这似乎是位置管理器可以始终如一地向我提供的最佳位置信息。它确保坐标准确地表示用户的旅程。然而,在我的测试中,有时位置经理无法满足这个标准。这会导致坐标点之间存在较大间隙。

此问题的一个可能解决方案是放宽过滤器的标准。然而,这是有问题的,因为当有更准确的点可用时,这会导致我保留不准确的点。

另一种可能的解决方案是收集一定时间间隔(例如 30 秒)的位置,然后遍历它们并找到最佳位置。然而,这样做的问题是,在我的应用程序中,用户可能会移动,而且可能会高速移动。用户的位置可能在 30 秒内发生显着变化。

我觉得有一种更优雅的方法来确保保存的坐标具有可用的最佳精度,但我对核心位置的了解有限,我似乎找不到更好的解决方案。

解决这个问题的最佳方法是什么?

最佳答案

您将需要提出自定义逻辑。您将需要权衡准确性、耗时和每单位时间行驶的距离(读数之间的平均速度)。

也许将所有位置读数保存在内存中,直到您决定如何处理它们。如果 30 秒的一批读数在距离上没有太大变化(并且距离变化小于准确度读数),则获取该 30 秒内的最佳读数。然而,如果位置变化很快,您可能需要保存每个读数,只丢弃精度非常糟糕的读数。 (如果用户的驾驶速度 >=100 KPH,您就没有时间挑剔准确性。)

附注您确定需要考虑垂直精度吗?我通常忽略垂直精度和垂直读数。我已经有几年没有进行过测试了,但是当我进行测试时,垂直精度读数和高度读数都很差。

关于iOS 核心位置 - 获取最准确的位置坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34111459/

相关文章:

iphone - 如何在基于 View 的应用程序中的所有 View 中获取不同的选项卡?

ios - 在内存限制下调整 UIImage 的大小

ios - 使用 Storyboard自定义 Parse PFLoginViewController 的布局?

ios - 在 loginView 中解析背景图像,不适合所有 iPhone 设备的屏幕尺寸

iphone - 如何使用 Cocoa (iPhone) 解码 XML 文档中的 shift-jis 编码数据

ios - 错误 : Initializers may only be declared within a type

iphone - iOS 中当年的天数

ios - PhoneGap iOS 应用程序图标

iOS:在滚动进/出 View 时更改图像位置

cocoa-touch - 如何调用电话、发送短信或在 map 上查找地址?