我是GPS新手并使用CoreLocation将用户的位置缩小到理想的2米。我已经读过iPhone GPS坐标精确到4米的地方,但我尝试了一些方法来提高读数的准确性。
我目前的解决方案
涉及设置一个70秒的窗口,以平均最多3个坐标的列表,并将它们替换为更新的更准确的读数。平均坐标在大约一分钟内跳跃,然后降落在~8米(观察到的)附近真实的位置。
选择以下代码块:
...
locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
locationManager.distanceFilter = kCLDistanceFilterNone
...
var timer = 70
func startTracking() {
var _ = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(countdown), userInfo: nil, repeats: true)
}
@objc func countdown() { self.timer -= 1 }
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
// 70 seconds to pin down verify location
if self.timer <= 1 {return}
if let oldLoc = locationDataService.initialLocationEstimate {
updateInitialLocation(newLocation: self.locationManager.location!)
}
}
...
updateInitialLocationEstimate() {
let newLocationAccuracy = newLocation.horizontalAccuracy
if self.initialLocationAccuracy != nil {
// don't use if greater than 12m and less accurate.
if newLocationAccuracy > self.initialLocationAccuracy! && newLocationAccuracy > 8 {
return
} else if newLocation.horizontalAccuracy < initialLocationAccuracy! {
// eliminates the less accurate readings
trimByAccuracy(locations: &self.initialLocationEstimates, newAccuracy: newLocationAccuracy)
self.initialLocationAccuracy = newLocationAccuracy
}
if (self.initialLocationEstimates.count > 4) {
initialLocationEstimates.removeFirst()
}
} else {
self.initialLocationAccuracy = newLocationAccuracy
}
self.initialLocationEstimates.append(newLocation)
self.initialLocationEstimate = estimateCentralCoordinate(locations: initialLocationEstimates, accuracy: initialLocationAccuracy!)
}
我在一些事情上挣扎:
1)获得> 4m(观察到的)准确度等级所需的时间的一半。目前,大约需要一分钟才能获得约8米的读数。我有什么可以做的吗?
2)提高观察到的准确性。任何建议在这里都会有所帮助。
3)有人建议我使用卡尔曼滤波器,但CoreLocation给我的速度是不确定的。当我静止不动时,它经常在+/- 0-1m / s之间波动,是否有一些我不知道的设置来稳定读数?
4)我应该进行平均/过滤吗?我已经读过好的GPS软件已经达到平均值,但我在iOS CoreLocation文档中没有看到任何内容。
真的,任何帮助都将不胜感激。谢谢。