我目前正在工作的位置跟踪应用程序,我有困难的不准确的位置更新从我的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];
}谢谢!-)
发布于 2014-07-21 23:33:08
我在类似的应用程序中解决这一问题的方法之一是,如果距离变化略低于在该位置更新中报告的水平精度,则丢弃位置更新。
给定一个previousLocation,然后对于一个newLocation,计算出与previousLocation的距离。如果那个distance >= (horizontalAccuracy * 0.5),那么我们使用那个位置,那个位置就成为我们的新previousLocation。如果距离小于我们放弃的位置更新,不要更改previousLocation并等待下一个位置更新。
对我们来说效果很好,你可以试试这样的方法。如果您仍然发现太多的更新是噪音,增加0.5因子,也许尝试0.66。
当你刚开始修复的时候,你也可能想要防范这样的情况,在那里你会得到一系列的位置更新,这些更新看起来是移动的,但真正发生的是,精确性正在显著提高。
我将避免开始任何位置跟踪或距离测量的水平精度> 70米。这些是全球导航卫星系统质量较差的位置,尽管在城市峡谷、浓密的树冠下或其他恶劣的信号条件下,这可能是你所得到的全部。
发布于 2015-05-28 19:27:16
我使用这种方法来获取所需位置的精确性(在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()
}
}
}其中:
if newLocation.timestamp.timeIntervalSinceNow > -3 &&
newLocation.horizontalAccuracy > 0 {检索到的最后一个位置不能超过3秒前捕获,最后一个位置必须具有有效的水平精度(如果小于1意味着它不是一个有效位置)。
然后,我们将用默认值设置一个距离:
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下一步是检查从位置检索到的准确性是否足够好。要做到这一点,我们检查位置的horizontalDistance是否检索到它,然后检查desiredAccurancy。如果是这样,我们可以阻止我们的经理:
if newLocation.horizontalAccuracy <= self.locationManager.desiredAccuracy {
//Desired location Found
self.stopLocationManager()
}对于最后一个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()
}
}发布于 2014-10-24 22:45:08
这一直是卫星位置的问题。这是一种估计,估计可能会有所不同。每一份新的报告都是一个新的估计。当没有运动时,你需要的是一个忽略值的位置夹子。
您可以尝试使用传感器来了解设备是否真的在移动。看看加速度计的数据,如果它没有变化,那么即使GPS说它在移动,设备也不会移动。当然,加速度计数据上也有噪音,所以你也要过滤掉它。
这是一个棘手的问题。
https://stackoverflow.com/questions/24867927
复制相似问题