- Lọc ra cache (cũ) dữ liệu vị trí,
- Lọc ra kết quả vị trí không hợp lệ (chính xác < 0),
- Set yêu cầu độ chính xác thiết lập để
kCLLocationAccuracyBest
,
- Đặt một bộ lọc khoảng cách tối thiểu, tốt nhất ít nhất 10 mét để lọc ra tiếng ồn vị trí.
- EDIT: Không tính khoảng cách khi
oldLocation
là không.
Bạn có thể làm được nhiều việc hơn nhưng điều này sẽ hoạt động với điều kiện bạn có được độ chính xác đủ caoAccuracy (< 30m). Bạn có thể lọc ra kết quả chính xác thấp nhưng sau đó bạn phải theo dõi các oldLocation mình là một chút phức tạp hơn.
Thêm NSLog (xem bên dưới) để bạn có thể tìm hiểu điều gì đang xảy ra. Nếu bạn vẫn không nhận được kết quả tốt, hãy đăng đầu ra của NSLog để chúng ta có thể thấy những gì đang diễn ra và giúp đỡ nhiều hơn.
-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
NSTimeInterval age = -[newLocation.timestamp timeIntervalSinceNow];
if (age > 120) return; // ignore old (cached) updates
if (newLocation.horizontalAccuracy < 0) return; // ignore invalid udpates
// EDIT: need a valid oldLocation to be able to compute distance
if (oldLocation == nil || oldLocation.horizontalAccuracy < 0) return;
CLLocationDistance distance = [newLocation distanceFromLocation: oldLocation];
NSLog(@"%6.6f/%6.6f to %6.6f/%6.6f for %2.0fm, accuracy +/-%2.0fm",
oldLocation.coordinate.latitude,
oldLocation.coordinate.longitude,
newLocation.coordinate.latitude,
newLocation.coordinate.longitude,
distance,
newLocation.horizontalAccuracy);
distanceMoved += distance;
theLabel.text = [NSString stringWithFormat: @"%f meters", distanceMoved];
}
- (void)viewDidLoad
{
locMan = [[CLLocationManager alloc] init];
locMan.delegate = self;
locMan.desiredAccuracy = kCLLocationAccuracyBest;
locMan.distanceFilter = 10;
[locMan startUpdatingLocation];
isInitial = true;
distanceMoved = 0.0;
[super viewDidLoad];
}
EDIT cho iOS6 nếu bạn muốn làm điều tương tự sử dụng didUpdateLocations: (kể từ khi các phương pháp trên hiện đang bị phản đối) là giải pháp đơn giản nhất là chỉ cần lưu mỗi vị trí trong một tài sản để trên bản cập nhật tiếp theo bạn có vị trí trước đó.Khai báo một tài sản trong lớp để giữ oldLocation
:
@property (nonatomic, retain) CLLocation* oldLocation;
Sau đó, trong phương pháp đại biểu giúp bạn tiết kiệm mỗi newLocation
để sử dụng làm oldLocation
cho lần tiếp theo phương pháp đại biểu được gọi là:
-(void)locationManager:(CLLocationManager *)manager didUpdateToLocations:(NSArray *)locations
{
CLLocation* newLocation = [locations lastObject];
NSTimeInterval age = -[newLocation.timestamp timeIntervalSinceNow];
if (age > 120) return; // ignore old (cached) updates
if (newLocation.horizontalAccuracy < 0) return; // ignore invalid udpates
// EDIT: need a valid oldLocation to be able to compute distance
if (self.oldLocation == nil || self.oldLocation.horizontalAccuracy < 0) {
self.oldLocation = newLocation;
return;
}
CLLocationDistance distance = [newLocation distanceFromLocation: self.oldLocation];
NSLog(@"%6.6f/%6.6f to %6.6f/%6.6f for %2.0fm, accuracy +/-%2.0fm",
self.oldLocation.coordinate.latitude,
self.oldLocation.coordinate.longitude,
newLocation.coordinate.latitude,
newLocation.coordinate.longitude,
distance,
newLocation.horizontalAccuracy);
distanceMoved += distance;
theLabel.text = [NSString stringWithFormat: @"%f meters", distanceMoved];
self.oldLocation = newLocation; // save newLocation for next time
}
Tôi chỉ sử dụng mã chính xác này, nhưng tôi đã thay đổi bộ lọc khoảng cách thành 1. Đối với một số lý do, khoảng cách của tôi đã bắt đầu ở -1. Đây là kết quả của tôi sau khi đi bộ khoảng 2m về phía trước: 2012-04-17 17: 58: 05.341 Vị tríManagerTest2 [422: 707] 0.000000/0.000000 đến 39.856110/-74.940113 cho -1m, độ chính xác +/- 10m 2012-04 -17 17: 58: 10.248 Vị tríManagerTest2 [422: 707] 39.856110/-74.940113 đến 39.856165/-74.940107 trong 6m, độ chính xác +/- 50m 2012-04-17 17: 58: 11.248 LocationManagerTest2 [422: 707] 39.856165/- 74.940107 đến 39.856223/-74.940010 cho 10m, độ chính xác +/- 50m Khoảng cáchMoved xuất hiện khoảng 15m - cách quá nhiều – bnasty
Tôi đã thử sử dụng mã này vài lần trước đây, và tôi nhận được một số kết quả dường như chính xác và một số đã xa – bnasty
khoảng cách -1 là nơi oldLocation của bạn là 0, có thể có nghĩa là thông số oldLocation là không. Bạn sẽ cần phải thêm một kiểm tra cho rằng quá (xem chỉnh sửa của tôi ở trên). Bạn không thể mong đợi độ chính xác cao khi báo cáo horizontalAccuracy là 50m !!! Điều đó có nghĩa là GPS không có tín hiệu đủ tốt, điều đó có nghĩa là vị trí được báo cáo có thể giảm đi 50 mét theo bất kỳ hướng nào. – progrmr