核心位置的准确性

Pet*_*nek 12 gps location objective-c core-location ios

我目前正在开发一个位置跟踪应用程序,我的CLLocationManager位置更新不准确.这导致我的应用程序跟踪距离,这实际上只是由不准确的GPS读数引起的.

位置读数不准确

我甚至可以在打开应用程序的情况下将iPhone放在桌面上,几分钟后我的应用就会因为这个漏洞而跟踪数百米的距离.

这是我的初始化代码:

- (void)initializeTracking {
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    self.locationManager.distanceFilter = 5;

    [self.locationManager startUpdatingLocation];
}
Run Code Online (Sandbox Code Playgroud)

提前致谢!:-)

pro*_*rmr 19

我在类似应用程序中解决此问题的方法之一是丢弃位置更新,其中距离变化略小于该位置更新中报告的水平精度.

给出a previousLocation,然后a newLocation,计算距离previousLocation.如果distance >= (horizontalAccuracy * 0.5)然后我们使用了那个位置,那个位置就变成了新的位置previousLocation.如果距离较小,则我们放弃该位置更新,不要更改previousLocation并等待下一个位置更新.

这对我们的目的很有用,你可能会尝试类似的东西.如果您仍然发现太多噪声更新,请增加0.5因子,也可以尝试0.66.

您可能还希望在刚开始获得修复时防范案例,在这些情况下,您会获得一系列似乎正在移动的位置更新,但实际上正在发生的是准确性正在显着提高.

我会避免开始任何位置跟踪或距离测量,水平精度> 70米.这些都是全球导航卫星系统的劣质位置,尽管这可能是你在城市峡谷,重型树冠或其他信号条件差的情况下得到的.


Max*_*r89 5

我用这种方法来检索所需的位置精度(在SWIFT中)

let TIMEOUT_INTERVAL = 3.0
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
    let newLocation = locations.last as! CLLocation
    println("didupdateLastLocation \(newLocation)")
    //The last location must not be capured more then 3 seconds ago
    if newLocation.timestamp.timeIntervalSinceNow > -3 &&
        newLocation.horizontalAccuracy > 0 {
            var distance = CLLocationDistance(DBL_MAX)
            if let location = self.lastLocation {
                distance = newLocation.distanceFromLocation(location)
            }
            if self.lastLocation == nil ||
                self.lastLocation!.horizontalAccuracy > newLocation.horizontalAccuracy {
                    self.lastLocation = newLocation
                    if newLocation.horizontalAccuracy <= self.locationManager.desiredAccuracy {
                        //Desired location Found
                        println("LOCATION FOUND")
                        self.stopLocationManager()
                    }
            } else if distance < 1 {
                let timerInterval = newLocation.timestamp.timeIntervalSinceDate(self.lastLocation!.timestamp)
                if timerInterval >= TIMEOUT_INTERVAL {
                    //Force Stop
                    stopLocationManager()
                }
            }
    }
Run Code Online (Sandbox Code Playgroud)

哪里:

if newLocation.timestamp.timeIntervalSinceNow > -3 &&
        newLocation.horizontalAccuracy > 0 {
Run Code Online (Sandbox Code Playgroud)

检索的最后一个位置不得超过3秒前捕获,最后一个位置必须具有有效的水平精度(如果小于1则表示它不是有效位置).

然后我们将使用默认值设置距离:

            var distance = CLLocationDistance(DBL_MAX)
Run Code Online (Sandbox Code Playgroud)

计算从检索到的最后一个位置到新位置的距离:

if let location = self.lastLocation {
                distance = newLocation.distanceFromLocation(location)
            }
Run Code Online (Sandbox Code Playgroud)

如果我们尚未设置我们的本地最后位置,或者新位置水平精确度比实际位置更好,那么我们将把我们的本地位置设置为新位置:

if self.lastLocation == nil ||
        self.lastLocation!.horizontalAccuracy > newLocation.horizontalAccuracy {
            self.lastLocation = newLocation
Run Code Online (Sandbox Code Playgroud)

下一步是检查位置的准确性是否足够好.为此,我们检查位置的水平距离是否检索到它,以免获得所需的准确度.如果是这种情况,我们可以阻止我们的经理:

if newLocation.horizontalAccuracy <= self.locationManager.desiredAccuracy {
                        //Desired location Found
                        self.stopLocationManager()
                    }
Run Code Online (Sandbox Code Playgroud)

最后if我们将检查距离最后一个位置的距离和新位置是否小于一个(这意味着两个位置非常接近).如果是这种情况,那么我们将从检索到的最后一个位置获取时间间隔并检索新位置,并检查间隔是否超过3秒.如果是这种情况,这意味着我们没有收到比我们当地位置更准确的位置超过3秒,因此我们可以停止位置服务:

else if distance < 1 {
                let timerInterval = newLocation.timestamp.timeIntervalSinceDate(self.lastLocation!.timestamp)
                if timerInterval >= TIMEOUT_INTERVAL {
                    //Force Stop
                    println("Stop location timeout")
                    stopLocationManager()
                }
            }
Run Code Online (Sandbox Code Playgroud)