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米.这些都是全球导航卫星系统的劣质位置,尽管这可能是你在城市峡谷,重型树冠或其他信号条件差的情况下得到的.
我用这种方法来检索所需的位置精度(在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)
| 归档时间: |
|
| 查看次数: |
5811 次 |
| 最近记录: |