我已使用此方法检索所需的位置精度(在 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
下一步是检查检索到的位置的准确性是否足够好。为此,我们检查位置的水平距离是否检索到它,以免达到所需的准确度。如果是这种情况,我们可以阻止我们的经理:
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()
}
}